星期五, 3月 31, 2006

加速卡的加速能力

使用加速引擎,可以:
  • copy 一塊區域,修改大小,color space,到另一個位置。
  • 修改一個區域影像的alpha值。
  • 填滿一塊區域
  • 作向量文字繪圖
加速引擎有三個輸入: I,J,K 和一個輸出 OK.
這三個引擎都連接到DRAM,所以可以視為引擎對DRAM的read/write path.

加速卡可以同時處理很多process的要求,加速卡會自動區分,要使用加速功能的process,要先對加速卡作Open( )動作。

加速卡可以配合輸出放大器使用,但是要確定那個放大器目前沒有被用作deinterlacing,PIP,並且要設定在slave mode。

加速卡的driver利用 ioctl 作為軟體介面。
所以,所有command 的data exchange都是經過COMMAND_ID / structure pointer的方式。

星期四, 3月 30, 2006

gcc linker loader (ld) 的問題 - linker option 與object 的次序

或是說...g++ 和 gcc 的linker 不同..

為了這個搞了一天... Q___Q


原來是用arm-elf-g++ 作compiler, linker。

link時出現..
undefined reference to `Fill(RKK *, long, long, unsigned long, unsigned long, unsigned long)'
但是明明就在library裏呀,更奇妙的是另一個libray中call這個Fill的function竟然可以 正常link。
直接call Fill 就會有這個錯...

只好把相關source file都copy到local folder,重新寫一個minimum function。link obj file。
的確是發現使用時,有一些type convertion。加入cast後,就OK了。

但是... sample code為什麼就OK ??

所以...發現sample code用gcc作 compiler, linker。我用g++。
也改g++後,這個"undefined reference to.." 的error消失了。
改出現.."undefined reference to pow".. 這個只要加上math library : -lm 就OK了。

發現是compiler的關係,不是linker的關係。

用gcc作compiler ,compile出來的object code,link 就沒有 Fill ( )找不到的問題。
用g++作linker,就不會有 pow function 找不到的問題。




這大概是因為 g++ 的type check比較嚴謹。尤其 function argument上。

還有一點要注意的:

在修改Makefile的過程中,雖然一度曾經修改成正確的格式。但是一樣make fail。
這是因為前一次make fail 留下的*.elf, *.elf2flt 未刪除。造成linker只有拿elf, elf2flt作strip 的動作。沒有重新從obj --> elf.

所以要記得,要刪除這些未成工的file (或是把Makefile也加入dependency中)。

星期三, 3月 29, 2006

!!! a bad example on code guard !!

build一個project,卻出現..
trygfx.cpp:7: parse error before `}'

所以?問題是在那?
依照經驗,朝上面找....#include XXX.h

到XXX.h去看..果然
#define NOT_COMPIL }}}}}}not}}}}}compilable}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
看看header comment。暈倒。
就是這個結尾導致include他的code有error。

這是 很不好的設計方法,讓compiler 的error message顯示出不正確的資訊。
應該要echo 一個message出來。
或是 在後面直接產生error.



解決 : 在include之前要define ALLOW_XX_CODE

trace的步驟: 寫一個一的file,從發生問題的header開始include起。build。ok include上一層。
"層"是從最初make output error的message取得的,都會有
from xxxxxxxx.c : 77
from xxxxxxx.c:99
include xxxxxx.h line lll error:dsdsdsd
就是那個"from"可以trace include的hirachy

解決這個code後,接著就是link : undefine reference to `xxxxxx` 的問題。
這個就是找到`xxxxx`所在的library,加到link library就可以。
OK!!!

....trygfx 順利的在lcd畫出一個白色方塊....

VI (VIM) 中執行shell command

用VI寫程式時,常常要到shell中執行Make,這樣exit--edit反覆,很麻煩。
VI中職行shell command有兩種方法:

一是只執行一個command:
 : ! 命令
另一個是跳到shell,直到用exit回來:
 : shell
好像還有一個方便Make的功能.....
在要mark的位置,command : m{a-zA-Z}
(直接輸入command,不用 : 符號和進入edit (insert) mode).
所以可以mark 26+26 個。

要到某一個mark : 用
 `{a-zA-Z}
連續兩個 ` 會到剛剛mark的位置。

.要列出所有marks:
 :marks
一個超好用的開檔編輯command
 gf
會開啟游標所在word為檔名的檔案。
在 開include檔時很有用。

列出目前所有開啟的file:
files


跳到下一個edit的file
 Ctrl - ^
多檔編輯時,每一個file是一個buffer,buffer的command都是以 b 開頭的:
:bn  編輯下一個開啟的buffer(file)
:bp 編輯上一個
:bd 刪除這一個
:b{數字} 編輯第N個
.

星期二, 3月 28, 2006

nanox - DrawImageFromFile - II where is the psd ?

void
GrDrawImageFromFile(GR_DRAW_ID id, GR_GC_ID gc, GR_COORD x, GR_COORD y,
GR_SIZE width, GR_SIZE height, char* path, int flags)
{
GR_DRAWABLE *dp;

SERVER_LOCK();

switch (GsPrepareDrawing(id, gc, &dp)) {
case GR_DRAW_TYPE_WINDOW:
case GR_DRAW_TYPE_PIXMAP:
GdDrawImageFromFile(dp->psd, dp->x + x, dp->y + y,
width, height, path, flags);
break;
}

SERVER_UNLOCK();
}
. GdDrawImageFromFile的psd由dp提供,dp是由GsPrepareDrawing從id和gc產生。
GR_DRAW_TYPE
GsPrepareDrawing(GR_DRAW_ID id, GR_GC_ID gcid, GR_DRAWABLE **retdp)
{
GR_WINDOW *wp; /* found window */
GR_PIXMAP *pp; /* found pixmap */
...
wp = GsFindWindow(id);
if (wp == NULL) {
pp = GsFindPixmap(id);
....
*retdp = wp? (GR_DRAWABLE *)wp: (GR_DRAWABLE *)pp;
...
可以知道,retdp就是id所代表的windowsid/bitmap id。
這個bitmapid是由
    g_pixmap = GrNewPixmap(16, 16, 0);
GrDrawImageFromFile(g_pixmap, gc, 0, 0, -1, -1, "bin/nxroach.pgm", 0);
在DrawImageFromFile( )這個function中,是bitmap id.

GrNewPixmap會用rootwp的psd作psd。這個應該就是fblin32alpha.c的function table。
所以直接會畫到screen上。

奇怪的是,DrawLine用的psd-drawpixel和DrawImage的psd-drawpixel使用的screen base address竟然不一樣。

難怪DrawImageFromFile會畫不出來。
--%gt;問題還是在psd上。
.

對照DrawArc, DrawLine和DrawImageFromFile,就是在WINID不一樣。
DrawArc/Line的id都是windows id。
DrawImage的id是pixelmap。

星期一, 3月 27, 2006

nanox - DrawImageFromFile

PWMIMAGEHDR
typedef struct {
int width; /* image width in pixels*/
int height; /* image height in pixels*/
int planes; /* # image planes*/
int bpp; /* bits per pixel (1, 4 or 8)*/
int pitch; /* bytes per line*/
int bytesperpixel; /* bytes per pixel*/
int compression; /* compression algorithm*/
int palsize; /* palette size*/
long transcolor; /* transparent color or -1 if none*/
MWPALENTRY * palette; /* palette*/
MWUCHAR * imagebits; /* image bits (dword right aligned)*/
} MWIMAGEHDR, *PMWIMAGEHDR;

實際image bitmap 放在 *imagebits 中。
因為到了load時才會知道image的size,所以這個buffer是runtime alloc的。
height * width * bytesperpixel。

int GeDecodeImage(PSD psd, buffer_t *src, char *path, int flags)

實際return的是一個id,PIMAGEITEM的id。
PIMAGEITEM的一個property就是PWIMAGEHDR <- 實際放image bmp 的buffer。

所以

LoadImageFromFile(PSD psd, char *path, int flag)

return的是一個id。就是PIMAGEITEM的id.

nanox將所有物件都用id來辨別,用FindXXX(id)來找出該id 的structure head。
所有物件都會放在一個linking list中。

實際的device driver是 src/driver/fb.c。
又依照color depth,使用fbline32alpha.c

所以PSD->DrawPixel是fbline32alpha.c的drawpixel( )。

MS Visual Studio C++ express

因為這是Free的版本,所以就去download 試試。
有很多種安裝方式,我選download iso image file。
400多M吧。
OK後,用Virtual Daemon 開啟(會變成一個cd)。一開,就自動安裝了。
-----當然,還要回答一些license的問題。
竟然需要1.6G的space。
會裝上:
  • .NET framework 2.0
  • VC++ 2005 express
  • MSDN 2005 Express
  • SQL Server 2005 Express x86
安裝時間蠻久的(3.2G P4, 2G ram machine)。幾乎以為當機了。
install interface改成平面的方式,有點BeOS的感覺。
..因為等太久,所以去把Debain update一下..

第一次啟動,會花一點時間"figuring system environment..".
啟動後,好像甚麼都沒有,Getting Started.有一個: download psdk (platform sdk).....這個,又需要1G....
選custom,將一些IA64和AMD64的功能diable(不安裝)。
...這個更慘,我已經要確定是當機了....
喔?還在跑? 把VC關閉後,progress bar又跑了一下...
奇怪...是在download嗎?1.3M的file需要1G的安裝空間..
如果是download的話,用ADSL安裝大概要好幾天吧...


從tinyproxy的log中可以看到,真的是到ms去download file:
GET http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-AMD64_o-common.0.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-IA64_o-common.0.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-PSDK-common.0.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-PSDK-common.1.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-PSDK-common.2.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-SDK_Core_BIN-common.0.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-SDK_Core_BLD-common.0.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-SDK_Core_BLD-common.1.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-SDK_Core_BLD-common.2.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-SDK_Core_BLD_X86-common.0.cab
http://download.microsoft.com/download/a/5/f/a5f0d781-e201-4ab6-8c6a-9bb4efed1e1a/PSDK-SDK_Core_DOC-common.0.cab
...
用wget去download也download的下來,只是不知道要怎麼安裝...

結果sample project 是用Makefile。

用Create New Project 測試。一個簡單的form application...
開發方式已經不像以前MFC這樣麻煩,form,toolboox layout已經像C++ build一樣。
event handler也像C++ builder一樣方便,不必用以前MFC ATL XXXX等等。
但是.....有些C++的語法不太一樣。......


OK。
那就這樣啦,現在gnu的tool這麼習慣的情況下,要再學一套IDE的話,寧可選Eclipse。
至少不會像Visual Studio一樣,一兩年就換版本,然後code要大改,ide也大改。

uninstall ....

移除也很麻煩,要一個一個移除,還出現當機..... 所以,,,要測試者 深思呀。
看到的iso檔install 方式:
http://msdn.microsoft.com/vstudio/express/support/install/


星期日, 3月 26, 2006

坎坷-- try tv card

買了二手的tv card,要驗收,所以裝一台xp試試。

結果,cd 不能開機。
換了一台,也不行。
但是另一片可以。
所以用另一個牌子的cd rom copy 一份再來試試。
ok (奇怪的是,這一牌的cd rom 在nb卻很難讀)。
後來發現,原來是bios設定,要把enhance ATAPI disable.

boot後,出現operation fail。 -- 暈倒。
查cdrom上的faq。這是因為agp card太舊。按下tab鍵,進入taxi mode來安裝就可以。
--或是換一片agp card。

換一片agp card。OK。

安裝完畢,插card。接cable。當然,非常的不清楚。
加上強波器。稍微好一點。

星期五, 3月 24, 2006

讓LCD TV 漂亮的chip

pchome的2300週報:
JVC液晶電視表現亮麗、影像處理LSI為祕密武器

JVC去年12月液晶電視銷量創佳績,名列液晶電視業界第五名。推究締造此成績的背景因素,可說得力於該公司在2005年9月推出之影像處理用LSI「新Genessa」。

對 於未自行生產面板、採水平分工生產模式的JVC而言,「新Genessa」可說是該公司液晶電視產品與其他廠商進行差異化之祕密武器。「新 Genessa」的最大特色在於可在一秒鐘之內,一張張分析60格的影像scene,再透過修正影像內的雜訊、調整刺眼部份的濃淡等方式,而呈現出鮮明的 影像。

「新Genessa」係該公司於2004年4月推出之「Genessa」的第二代LSI。除支援Full HD之外,並提升有助鮮明呈現影像的IP轉換能力。其除用在液晶電視外,也配備在背投影電視機種上。

「新Genessa」主要有四個減少雜訊的技術,皆為支援電視播放或錄影數位化之技術。分述如下:

其 一是減輕影像本身粗糙閃爍之技術。以往雖有透過影像以外的同步訊號部等測出雜訊的方法,但是由於DVD Recorder為了節約資料容量而刪減同步訊號,以致無法以既有方式降低雜訊。「新Genessa」可以即時測出影像本身的雜訊,並利用內建CPU適切 控制雜訊去除量。

其二是可降低數位電視播放特有的塊狀雜訊問題。數位電視播放因為削減影像資料容量,故以8畫素單位壓縮傳送影像資料,再 加以解壓縮。但是,8畫素單位產生的高低差異卻成為四角形雜訊,出現在畫面上。「新Genessa」則透過以1畫素單位將此重新計算再解壓縮之方式,使影 像更為平滑。

其三是降低飛蚊雜訊的技術。「新Genessa」可測出飛蚊雜訊,對該部份進行修正。

其四是降低cross color dot雜訊的技術。數位電視播放因為直接使用類比影像,以致常產生干擾雜訊。「新Genessa」備有解決此問題之演算法。

為配備上述四個技術,JVC乃將LSI處理能力增為兩倍,提升測出影像特徵和降低雜訊處理的精細度。除此之外,「新Genessa」亦進行晶片集中化,藉此將生產成本降為原來的一半。透過此舉,平均每一台電視的成本將可縮減數千日圓。
.

星期四, 3月 23, 2006

replacement for RTL8100C : 9102D

Davidcom的sales很好心問候,告訴我們現在用的RTL8100C可以用Davicom的9102D代,
而且Davicom已經port好很多driver了: http://www.davicom.com.tw/eng/download/Driver/driver_9102d.htm

據說很多performance比RTL8100好很多..

要是早一點說就好了,RTL8100的sample要了這麼久,還要不到,Davicom的服務比較好,performance又比較好。如果可以就換9102D好了..

Cliff Hsu

Davicom

03-5798797 ext8587

0931-294403

cliff_hsu@davicom.com.tw

星期三, 3月 22, 2006

man man

man是linux好用的功能,但是因為很多同名的keyword, program,所以man時常會出現不是自己要查的那一個。
例如:man open 本來要查open file 的 c function,出來的卻是openvt : start a program on new virtual terminal。

所以?

先查一下man的用法: man man。
有提到 -a option.會列出所有相關的題目。
所以: man -a open
第一出現的還是openvt,但是q結束後,出現: --Man-- next: open(2) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
按下enter後,出現的就是我想要的c function : open的說明了

El Torito ?

El Torito 聽起來好像是義大利餐廳的名字。
實際上,是可開機光碟格式的規範。

真是奇怪,這應該也算是namespace pollution吧?

古老的CD 是不能開機的(實際上,再古老一點的HD也是不能開機,再再古老一點的floppy也不能開機),能不能開機,是由BIOS決定的。BIOS要有讀取這個裝置的能力,還要自動的從裝置上load一些data到ram執行。

所以,可以猜到的是,El Torito是BIOS廠商提出來的規範。

還好當初提出的廠商沒有成立的 一個組織,要求所有使用這個規範的人都要付費。
否則現在應該會有一堆開機格式。

我會查到這個名字是因為XPOnMAC計畫,訪問NB二人組時提到的..

星期二, 3月 21, 2006

file and stream : stdin and STDIN_FILENO

man stdin 時出現的,剛好,我一直對file descriptor和stream有疑問:
Since FILEs are a buffering wrapper around Unix file descriptors, the same underlying files may also be accessed
using the raw Unix file interface, that is, the functions like read(2) and lseek(2). The integer file descriptors
associated with the streams stdin, stdout, and stderr are 0, 1, and 2, respectively. The preprocessor symbols
STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO are defined with these values in <unistd.h>.
fd是file unix type的file descriptor。FILE 則是在unix type的file io加上buffer。
一般application在執行時,系統就已經開好stdin,stdout, stderr這三個 standard io stream 。
所以不用宣告,就可以用(其實是include了stdio.h)。

至於unix type的file handle,對應的就是STDIN_FILENO, STDOUT_FILENO。STDERR_FILENO。

要注意unix type和stream type的read/write 各有自己的function。

要把unix type file descriptor轉成STREAM type FILE *,用fdopen()。



在man stdin中有說明很多file descriptor和FILE (stream)的差異。
CONSIDERATIONS:

stream stderr是unbuffered,stdout是line buffered,也就是說buffer的data在遇到fflush, exit 或是 "\n"時,才會真的送到file中。
所以測試dup2( )的code:
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc,char **argv)
{
int fd;

printf("Start!\n");
fd = open("outfile", O_CREAT | O_RDWR | O_TRUNC, 0444);
printf("open fd %0x ",fd);
fflush(stdout);

dup2(fd,STDOUT_FILENO);
printf("Can you see this ?\n");

sleep(1);
close(fd);

exit(0);
}
因 為printf("open fd..這一行沒有new line: \n,所以實際上"open fd "會到了printf("Can you see...這一行,遇到 \n 才會寫入stdout。這時的 stdout是 open 的file : output了。
所以在dup2( ),變更stdout前,用fflush(stdout) 強制將所有stdout buffer中的資料寫入device中。

如果要改變stdin/out的特性,例如:變更buffer的行為,echo on/off...etc。就要用tcsetattr( )。
這個function屬於termio.

用tcgetattr( )取得目前terminal設定值,修改後,用tcsetattr( )設定。

這是從sample code看到的,sample code可以catch到一個按鍵動作,不需要return鍵,但是我的卻需要。---- 同樣是用read(STDIN_FILENO)讀取stdin。

所以猜他改了stdin的行為,往上查,發現tcsetattr( )。

要做到沒有buffer的動作,大概要如下的方法(同時將特殊按鍵轉為3 key,disable echo:
main()
{
char buf[3];
int cnt;
struct termios tio_org;
struct termios tio_new;

tcgetattr(STDIN_FILENO,&tio_org);
tio_new =tio_org;
tio_new.c_lflag &= ~( ECHO | ICANON | ISIG );
tio_new.c_iflag &= ~( BRKINT );

tio_new.c_cc[VMIN ]=3;
tio_new.c_cc[VTIME]=1;
tcsetattr(STDIN_FILENO,TCSAFLUSH,&tio_new);

while(1){
cnt = read(STDIN_FILENO,buf,3);
if(cnt >0) {
printf("cnt = %d\n",cnt);
buf[cnt]=0;
printf("%s",buf);
break;
}
}

tcsetattr(STDIN_FILENO,TCSAFLUSH,&tio_org);
}
.這樣,按下任一鍵,馬上就能偵測到。
其中,ICANON和c_cc[ ]的設定是重點。

pipe - 開啟無名管線

pipe 建立管線(沒有名字的管線)。
       #include <unistd.h>

int pipe(int filedes[2]);
傳入的是兩個file handle。
pipe( )會開啟一個pipe。

將read handle給filedes[0].
將write handle給filedes[1].

#include <unistd.h>

main()
{
int filedes[2];
char buf[80];
char s[]="Hello\n";

if( vfork() == 0) { // child
write(filedes[1], s, sizeof(s));
}else{
read(filedes[0],buf,80);
printf("%s",buf);
}

exit(0);
}
使用vfork要注意,child 會先執行,而且未結束前不會執行parent process。
使用vfork時,要用exit(0)正確關閉pipe。否則會出現error。

pipe開啟無名管線。有名子的要用mkfifo.

popen : 用fork執行外部command

這個也是當初Chris和Alice做的,現在又要用了。所以紀錄一下。

用fork/vfork+exec 執行外部command的話,沒辦法和外部程式溝通。
用popen的話,就可以取得執行command的stdio,利用這個stdio來溝通。
使用方法是 :
 #include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);
command就是要執行的命令,包含path, programname 和argument。
type只有"r"或"w"兩種。不可以"rw"。
使用完後,要用fclose來關閉stream。

使用popen麻煩在於stdio只能作read或是write,不能同時rw,所以不能作為parent和child process溝通用(雙向)。

解決的方法大概要用兩個pipe,然後用dup2 把child process的STDIN/OUT換成這兩個pipe。
然後再exec external program..

parent就可以用這兩個pipe跟child process溝通。

星期一, 3月 20, 2006

another issu : make config : no libncurses..

作Make config時,出現
>> Unable to find the Ncurses libraries.
>>
>> You must have Ncurses installed in order
>> to use 'make menuconfig'
以前,這就是安裝libncurses5-dev。但是這個系統早就install了呀。

再看看其他message,有:
cc1: No space left on device: error closing /tmp/ccbc3Ke4.s
??所以?
查一下disk space...果然,root已經是100%了。
移動一些root的file後,make config已經可以run了。

所以說呀...error output 要全部都看完..

vfork : uclinux

當初作uclinux時寫的notes(chris和alice也有貢獻)。
最近又要用到,所以copy出來。....


fork和vfork都是產生child process的function call,
fork後好像會先執行child process,再執行parent process。

在uClinux裡,fork不行用,要用vfork,但是vfork和fork不一樣,

vfork的child和parent使用相同的memory space,所以child process不可以直接結束。
要用exit()或是呼叫exec??( )執行其他外部程式來結束自己。

如果不用exit而結束, 會有"Illegal instruction"或是'SIGSEGV"的error message。

另一點
vfork不能像fork一樣,
以下面的fork一個child process作daemon的code來看:
int main(int argc, char *argv[])
{
char c;
int _argc = 0;
char *_argv[3];
pid_t pid;

if ((pid = fork()) < 0) {
fprintf(stderr, "fork failed\n");
exit(1);
} else if (pid != 0) {
exit(0);
}

setsid();
chdir("/");
umask(0);
close(0);
close(1);
close(2);

for (;;) {
sleep(5);
syslog(LOG_INFO, "Still sleeping\n");
}
}
把fork改為vfork後雖然parent有作exit(),但是因為和vfork的parent,child使用相同的
memory space,所以直到child也exit()或exec??()前,parent都無法結束。
所以以vfork來作上面的例子:
int execed = 0;

int main(int argc, char *argv[])
{
char c;
int _argc = 0;
char *_argv[3];
pid_t pid;

while ((c=getopt(argc, argv, "D")) > 0) {
switch(c) {
case 'D':
execed = 1;
break;
default:
fprintf(stderr, "You probably don't want to pass "
"options to this\n");
exit(1);
}
}

if (!execed) {
if ((pid = vfork()) < 0) {
fprintf(stderr, "vfork failed\n");
exit(1);
} else if (pid != 0) {
exit(0);
}

_argv[_argc++] = argv[0];
_argv[_argc++] = "-D";
_argv[_argc++] = NULL;
execv(_argv[0], _argv);
/* Not reached */
fprintf(stderr, "Couldn't exec\n");
_exit(1);
} else {
setsid();
chdir("/");
umask(0);
close(0);
close(1);
close(2);
}

for (;;) {
sleep(5);
syslog(LOG_INFO, "Still sleeping\n");
}
}
Link: http://www.ucdot.org/article.pl?sid=03/12/12/0317219&mode=thread

還有vfork是child先執行,結束後才將控制權交給parent,和fork不一樣。
所以vfork還是無法做到讓兩個process同時動作:
main()
{
int status;
if (vfork()==0) {
printf("child go\n");
sleep(10);
printf("child up\n");
exit(0);
}else{
printf("parent go\n");
wait(&staus);
printf("parent end\n");
}
}
上面的程式如果是用linux的fork,會在child sleep時,將控制權交給parent。
 child go
parent go
child up
parent end
但是用vfork的話,在child執行exit()之前,parent都不會拿到控制權,所以

child go
child up
parent go
parent end
.

星期五, 3月 17, 2006

framebuffer的color 順序

microwindown中,color 的byte順序是:
#define MWARGB(a,r,g,b) ((MWCOLORVAL)(((unsigned char)(r)|                                   (((unsigned)(unsigned char)(g))<<8))|\>...也就是說由High byte到low byte依次是alpha..blue...green..red.
但是實際implement時,要考慮Big-endian和Little-endian的問題 (如果用unsigned long來代表顏色的話...)

本期商業週刊的例子---育富電子

在技術上,育富不走先端產品;在機器設備上,育富也不優先升級。富邦投顧研究員林茂揚分析,印刷電路板是一個相對成熟的市場,以價格為導向,成本優先,慢攻比快攻有利。
---也就是說,和鴻海一樣
「育富是生產事業單位,不是研發單位,」劉永幹說,公司每年投入在研發費用比率僅占營收○.五%,是同業的三分之一,如此至少為育富省下每年近兩千萬的資本支出。育富並將所有資源集中於如何降低成本,擴大生產規模上。
---所以他並沒有建立技術門檻?
淡旺季產能利用率可能相差近兩成,
.
在四層板印刷電路板的二十幾項生產過程中,鑽孔與壓合,是資本支出最高的製程,約占生產成本比重的三分之一。國內多數業者,將資本投注在此兩個製程的設備採購上,但是育富卻是反其道而行,將資本支出投注在電鍍流程的改造上。
.
這段外包製程,也是育富成本管控的水閘門。原物料上漲時,育富便增加外包的比重,由外包廠吸收原料上漲成本。
.---也就是說,他把產能廢置的成本,讓其他人賺。這樣,自己會賺比較多嗎?

星期四, 3月 16, 2006

純complain - 爛programmer...

超爛的code,連modulize都沒做到。
還有一個function:
  1. 將osd update到screen。傳入profile的buffer把profile取回。傳入pointer把videosource取回。
  2. open bmpfile的function,竟然要傳入alph,rgb,orientation 。
  3. 叫OpenBitmapFile的function name,竟然用來open png,jpeg,gif 檔...
  4. 開一個image file,竟然要來回user--kernel 數十次。這樣我乾脆用open source library配合framebuffer來作算了。
  5. 全部function都自己實做,浪費時間,又增加使用難度(名稱取的很差)。--為什麼不用標準C lib ?

我懷疑他是不是故意的,讓人攪不清楚他code的真正使用方法...

VI 學習 : copy and paste

用了基本的command用了很久,要試試一些進階的了...
接著需要的就是copy - paste 動作。

要copy/cut 一些字..
  1. 先將游標移到要開始的位置
  2. 按下"v",command 出現"VISUAL"
  3. 移動游標到要結束的位置,移動時可以看到有些字開始反白了,這就是選取的區域。
  4. 按下"d"作cut動作。 或是"y"作copy動作
  5. 可以看到反白不見,command的"VISUAL也不見了。
  6. 移動游標到目的位置
  7. 按下"p" 貼上
簡單的說就是 v ---- y/d --- p

How to be a "管理大師"

大師phopicking的網路日誌

<獨孤木獨門秘方>很多人都想晉升為管理大師,這種頭銜放在自己的履歷表上,非常顯赫而有用,馬上就可以讓你擠身百萬年薪的行列。如果你要自己晉升為管理大師,現在不必上補習班去考證照,只需要自己在家作就可以了。所需要的材料很簡單。請準備下面的材料。

1. 一張很厚的臉皮

2. 一張很會唬爛的嘴

3. 一台notebook

4. 一個自己的blog。如果你不會寫文章,可以參考本公司的人力外包服務,我們會從中國尋找現在最划算的人才,所費不高,小小投資就有大大回報。

難怪沒遇到很謙虛的管理大師....

星期三, 3月 15, 2006

Try DirectFB -- for uclinux arm uclibc

因為看到ftp site有,就download回來了,但是沒看到有config好的Makefile和config file。
只好隨便試,這個是可以動的:
./configure --prefix=/home/charles/DirectFB --target=arm-linux --host=i686-pc-linux-gnu --enable-static -disable-shared -disable-jpeg -disable-png -disable-gif -disable-freetype -disable-mmx -disable-libmpeg3 -disable-video4linux 2>&1 | tee output 
要指定--target=arm-linux,不然他不會detect cross-compile。也要指定--host,
一樣,要設好CC,CXX...等tool(ref setcrosstools.sh)。
要--disable-shared 否則會去找libdl.a這個是share library (libso)的library。
要disable mmx,不然會compile x86奇怪的assembly code進去。
其實還有很多要disable,但是因為build過了,所以就暫緩。
然後
 make
make install
就OK。

接著要build example,有點麻煩,要旨定link directfb剛剛的install位置。
有點麻煩...config後修改src/Makefile,竟然沒有反應...

Qt/Embedded - Qtopia Core build (cross)

Qt/Embedded 改名Qtopia Core了。一樣,也有Commerical和GPL兩種版本。
download : http://www.trolltech.com/download/qtopia/coregpl.html

build : 這個就有點麻煩了。

這一篇
應該是一個大陸人寫的,uclibc , arm-elf-g++ build Qt/E OK,但是link application出問題。

這一篇說明可以將那一些功能關閉,build一個剛好可以build kde的 qt/e.

這一篇 跟上一篇類似,精簡Qt lib的方法

這個,就是官方的install instruction

一樣, ./configure --help會列出所有的(?) configure option.

一樣,先設定好tools的search path : source setmagsi.sh
接著,再設定好build tool variable : source setcrosstools.sh
可以開始 configure了(?)

先看一下config的option有哪些...
PREFIX部份follow default就可以,他為install在目前目錄。

-release (*)
-static
-no-gif (*)
-qt-zlib (*)
-no-fast (*)
-no-exceptions
-disable-styles
-disable-tools
-disable-kernel
-disable-widgets
-disable-dialogs
-disable-iconview
-disable-workspace
-disable-network
-disable-canvas
-disable-table
-disable-xml
-disable-opengl
-disable-sql
-no-stl
-no-ipv6
-verbose
-no-imgfmt-jpeg
-little-endian
-no-freetype
-no-zlib
-depths 32
-no-gfx-mach64
-no-gfx-matrox
-no-gfx-qvfb
-no-gfx-showfb
-no-gfx-snap
-no-gfx-transformed
-no-gfx-vga16
-no-gfx-vnc
-no-gfx-voodoo
-no-kbd-s1500 tty usb yopy vr41xx
-no-mouse-pc bus linuxtp yopy vr41xx
-v

這樣configure的結果,configur認為是native build,所以有nocrosscompile的message。
參考了一下大陸人那篇,要指定xplatform target。
支援的target寫在PLATFORM中。

config完後run make就可以,如果要重新config,就run make confclean,再run configure。

星期一, 3月 13, 2006

workrecord on gui -nonox

雖然只有用到簡單的icon和key動作,但是若是直接對framebuffer動作,一些line, drawtext, rectanglar等等都要自己寫,所以...還是用nanox好了。

Compile nanox demo program的command 是(從make output 抄下來的)
arm-elf-gcc -c -DMWPIXEL_FORMAT=MWPF_TRUECOLOR8888 -DHAVE_FILEIO -DHAVE_FNT_SUPPORT=1 -DFNT_FONT_DIR="\""fonts/bdf""\" -DHAVE_PCF_SUPPORT=1 -DPCF_FONT_DIR="\""fonts/pcf""\" -DHAVE_BMP_SUPPORT=1 -DHAVE_GIF_SUPPORT=1 -DHAVE_PNM_SUPPORT=1 -DHAVE_XPM_SUPPORT=1 -DHAVETEXTMODE=0 -DTHREADSAFE=1 -DERASEMOVE=1 -DUPDATEREGIONS=1 -DDEBUG=1 -DLINUX=1 -DUNIX=1  -Wall -Wpointer-arith -D__MINT__ -mstructure-size-boundary=8  -I. -I/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/include -o demo2.o demo2.c

Link的command是
arm-elf-gcc  -Wall -Wpointer-arith -D__MINT__ -mstructure-size-boundary=8  -I. -I/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/include  -L/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/lib -Wl,-elf2flt="s3276" demo2.o /home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/lib/libnano-X.a -o demo2
demo.o ~~~/lib/libnano-X.a -o demo 這個command會把demo.o和libnano-X.a link link起來。
這樣寫不用-lnano-X -L~~~/lib 指定兩個option : -l libraryname -L library path.

所以demo.c的Makefile就是:
TARGET = demo

CC = arm-elf-gcc
LD = arm-elf-gcc

CFLAGS = -DMWPIXEL_FORMAT=MWPF_TRUECOLOR8888 -DHAVE_FILEIO -DHAVE_FNT_SUPPORT=1 -DFNT_FONT_DIR="\""fonts/bdf""\" -DHAVE_PCF_SUPPORT=1 -DPCF_FONT_DIR="\""fonts/pcf""\" -DHAVE_BMP_SUPPORT=1 -DHAVE_GIF_SUPPORT=1 -DHAVE_PNM_SUPPORT=1 -DHAVE_XPM_SUPPORT=1 -DHAVETEXTMODE=0 -DTHREADSAFE=1 -DERASEMOVE=1 -DUPDATEREGIONS=1 -DDEBUG=1 -DLINUX=1 -DUNIX=1 -Wall -Wpointer-arith -D__MINT__ -mstructure-size-boundary=8 -I. -I/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/include

LDFLAGS = -Wall -Wpointer-arith -D__MINT__ -mstructure-size-boundary=8 -I. -I/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/include -L/home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/lib -Wl,-elf2flt="s3276"

LDLIB = /home/nfscharles/armutils_2.5.91.0/build_arm/microwin/src/lib/libnano-X.a

$(TARGET) : $(TARGET).o
$(LD) $(LDFLAGS) $(TARGET).o $(LDLIB) -o $(TARGET)
chmod a+x $(TARGET)

$(TARGET).o : $(TARGET).c
$(CC) -c $(CFLAGS) $(TARGET).c -o $(TARGET).o

Some APIs:

GrReqShmCmds(size)
使用share memory的方式來和X-server溝通(不用BDS sock的方式)。這樣會比較快)。如果host os不支援share memory,nano-X會自動用BSD socket的方式。
GrNewWindow( parent,orgx,orgy,w,h,boardsize,background,boardercolor)
Create一個Window
GrMapWindow( winid)
將windows和他的child window都畫出來,送出EXPOSURE event改他(們)。
GrClose(void)
將Graphic device關閉,將所有message清空
最簡單的program,create一個window,用Ctrl-C 結束...
#include <stdio.h>
#include <stdlib.h>

#define MWINCLUDECOLORS
#include "nano-X.h"

int main(int argc,char **argv)
{
GR_EVENT event;
GR_WINDOW_ID w1;

if (GrOpen() >0) // 開啟和XServer連線的socket
exit(1);

w1 = GrNewWindow(GR_ROOT_WINDOW_ID,10,10, 100, 100, 1, BROWN, WHITE); // create一個window
GrSelectEvents(w1, GR_EVENT_MASK_CLOSE_REQ); // 指定接收CLOSE_REQ event
GrMapWindow(w1); // 顯示

while(1){
GrCheckNextEvent(&event); // get system event
switch(event.type){
case GR_EVENT_TYPE_CLOSE_REQ:
GrClose();
break;
}
}
}
太過heavy weight,還是直接對framebuffer動作比較快(很多)。
所以把nano-X的graphic routine 改為直接動作。

原來nanox已經有這個功能。
修改config ,將LINK_APP_INTO_SERVER = Y。重新build就可以。
這樣nano-X 就不會以server的方式存在,application改為直接呼叫nanox的function。

rebuild之後,不用再run nano-X了。直接run demo program就可以。
測試結果果然快了很多。

embedded system http server

Emedded system要提供http server的方法有:

有OS的,run 一個http server

這個有很多可以選擇,依照你...
Resource (RAM/ROM,speed)
需不需要有CGI
需不需要有Virtual Host
需不需要有access control

fnord
Lighttpd 這個支援php喔,只是支援 語法,call php command line program完成php的部份。
appWeb uclinux裡面新附的http server。支援server side java scripting, ESP for 動態資料。
這個功能超酷,還支援SSI,自己有自己的scripting language,做到類似當初Chris改的ECGI 功能。這裡有ESP的說明
Cherokee 這個不知道功能如何,有分full和embedded兩種版本。有支援CGI。

沒OS的,內嵌一個http server source code。

找library,或是由一個application來改。
可以參考的有:

openfirewall
ntop : a
EHS (Embedded Http Server Library) : GPL的 Http C++ libary,用來內含在source code中。
libwww : 一些方便的www function library.
SWAT : Samba project內含的http server,用C++寫的。

星期四, 3月 09, 2006

nano-X source trace

developement/config.microwin
FRAMEBUFFER = Y
FBVGA = N

Makefile -- Makefile.rule 才是依照config.microwin 下option的file。

從build output知道driver是用scr_fb.c



srvmain.c : main( ) --> GsInitialize() -->GdOpenScreen()

engin/devopen.c : GdOpenScreen() -->scrdev.Open( )

driver/scr_fb.c : fb_open() :
if(!(env=getenv("FRAMEBUFFER")))
env="/dev/fb/0";
fb= open(env,O_RDWR);
回到nanox/srcmain.c:
main 的GsInitialize( )在open screen 前先GsOpenSocket( ),Device都open完後,就進入GsSelect( ) endless loop。

GsSelect( )的實做依照taregt platform有VXWORK, MINIX, UNIX ,這裡使用的是UNIX版本的實做。

GsSelect( ) set需要SET (WAIT)的file:FD_SET(un_sock..) keyboard, mount..然後用 select( ) 等待file change,用FD_ISSET 找到改變的file。

用GsOpenSocket( ) open的name socket : un_sock,的response action是 GsAcceptClient( )

srvnet.c : GsAcceptClient(void) -->GsAcceptClientFd(i)
srvmain.c : GsAcceptClientFd(i) : 將Client Fd link到 root_client 這個linking list中。

在GsSelect( )中,會一一用ISSET check所有root_client的fd.然後用GsHandleClient( )處理。

srvnet.c : GsHandleClient( int fd)
讀入fd message,parse data,取出 reqType,
執行GrFunctions[ ] functiontable對應的function
client application 都在demo/nanox中,Makefile有link到NANOXCLIENTLIBS,
定義在 Makefile.rules , = libnano-X.a

這個library build在 nanox/Makefile

Create rule在Makefile.rule:
$(MW_DIR_LIB)/$(LIBNAME): $(OBJS) $(CXXOBJS)
@echo "Creating library $(patsubst $(MW_DIR_LIB)/%,%,$@) ..."
$(AR) $(ARFLAGS) $(MW_DIR_LIB)/$(LIBNAME) $(OBJS) $(CXXOBJS) $(ASMOBJS)
可以看出libnano-X.a的組成.. OBJS , CXXOBJS ASMOBJS
用arm-elf-ar -t libnano-X.a
nxdraw.o
nxutil.o
nxtransform.o
client.o
nxproto.o
error.o
clientfb.o
都在nanox folder中,接著,就可以到demo/nanox下的client program,一邊看code,一邊查server端的對應function

查到對應clientlib內的function都是用
reg=AllocReq(-NAME-) 將command 包裝起來。
之後填好req的參數內容,再叫
TypedReadBlock( )-->ReadBlock()-->nxFlushReq( )
由nxFlushReq將Req填入Socket中。
.


demo2.c:
GrOpen( ) :
GrSetErrorHandler(NULL);
w=GrNewWindow(..);
GrSetWMProperties(..);
gc=GrNewGC();
font=GrCreateFont(..);
GrSetGCFont(..);
GrSelectEvent(..);
GrMapWindow(..);
GrSetFocus(..);
for(;;){
GrGetNextEvent( );
switch (event.type) {
case GR_EVENT_TYPE_EXPOTURE:
GrSetGCForeground( );
GrFillRect( );
GrSetGCForeground();
GrSetGCUseBackground();
GrText( );
GrRect( );
break;
case GR_EVENT_TYPE_CLOSE_REQ:
GrClose();
exit( );
case ...
}
所以可以看出實際上畫window的動作是要自己做的,nanox只提供message passing的機制。

這個會不會太辛苦...像Windows SDK..



一啟動nano-X 後,screen會被覆蓋掉,所以會覆蓋video output。要設定alpha=0。
nanax/srvmain.c:main() 有設定root windows的backgroud = BLACK。
查到BLACK是在mwtypes.h中定義。
另外有定義 MWARGB(a,r,g,b),就用這個來設定background。
將wp->background = BLACK改為MWRGB(0,0,0,0)
果然OK。load nano-X後video out依然OK。

星期三, 3月 08, 2006

trace ..mount_devfs_fs() err -2

在 fs/devfs/base.c中 mount_devfs_fs( )。
do_mount("none","/dev","devfs",0,"");
不成功 return -2。
PRINTK("():unable to do mount devfs, err:%d\n",err).
PRINTK定義:
#define PRINTK(format, args...)  {printk (KERN_ERR "%s" format, __FUNCTION__ , ## args);}
do_mount在 fs/namespace.c
查到是在path_lookup時 return error。

所以應該是root中沒有dev這個node。
所以是build的動作有問題,
查root.mk。
用make rootfs-clean後再make rootfs。
到 build_arm/root下check,有/dev。

結論: build_arm/root 不能直接刪除,因為有root_mad這個dependency check file。也要一併刪除,否則不會產生目錄結構。

some links to television in italy, spanish

Telecom Italia Trial IPTV
合作廠商有Alcatel, Microsoft
Microsoft Wins at BT
..就像他說的, 英國XX(http://www.bt.com/)採用MS的IPTV solution
Cesky develops IPTV brand
捷克的電視台2006 2月成立一家新公司要作IPTV的生
Telecom prep IPTV
捷克Cesky公司已經取得各電視頻道授權,進行IPTV業務。Cesky的母公司Telefonica已經在Span進行同樣的業務。

ADB deliver hybrid IPTV/DTT set-top box to telefonica
Swiss的數位電視hardware/software公司ADB,將要為西班牙的Telefonica's Imagenio Service提供set-top box。一種triple-play的服務

Telecom Italia Trial IPTV in 4 cities
TV over ADSL,使用set-top box,含有ir keyboard和Wifi AP可以提供5台PC存取。Alcatel 提供硬體平台,Microsoft提供Microsoft TV IPTV Edition。






http://www.onlinetvplayer.com/

http://www.cablecom.ch/tvradio/digitaltv.htm

http://www.dtg.org.uk/

http://www.sky.com/skycom/home/

http://www.dgtv.it/

http://www.worldlingo.com/wl/mstranslate/UP26384/T1/P2/l/zh_tw/microsoft/computer_translation.html?wl_lp=IT-ZH_TW&wl_fl=2&wl_rurl=my.skytv.it&wl_url=http%3A%2F%2Fwww.skytv.it%2Fmysky%2Fdefault.htm&wl_post=GET

http://www.mundoplus.tv/programacion/

http://www.cerestvnoticias.com/

http://www.plus.es/codigo/television/guiatv/default.asp

Video Resolution : D1, CIF, QCIF

D1
Full resolution for TV,可以是:
  • 704x576 TV PAL
  • 704x480 TV NTSC
  • 720x576 DVD-Video PAL
  • 720x480 DVD-Video NTSC

CIF (Common Intermediate Format)
以前是因為Video Conference而來,現在則沿用,代表以下resolution:
  • 352x288 PAL
  • 352x240 NTSC
CIF剛好是1/4 的D 1,又稱作Quarter D1。
Quter D1的名稱用在Video CD (VCD)中。

QCIF (Quater Common Intermediate Format)

也是古老的定義,resolution:
  • 176x144 PAL
  • 176x120 NTSC
QCIF剛好是1/4的CIF


720i 720p 1080i 1080p
HDTV使用的resolution standard。
  • 720 代表 1280x720
  • 1080 代表 1920x1080
  • i 代表 interlaced.
  • p 代表 progressive.
.

星期一, 3月 06, 2006

ramfs - linux ramdisk after 2.4

以前 ramdisk都要用/dev/rd0,1,2. make fs後mount。
但是linux 2.4後,有了ramfs 的支援。只要
 mount -t ramfs ramfs  /folder
就可以了。

新的ramfs和舊的ramdisk除了使用上不一樣,特性也不一樣。
原來的ramdisk,要先allocate一塊memory出來,不管你的disk有沒有儲存資料,都要佔掉一樣大的空間。
新的ramfs,只會佔掉有使用的部份(所以可以看到mount ramfs時,不需要指定maxsize。

據說ramfs是implement在vfs層,所以沒有一個ramfs filesystem driver。(所以會比較快?)。

另一個類似的ramfs是tmpfs,據說用法和ramfs類似,他還可以被置換(swap out)。

星期五, 3月 03, 2006

EasyARM2200 : Jimmy wants to use

Jimmy 要開始try EasyARM2200了..

裝ADS,裝ArmJtag,上電。 Arm7.exe ok.
set AXD - interface, remote_a.dll - config - net - 127.0.0.1
copy code.. ADS OK!

但是要注意.. ref http://checko.blogspot.com/2005/07/easyarm2200-worklog.html
為了要能在SRAM run. 要照著link修改 target link remap.

在example中,target 使用extram,這樣會用mem_b作 relocation script。
要修改如下
ROM_LOAD 0x81000000
{
ROM_EXEC 0x81000000
{
Startup.o (vectors, +First)
* (+RO)
}

IRAM 0x40000000
{
Startup.o (+RW,+ZI)
}

STACKS 0x40004000 UNINIT
{
stack.o (+ZI)
}

ERAM 0x81040000
{
* (+RW,+ZI)
}

HEAP +0 UNINIT
{
heap.o (+ZI)
}
}

上面紅色的地方要修改。
使用example project時要確認一下...

星期四, 3月 02, 2006

small linux bootloader - x86, hd

Jlo : Jeff's loader

embedded x86 pc 所用的linux bootloader.
small, easy to unstand and customize.

不像lilo, grub 等多功能,Jlo 不具備以下功能
  1. 由ext2 partition 開機
  2. Serial port console
  3. raid
  4. 由extended partition 開機
  5. 由/dev/hda以外的device開機
  6. boot選單
  7. boot old kernel
他所具備的優點有
  1. 大部分以C寫成
  2. 由cramfs root partition開機
  3. 變更VESA video mode,顯示splash 開機畫面
  4. 提供build disk image的script,不需要root priveleges 和利用fdisk, lilo..etc
Program structure
jlo由兩部份組成:part 1是mbr.S, 是一個512 bytes boot sector,內含partition table資訊和一個load program,用來load "secondary bootstrap"。
另提供一個script修改這個parition table。好用來boot其他parition。
mbr.S 利用這個table,將 2nd sector 的secondary bootstrap program load進來。
Secondary bootstrap 是一段約6k byte的16 bit real mode C program。
他初始化VESA 螢幕,load 開機畫面,load 第一個active partition 的linux kernel進來。
boot。

User Interface
  1. shift key : 將boot控制交給BIOS--通常BIOS會由PXE開機。
  2. ctrl key : 使用text mode開機
  3. alt key : show partion selection 選單
Installing
download, unpack , run make command 後產生file : jlo。內含MBR和secondary loader。這個file將要放到第一個sector中。
之後是 config parition,create cramfs partition...
提供一個perl program - mkimage用來build root image。
這個program default是對8M CF動作。
command:
 % ./mkimage --sector=32 --heads=2 --cylinder=248 -p1=myfs --image=cf.img
其中myfs是包含kernel, root的cramdfs image。
這個command最後產生cf.img檔。

cramfs image要用mkcramfs產生。作bootable image時,要加上"-i" option。命令如下:
 % mkcramfs -i bzImage root myfs
和一般不同的是:bzImage和root是分開的,不需要在root中。
使用以上方法產生 cf.img檔後,用
% dd if=cf.img of=/dev/XXX bs=512
將image寫入CF card中。

bootpart.c, update 這兩個tool提供線上更新功能,update可以download 新的cramfs image到第二個partition。再修改boot parameter,從第二個partition開機。這樣可以避免在update過程中損毀了所有的image。

要使用update功能時,mkimage要加上"--p1-size --p2-size" 參數,預留兩個partition的空間。要確保size足夠將來的update image使用。
Splash Screen

--- 略--

Command line option to kernel
jlo pass很簡單的command line option給kernel:
"auto root=/dev/hdaN video=0xnnn"
如果要pass更多option的話,要利用splash screen image的header,mkrle這個工具可以加入額外的command option:
 #mkrle --png=splash.png --out=img.rle --cmd="vesa=ypan"
所以要使用比較多的boot option,就要enable splash screen。

TOOLS
jlo的build tool是bcc, as86, ld86. 這些都是16 bit realmode x86 tools。通常所有linux distribution都有 。