2010年3月25日 星期四

字型


今天發現在linux中也有字型的編輯軟體fontforge這個軟體是圖型化界面而且我發現它很像什麼都能開,也支援文字庫中就直接cut & paste,我也用這個軟體開過pcf和ttf與fon....等都支援也可以開。
這個 bdf 就可以使用 bdftopcf 來轉換成 pcf 檔,然後經過 gzip 的壓縮就可以拿來使用了。

2010年3月14日 星期日

nano-X使用qwfb

qwfb是QT的virtual framebuffer也就是 framebuffer防真器,所以有些特性會跟framebuffer一樣。

先讓我們來看看他的用法吧!
1.若要使用它,那就要先知道他的溝通界面,那就參考下面吧!

struct QVFbHeader
{
int width; //宽度
int height; //高度
int depth; //色深
int linestep; //每一行的字节数 pitch
int dataoffset; //图像数据在共享内存中的偏移
int update[4]; //要更新的区域 x,y,w,h
char dirty; //是否更新,把它设为1,qvfb就会把update指定的区域显示到屏幕上
int numcols;//颜色数
unsigned int clut[256];//颜色索引
};

int main(const int argc,const char *argv[])
{
int key = ftok("/tmp/.qtvfb_mouse-0", 'b');
int shmid = shmget(key, 0, 0);
if (shmid !=-1)
{
struct QVFbHeader* qvfb_data = shmat(shmid, 0, 0);
if (qvfb_data != NULL)
{
int i,j;
char *ptr;
printf("width:%d\n",qvfb_data->width);
printf("height:%d\n",qvfb_data->height);
printf("depth:%d\n",qvfb_data->depth);
printf("linestep:%d\n",qvfb_data->linestep);
printf("dataoffset:%d\n",qvfb_data->dataoffset);
printf("update[0]:%d\n",qvfb_data->update[0]);
printf("update[1]:%d\n",qvfb_data->update[1]);
printf("update[2]:%d\n",qvfb_data->update[2]);
printf("update[3]:%d\n",qvfb_data->update[3]);
printf("dirty:%d\n",qvfb_data->dirty);
printf("numcols:%d\n",qvfb_data->numcols);
for(i=0;iheight;i++)
{
ptr = (char*)qvfb_data + qvfb_data->dataoffset+////qvfb_data->linestep*i;
for(j=0;jwidth;j++)
{
*ptr =0x00;//bule
ptr++;
*ptr = 0xff;//
ptr++;
*ptr = 0x00;//red
ptr++;
*ptr = 0x00;
ptr++;
}
}
}
//設定要更新的區域
qvfb_data->update[0]=0;
qvfb_data->update[1]=0;
qvfb_data->update[2]=qvfb_data->width;
qvfb_data->update[3]=qvfb_data->height;
qvfb_data->dirty=1; //更新畫面吧
}
printf("hello\n");
return 0;
}

2.因為要使nano-X 支援qwfb所以要修改一下,下面的檔案
src/driver/scr_fb.c
修改static PSD fb_open(PSD psd)成下列


typedef struct QVFbHeader
{
int width; //宽度
int height; //高度
int depth; //色深
int linestep; //每一行的字节数
int dataoffset; //图像数据在共享内存中的偏移
int update[4]; //要更新的区域
char dirty; //是否更新,把它设为1,qvfb就会把update指定的区域显示到屏幕上
int numcols; //颜色数
unsigned int clut[256]; //颜色索引
};

void flashdraw()
{
qvfb_data->update[0]=0;qvfb_data->update[1]=0;qvfb_data->update[2]=qvfb_data->width;qvfb_data->update[3]=qvfb_data->height;
qvfb_data->dirty=1;
}


/* init framebuffer*/
static PSD
fb_open(PSD psd)
{
char * env;
int type, visual;
PSUBDRIVER subdriver;

int key = ftok("/tmp/.qtvfb_mouse-0", 'b');
int shmid = shmget(key, 0, 0);
qvfb_data = (struct QVFbHeader *)shmat(shmid, 0, 0);
if (qvfb_data == NULL)
{
EPRINTF("2Error opening %s: %m", env);
return NULL;
}
psd->xres = psd->xvirtres = qvfb_data->width;
psd->yres = psd->yvirtres = qvfb_data->height;
psd->planes = 1;
psd->bpp = qvfb_data->depth;
psd->ncolors = (psd->bpp >= 24)? (1 <<>bpp);
psd->linelen = qvfb_data->linestep;
psd->size = 0;

psd->flags = PSF_SCREEN | PSF_HAVEBLIT;
psd->pixtype = MWPF_TRUECOLOR0888;

/* select a framebuffer subdriver based on planes and bpp*/
subdriver = select_fb_subdriver(psd);
if (!subdriver) {
EPRINTF("No driver for screen type %d visual %d bpp %d\n",
type, visual, psd->bpp);
goto fail;
}

/*
* set and initialize subdriver into screen driver
* psd->size is calculated by subdriver init
*/
if(!set_subdriver(psd, subdriver, TRUE)) {
EPRINTF("Driver initialize failed type %d visual %d bpp %d\n",
type, visual, psd->bpp);
goto fail;
}

/* remember original subdriver for portrait mode switching*/
pdrivers[0] = psd->orgsubdriver = subdriver;

/* mmap framebuffer into this address space*/
psd->size = (psd->size + getpagesize () - 1)
/ getpagesize () * getpagesize ();
psd->addr = (char*)qvfb_data + qvfb_data->dataoffset;

/* save original palette*/

/* setup direct color palette if required (ATI cards)*/
if(visual == FB_VISUAL_DIRECTCOLOR)
set_directcolor_palette(psd);

status = 2;
return psd; /* success*/

fail:
//close(fb);
return NULL;
}


3.改更了軟體為什麼qwfb上的東西為什麼不會自動更新呢?
因為它一定要改qvfb_data->dirty=1;才會真的畫出圖來。
因為我是選用RGB32模式的,所以我要修改fbline32.c的程式來讓他作更新,
因為發現檔案中每個畫面的function都會叫用DRAWOFF的marco,所以就好好的利用它一下吧!
#undef DRAWOFF
#define DRAWOFF flashdraw()

讓他執行到DRAWOFF時就去更新qwfb的畫面吧!





完工

2010年3月12日 星期五

移植任天堂FCEU來nano-X

今天嘗式porting fceu到nano-X上,
nano-X + SDL +FCEU
雖然complier都過了!但是在執行!
一執行就馬上當了!
後來測式nano-X+SDL+SDL中的test發現情況也是一樣
所以結論應該是nano-X和SDL在配合上的問題!
等下次有時間再研究吧!

我家的小虎妹妹們

大年初三出來,想忘記她們的生日都很難,過年收紅包慶生又過節,
這是我們家的兩支小老虎妹妹們,長的非常的愛,看起來手長腳長,
將來一定會是兩個大美女,大大的眼睛,尖尖的鼻子!
讓你們看看他自兩個吧!




2010年3月9日 星期二

ffmpeg-0.5 組合語言最佳化的方法

這幾天一直在編譯ffmpeg-0.5.1本來使用disable-asm的選項,但是在ARM上執行起來感覺

實在是太慢了!嘗試去編組合語言版本,但是因為錯誤實在太多而且,對ARM的組合語言

突然發現了下面的文章,真是我的救星,讓我明天試試他的效能吧!哈


這裡有修改一些檔案,因為在make的時候會發生一些asm指令找不到的問題。

diff -r ffmpeg-0.5/libavcodec/arm/asm.S ffmpeg_modify-0.5/libavcodec/arm/asm.S
24c24
< .eabi_attribute 24, \val
---
> @.eabi_attribute 24, \val
28c28
< .eabi_attribute 25, \val
---
> @.eabi_attribute 25, \val

diff -r ffmpeg-0.5/libavcodec/arm/dsputil_arm_s.S ffmpeg_modify-0.5/libavcodec/arm/dsputil_arm_s.S
641c641
< push {r4-r10}
---
> stmfd sp!, {r4-r10} @ push {r4-r10}
724c724
< pop {r4-r10}
---
> ldmfd sp!, {r4-r10} @ pop {r4-r10}

diff -r ffmpeg-0.5/libavcodec/arm/mpegvideo_armv5te_s.S ffmpeg_modify-0.5/libavcodec/arm/mpegvideo_armv5te_s.S
39c39
< push {r4-r9,lr}
---
> stmfd sp!, {r4-r9,lr} @ push {r4-r9,lr}
102c102
< pople {r4-r9,pc}
---
> ldmlefd sp!, {r4-r9,pc} @ pople {r4-r9,pc}
116c116
< pop {r4-r9,pc}
---
> ldmfd sp!, {r4-r9,pc} @ pop {r4-r9,pc}

原文出自於:http://deliondan.pixnet.net/blog/post/24474176

2010年3月8日 星期一

CVS手記

如何設定CVS

第一步,設定CVS的環境,CVSROOT之路徑 。

A.使用 pserver來存取 export CVSROOT=:pserver:userid@ipxxx.xxx..xxx:/home/userid

如果是在自已的主機上就可以直接設定成 export CVSROOT=/home/cvspath

B.建資料庫 (因資料目前/home/huntcvs資料庫已經建好,所以不用使用)

cvs init

C.建立模組

cvs import –m “建模組時之文件訊息” modulename winging_lu start

-m “XXX” :建立模組之訊息

modulename : 模組名稱

winging_lu : 建立人名稱

D.由資料庫取出模組

cvs co [-r tagname ] [-D date ]HDR-04DE

-r tagname:下載指定版本的程式內容

-D data:指令日期

E.模組放入資料庫

cvs ci

F.製作版本標籤

cvs tag V1_01_bata .

G.新增一個檔案或資料夾

cvs add file.c file.h ….

H.移除一個檔案或資料夾

cvs remove file.c file.h …

I.多人共同開發時,別人有新的ci時,更新自己的版本,同步資料庫版本。

cvs update

-P 刪除空資料夾。

-C 用資料庫資料覆寫本地資料。

-d 建立資料夾,如co功能

-f 如果沒找到標籤,強迫使用前一個版本.

-l 更新本地資料夾,不包括子目錄.

-R 更新資料夾包括子目錄.

-r rev 使用特定之版本(標籤)更新

-D date 使用特定日期資料更新.

-j rev 合並特定版本與目前版本.

CVS版本之訊息。

cvs login:簽入CVS
cvs status :看目前repository裡面有那些檔,檔案版本等等資訊 -l只看local
cvs diff:看兩個版本的差異
cvs log :看一下log歷史紀錄
cvs logout:簽離CVS
K.匯出CVS檔案,不包括CVS資料夾
    cvs –q export -d 資料夾 專案名稱

CVS版本之訊息。

請入進網頁:

http://IP/cgi-bin/cvsweb.cgi/

nano-x + SDL+ffmpeg 使用ARM

使用Arm EVB實作

1.設定SDL-1.2.14
#./configure --disable-video-x11 --disable-oss --disable-video-fbcon --prefix=/home/winging_lu/ffmpeg-0.5.1/libSDL/ --host=arm-linux --disable-cdrom --disable-pulseaudio --disable-esd-shared --disable-arts --enable-video-nanox CFLAGS="-I/home/winging_lu/include/" LDFLAGS="-L/home/winging_lu/STARKIT_v2/src/microwindows-0.91/src/lib/"

#make clean ;all

2.設定ffmpeg-0.5.1
FFMPEG_CONFIGURATION=--enable-cross-compile --arch=arm --target-os=linux --nm=arm-linux-nm --as=arm-linux-gcc --cc=arm-linux-gcc --ld=arm-linux-ld --disable-asm --enable-small

--disable-asm:不使用組合語言,我覺得是最大的敗筆,因為最佳化中的軟組合語言不知道什麼會不相容gun中的as組合語言。所以使用組合語言編譯是不會過的。

3.因為配合ffplay來實現播放軟體

arm-linux-gcc -L"/home/winging_lu/ffmpeg-0.5.1"/libavcodec -L"/home/winging_lu/ffmpeg-0.5.1"/libavdevice -L"/home/winging_lu/ffmpeg-0.5.1"/libavfilter -L"/home/winging_lu/ffmpeg-0.5.1"/libavformat -L"/home/winging_lu/ffmpeg-0.5.1"/libavutil -L"/home/winging_lu/ffmpeg-0.5.1"/libpostproc -L"/home/winging_lu/ffmpeg-0.5.1"/libswscale -static -o ffplay_g ffplay.o cmdutils.o -lavdevice -lavformat -lavcodec -lswscale -lavutil -lrt -lm /home/winging_lu/ffmpeg-0.5.1/libSDL/lib/libSDL.a -L/home/winging_lu/STARKIT_v2/src/microwindows-0.91/src/lib -lpthread -lnano-X -lgcc

因為與nano-x配合後,會出現__udiv3 無法連接的問題,所以要加入-static 與lgcc來作靜態連接libgcc.a的程式,才可以正常執行。

本來想拿ffmpay來作播放器的,但是因為放在FIE8182上實在是太慢了!所以執行起來把480MHZ的效能吃光光,覺得實在是太弱了!