C++ Builder 中的 TRichEdit 元件,可以提供比TMemo元件較多的視覺效果
,但有一個小缺點,當使用 RichEdit1->Lines->Add("") 或者 RichEdit2->Lines->Append(""),加入文字時,不會自動捲到最底下(TMemo 可以),對於只是當作log的顯示需求,很不方便,以下介紹克服的方法
在OnChange event裡,增加一個handler,加入程式碼如下
void __fastcall TForm1::RichEdit1Change(TObject *Sender)
{
SendMessage(RichEdit1->Handle,WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0); //自動換行作業
}
2008年12月24日 星期三
2008年12月19日 星期五
內存屏障(memory barrier)
memory barrier 長這樣 __asm__ __volatile__("": : :"memory")
首先gcc對於匯編語言(組合語言),是使用AT&T的語法,不同於INTEL的組合語言語法
格式 : __asm__(組合語言:輸出:輸入:修飾詞")
__volatile__ 代表這行指令(這些組合語言),不和前面的指令一起最佳化
"memory" 告訴GCC這些組合語言會改變所有的RAM的資料
因為沒組合語言,又告訴gcc所有RAM的內容都改變,
所以這個memory barrier的效用,
會讓這行之前被gcc所cache到暫存器的資料通通寫回RAM裡面
也告訴gcc會讓之後讀取RAM的資料,必須再從RAM裡讀取出來,
參考資料:
http://blog.chinaunix.net/u1/55599/showart_1099203.html
http://hi.baidu.com/hilyjiang/blog/item/2254e62afd6db42cd42af180.html
http://lyowu.yourblog.org/logs/135030.html
http://blog.openrays.org/blog.php?do=showone&tid=329
http://fanqiang.chinaunix.net/a4/b8/20010704/130401784_b.html
首先gcc對於匯編語言(組合語言),是使用AT&T的語法,不同於INTEL的組合語言語法
格式 : __asm__(組合語言:輸出:輸入:修飾詞")
__volatile__ 代表這行指令(這些組合語言),不和前面的指令一起最佳化
"memory" 告訴GCC這些組合語言會改變所有的RAM的資料
因為沒組合語言,又告訴gcc所有RAM的內容都改變,
所以這個memory barrier的效用,
會讓這行之前被gcc所cache到暫存器的資料通通寫回RAM裡面
也告訴gcc會讓之後讀取RAM的資料,必須再從RAM裡讀取出來,
參考資料:
http://blog.chinaunix.net/u1/55599/showart_1099203.html
http://hi.baidu.com/hilyjiang/blog/item/2254e62afd6db42cd42af180.html
http://lyowu.yourblog.org/logs/135030.html
http://blog.openrays.org/blog.php?do=showone&tid=329
http://fanqiang.chinaunix.net/a4/b8/20010704/130401784_b.html
Qt - QLineEdit and focusInEvent
需求:想要客制化一個QLineEdit,希望在點選這個widget時,其text裡的內容全部反白(selectAll 的動作),
第一個想到clicked()這個signal,不過沒有...
然後試試 focusInEvent 的 virtual function,大概如下:
void HexEdit::focusInEvent(QFocusEvent * event)
{
QLineEdit::focusInEvent(event);
selectAll();
}
結果還是不行,因為雖然有反白全部的內容,但在處理完focusInEvent後,應該會再處理mouse的event,所以等於在已經反白內容的QLineEdit上,點選,所以結果是沒有反白
最後試試bool eventFilter( QObject *target, QEvent *event ) 這個virtual function,加上installEventFilter(QObject *filterObj) 這個function,來抓 MouseButtonRelease 或 MouseButtonPress 的event,成功
HexEdit::HexEdit()
{
installEventFilter( this );
}
bool HexEdit::eventFilter( QObject *target, QEvent *event )
{
if( event->type() == QEvent::MouseButtonRelease)
{
selectAll();
return true;
}
return false;
}
過程中發現,其實用tab來切換focus到QLineEdit,其內容就會全部反白
Qt版本 4.4.3
相關資料
http://lists.trolltech.com/qt-interest/2004-07/thread01290-0.html
http://lists.trolltech.com/qt-interest/2007-01/thread00657-0.html
第一個想到clicked()這個signal,不過沒有...
然後試試 focusInEvent 的 virtual function,大概如下:
void HexEdit::focusInEvent(QFocusEvent * event)
{
QLineEdit::focusInEvent(event);
selectAll();
}
結果還是不行,因為雖然有反白全部的內容,但在處理完focusInEvent後,應該會再處理mouse的event,所以等於在已經反白內容的QLineEdit上,點選,所以結果是沒有反白
最後試試bool eventFilter( QObject *target, QEvent *event ) 這個virtual function,加上installEventFilter(QObject *filterObj) 這個function,來抓 MouseButtonRelease 或 MouseButtonPress 的event,成功
HexEdit::HexEdit()
{
installEventFilter( this );
}
bool HexEdit::eventFilter( QObject *target, QEvent *event )
{
if( event->type() == QEvent::MouseButtonRelease)
{
selectAll();
return true;
}
return false;
}
過程中發現,其實用tab來切換focus到QLineEdit,其內容就會全部反白
Qt版本 4.4.3
相關資料
http://lists.trolltech.com/qt-interest/2004-07/thread01290-0.html
http://lists.trolltech.com/qt-interest/2007-01/thread00657-0.html
2008年9月15日 星期一
linux 2.6 模組編譯
在演練Linux driver的過程中,需要一個核心樹來幫助編譯(讓程式可以引用核心function call. struct. type 和 macro等),知道核心提供哪些功能,
在Linux driver聖經版的內容中,作者都建議讀者能編譯一個新核心,給開發系統使用(註一),不過這樣很費時,且CD所附的核心樹常會沒法編譯(kernel-devel-2.6.15-1.2054_FC5.i686.rpm),
在以前linux 2.4的模組的演練上,我會直接從kernel.org 找一個適合的核心(和開發系統最接近的),然後將相關"Inclde 路徑"和 "Define" 設定好,就可以練習了(註二),所以基本上只引用核心樹裡 include/linux 和 include/asm 內的標頭檔,並沒有將開發系統的核心換掉,算是一個省時間且取巧的方法,
不過在linux 2.6上(註三),模組載入進核心,需要透過一個vermagic.o的目的檔去驗證,才可以通過,因此想著,如果可以產生適當的vermagic.o(modinfo所秀出來的資訊),應該就可以騙過核心,載入成功吧,
然而結果是,失敗...,所以只好乖乖的將整個開發系統的核心換掉,才能順利載入和卸載 "Hello world" 的範例,不過這過程也讓我知道核心設定的相關作用,在這裡紀錄一下...
底下是核心設定的細節在FC5上
目標是希望產生的模組,其vermagic : 2.6.15-1.2054_FC5 686 REGPARM 4KSTACKS gcc-4.1,是如此.....
核心盡量在最小的情況下編譯成功,產生所需要的vermagic.o的檔案,讓module可以連結
下載linux-2.6.15.tar.gz
核心設定:
修改核心樹最上層的Makefile(例如/usr/src/linux-2.6.15.1/Makefile),找到 EXTRAVERSION,
修改EXTRAVERSION = -1.2054_FC5
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL)
Loadabel module suppoer --->
[*]Enable loadable module support (CONFIG_MODULES)
為了產生 scripts/mod/modpost
[*] Module versioning support (EXPERIMENTAL) (CONFIG_MODVERSIONS)
為了 "no version for struct_module found" 的錯誤
[*] Source checksum for all modules (CONFIG_MODULE_SRCVERSION_ALL)
為了 "srcversion:",在modinfo秀出來
Processor type and features --->
[*] Use register arguments (EXPERIMENTAL) (CONFIG_PARAM)
為了產生vermagic的 "REGPARAM" 字串
Kernel hacking --->
[*]Kernel debugging (CONFIG_DEBUG_KERNEL)
[*] Use 4Kb for kernel stacks instead of 8Kb (CONFIG_4KSTACKS)
為了產生vermagic 的 "4KSTACKS"字串
註一:其實應該說給開發系統和目標系統使用,不過由於是練習,沒有跨平台編譯的問題,所以只提開發系統
註二:linux 2.4的module編譯方法,請參考linux driver 第二版
註三:linux 2.6的module編譯方法,請參考linux driver 第三版
在這裡是參考Gavin's Linux的說明,來做Linux的核心編譯,並置換開發系統的核心
修改核心樹最上層的Makefile,找到EXTRAVERSION,修改EXTRAVERSION = -test
cp -rf /boot/config-2.6.15-1.2054_FC5 /usr/src/linux-2.6.15/.config (用現在使用的核心的設定來覆蓋)
make oldconfig (只對之前沒有的核心選項提問)
make bzImage modules modules-install (這裡很耗時)
make install (將核心的 .config ,map ,vmlinuz 複製到/boot,並增加了grub.conf的選項)
修改/boot/grub/grub.conf, default=0 (因為它會插到最前面)
reboot,uname -r後,秀出 2.6.15-test,完成
相關連結: The Complete Fedora Kernel Headers
註:可惜太晚才找到這文章,這招也可以試試...
在Linux driver聖經版的內容中,作者都建議讀者能編譯一個新核心,給開發系統使用(註一),不過這樣很費時,且CD所附的核心樹常會沒法編譯(kernel-devel-2.6.15-1.2054_FC5.i686.rpm),
在以前linux 2.4的模組的演練上,我會直接從kernel.org 找一個適合的核心(和開發系統最接近的),然後將相關"Inclde 路徑"和 "Define" 設定好,就可以練習了(註二),所以基本上只引用核心樹裡 include/linux 和 include/asm 內的標頭檔,並沒有將開發系統的核心換掉,算是一個省時間且取巧的方法,
不過在linux 2.6上(註三),模組載入進核心,需要透過一個vermagic.o的目的檔去驗證,才可以通過,因此想著,如果可以產生適當的vermagic.o(modinfo所秀出來的資訊),應該就可以騙過核心,載入成功吧,
然而結果是,失敗...,所以只好乖乖的將整個開發系統的核心換掉,才能順利載入和卸載 "Hello world" 的範例,不過這過程也讓我知道核心設定的相關作用,在這裡紀錄一下...
底下是核心設定的細節在FC5上
目標是希望產生的模組,其vermagic : 2.6.15-1.2054_FC5 686 REGPARM 4KSTACKS gcc-4.1,是如此.....
核心盡量在最小的情況下編譯成功,產生所需要的vermagic.o的檔案,讓module可以連結
下載linux-2.6.15.tar.gz
核心設定:
修改核心樹最上層的Makefile(例如/usr/src/linux-2.6.15.1/Makefile),找到 EXTRAVERSION,
修改EXTRAVERSION = -1.2054_FC5
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL)
Loadabel module suppoer --->
[*]Enable loadable module support (CONFIG_MODULES)
為了產生 scripts/mod/modpost
[*] Module versioning support (EXPERIMENTAL) (CONFIG_MODVERSIONS)
為了 "no version for struct_module found" 的錯誤
[*] Source checksum for all modules (CONFIG_MODULE_SRCVERSION_ALL)
為了 "srcversion:",在modinfo秀出來
Processor type and features --->
[*] Use register arguments (EXPERIMENTAL) (CONFIG_PARAM)
為了產生vermagic的 "REGPARAM" 字串
Kernel hacking --->
[*]Kernel debugging (CONFIG_DEBUG_KERNEL)
[*] Use 4Kb for kernel stacks instead of 8Kb (CONFIG_4KSTACKS)
為了產生vermagic 的 "4KSTACKS"字串
註一:其實應該說給開發系統和目標系統使用,不過由於是練習,沒有跨平台編譯的問題,所以只提開發系統
註二:linux 2.4的module編譯方法,請參考linux driver 第二版
註三:linux 2.6的module編譯方法,請參考linux driver 第三版
在這裡是參考Gavin's Linux的說明,來做Linux的核心編譯,並置換開發系統的核心
修改核心樹最上層的Makefile,找到EXTRAVERSION,修改EXTRAVERSION = -test
cp -rf /boot/config-2.6.15-1.2054_FC5 /usr/src/linux-2.6.15/.config (用現在使用的核心的設定來覆蓋)
make oldconfig (只對之前沒有的核心選項提問)
make bzImage modules modules-install (這裡很耗時)
make install (將核心的 .config ,map ,vmlinuz 複製到/boot,並增加了grub.conf的選項)
修改/boot/grub/grub.conf, default=0 (因為它會插到最前面)
reboot,uname -r後,秀出 2.6.15-test,完成
相關連結: The Complete Fedora Kernel Headers
註:可惜太晚才找到這文章,這招也可以試試...
2008年7月31日 星期四
VMware 的網卡驅動
VMware 所模擬的網卡是AMD PCnet32,在linux-2.4.20 有包含這個driver,
linux-2.4.20的核心設定
General setup --->
[*] PCI support (CONFIG_PCI)
(Any) PCI access mode (CONFIG_PCI_GOBIOS)
[*]PCI device name database (CONFIG_PCI_NAMES)
因為這個網卡是接在PCI bus上
Network device support --->
[*] Network device support (CONFIG_NETDEVICES)
Ethernet (10 or 100Mbit) --->
[*] Ethernet(10 or 100Mbit) (CONFIG_NET_ETHERNET)
[*] EISA, VLB, PCI and on board controllers (CONFIG_NET_PCI)
[*] AMD PCnet32 PCI support (CONFIG_PCNET32)
這樣在開機時,Linux會自動偵測出網卡,然後利用ifconfig 和route 設定 IP 和 GATEWAY 的位址, DNS 可以利用resolv.conf 設定,但要注意 NSS (Name Service Switch) 如何提供
練習一下module的設置,
linux-2.4.20 核心設定
Loadable module support --->
[*] Enable loadable module support
[*] Set version information on all module symbols
[*] kernel module loader
其他和上面一樣,只有一個不一樣
<M> AMD PCnet32 PCI support (CONFIG_PCNET32)
對,就是這個設為module,有點廢話...
make moudles
會將設置為 <M>的選項,以modules的編譯參數編譯起來
make INSTALL_MOD_PATH=要建立root的絕對路徑 modules_install
將module放在"root的絕對路徑"/lib/module/`uname -r`/中,並產生一個叫modules.dep的檔案,,是用來告訴modprobe,要載入pcnet32.o前要先載入mii.o,語法有點像make,
其他相關的modules.XXX,都是空的,不過有一個叫modules.pcimap有些東東,還沒找到相關資料來了解其用途,
註:在做跨平台編譯,或者Linux最小化時,這個INSTALL_MOD_PATH要注意,是絕對路徑而沒法是相對路徑,是指向自己要建立root 的filesystem,
註: `uname -r` ==> 2.4.20
在/etc/下要有一個modules.conf,內容如下
alias eth0 pcnet32
還有busybox的module相關指令要加入, modprobe depmod lsmod insmod rmmod modinfo
因此當ifconfig eth0 192.168.8.19 up 時, 由於核心沒有eth0網路設備,就叫modprobe來載入module,首先modprobe檢查modules.conf,知道eth0的driver是pcnet32,然後再檢查modules.dep,得知要載入pcnet32.o前要先載入mii.o,來處理這個相關性,如此核心就知道怎樣處理eth0這個網路設備,完成這個連鎖反應....
其實一般PCI介面有所謂PnP的功能,這樣我們可以存著許多網卡driver,然後利用這機制得知到底要用哪一個driver,這樣才user friendly吧...
不過現在的工作主要在embedded linux,主要以精簡為目標,我想以後有機會再了解吧!!!
linux-2.4.20的核心設定
General setup --->
[*] PCI support (CONFIG_PCI)
(Any) PCI access mode (CONFIG_PCI_GOBIOS)
[*]PCI device name database (CONFIG_PCI_NAMES)
因為這個網卡是接在PCI bus上
Network device support --->
[*] Network device support (CONFIG_NETDEVICES)
Ethernet (10 or 100Mbit) --->
[*] Ethernet(10 or 100Mbit) (CONFIG_NET_ETHERNET)
[*] EISA, VLB, PCI and on board controllers (CONFIG_NET_PCI)
[*] AMD PCnet32 PCI support (CONFIG_PCNET32)
這樣在開機時,Linux會自動偵測出網卡,然後利用ifconfig 和route 設定 IP 和 GATEWAY 的位址, DNS 可以利用resolv.conf 設定,但要注意 NSS (Name Service Switch) 如何提供
練習一下module的設置,
linux-2.4.20 核心設定
Loadable module support --->
[*] Enable loadable module support
[*] Set version information on all module symbols
[*] kernel module loader
其他和上面一樣,只有一個不一樣
<M> AMD PCnet32 PCI support (CONFIG_PCNET32)
對,就是這個設為module,有點廢話...
make moudles
會將設置為 <M>的選項,以modules的編譯參數編譯起來
make INSTALL_MOD_PATH=要建立root的絕對路徑 modules_install
將module放在"root的絕對路徑"/lib/module/`uname -r`/中,並產生一個叫modules.dep的檔案,,是用來告訴modprobe,要載入pcnet32.o前要先載入mii.o,語法有點像make,
其他相關的modules.XXX,都是空的,不過有一個叫modules.pcimap有些東東,還沒找到相關資料來了解其用途,
註:在做跨平台編譯,或者Linux最小化時,這個INSTALL_MOD_PATH要注意,是絕對路徑而沒法是相對路徑,是指向自己要建立root 的filesystem,
註: `uname -r` ==> 2.4.20
在/etc/下要有一個modules.conf,內容如下
alias eth0 pcnet32
還有busybox的module相關指令要加入, modprobe depmod lsmod insmod rmmod modinfo
因此當ifconfig eth0 192.168.8.19 up 時, 由於核心沒有eth0網路設備,就叫modprobe來載入module,首先modprobe檢查modules.conf,知道eth0的driver是pcnet32,然後再檢查modules.dep,得知要載入pcnet32.o前要先載入mii.o,來處理這個相關性,如此核心就知道怎樣處理eth0這個網路設備,完成這個連鎖反應....
其實一般PCI介面有所謂PnP的功能,這樣我們可以存著許多網卡driver,然後利用這機制得知到底要用哪一個driver,這樣才user friendly吧...
不過現在的工作主要在embedded linux,主要以精簡為目標,我想以後有機會再了解吧!!!
2008年7月24日 星期四
udhcp and route 設定 for linux
在busybox-1.00-pre7,已經包含了udhcp 的client 和 server,
linux-2.4.20 核心設定
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL)
這個選項開放一些新的的功能或著實驗的選項,讓使用者可以選擇
General setup --->
[*] Networking support (CONFIG_NET)
這樣才有Networking Options ---> 和 Network device support ---> 這兩大選項
[*] Sysctl support (CONFIG_SYSCTL)
可以讓/proc下出現sys的子目錄,當然proc這個檔案系統要先開啟
Networking options --->
[*] Packet Socket (CONFIG_PACKET)
udhcpc 需要這個選項
[*]Unix domain sockets (CONFIG_UNIX)
使用netstat可以看到 Active UNIX domain sockets (w/o servers) 的列表,udhcpd 需要這個選項
[*] TCP/IP networking (CONFIG_INET)
可以在/proc/sys/下出現net/ipv4的子目錄,例如 echo "1" > /proc/sys/net/ivp4/net_ipforward ,linux才有路由的功能, 還有會擁有 lo 這個 loopback 網路裝置, 可以ping 自己!!!
Network device support --->
[*] Network device support (CONFIG_NETDEVICES)
基本上這個大選項,是在選擇網卡的dirver,不過在一些SOC的embedded system中,雖然廠商已經porting好了相關網路驅動,且放置在和晶片相關的選項中(廠商所分出的一個大選項),不過上面的 (CONFIG_NETDEVICES)還是要選,不然掛udhcpd會失敗,
udhcp 介紹:
udhcpc: 需要一個 script file, 注意是一個可執行的檔,不是設定檔,udhcpc利用shell 變數和 script file 做互動
udhcpd: 需要一個設定檔,這個設定檔可以指定相關的資訊的儲存檔案路徑
關於這些設定檔的參考,udhcpd可以參考 udhcpd.conf , udhcpc 可以參考這網站內的S50default
相關連結:
參考一
在udhcpc的script裡需要ifconfig和route指令(需要在busybox裡設定),還有一些相關的核心設定參數,在這裡紀錄一下
由於我的 embedded linux 有兩個網路介面(再加一個lo),所以也實驗了Router的設定linux-2.4.20 核心設定
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL)
這個選項開放一些新的的功能或著實驗的選項,讓使用者可以選擇
General setup --->
[*] Networking support (CONFIG_NET)
這樣才有Networking Options ---> 和 Network device support ---> 這兩大選項
[*] Sysctl support (CONFIG_SYSCTL)
可以讓/proc下出現sys的子目錄,當然proc這個檔案系統要先開啟
Networking options --->
[*] Packet Socket (CONFIG_PACKET)
udhcpc 需要這個選項
[*]Unix domain sockets (CONFIG_UNIX)
使用netstat可以看到 Active UNIX domain sockets (w/o servers) 的列表,udhcpd 需要這個選項
[*] TCP/IP networking (CONFIG_INET)
可以在/proc/sys/下出現net/ipv4的子目錄,例如 echo "1" > /proc/sys/net/ivp4/net_ipforward ,linux才有路由的功能, 還有會擁有 lo 這個 loopback 網路裝置, 可以ping 自己!!!
Network device support --->
[*] Network device support (CONFIG_NETDEVICES)
基本上這個大選項,是在選擇網卡的dirver,不過在一些SOC的embedded system中,雖然廠商已經porting好了相關網路驅動,且放置在和晶片相關的選項中(廠商所分出的一個大選項),不過上面的 (CONFIG_NETDEVICES)還是要選,不然掛udhcpd會失敗,
udhcp 介紹:
udhcpc: 需要一個 script file, 注意是一個可執行的檔,不是設定檔,udhcpc利用shell 變數和 script file 做互動
udhcpd: 需要一個設定檔,這個設定檔可以指定相關的資訊的儲存檔案路徑
關於這些設定檔的參考,udhcpd可以參考 udhcpd.conf , udhcpc 可以參考這網站內的S50default
相關連結:
參考一
2008年7月11日 星期五
MTD 測試
MTD 裝置通常是用來當作是Flash的裝置,若是系統沒有Flash可以測試,也可以用記憶體來模擬MTD裝置,以下紀錄核心, /dev, mtd-utils 的選擇和設定
linux 2.4.20 Kernel 設定
進入Memory Technology Devices (MTD) --->
[*] Memory Technology Devices (MTD) support (CONFIG_MTD)
[*] Direct char device access to MTD devices (CONFIG_MTD_CHAR)
[*] Caching block device access to MTD devices (CONFIG_MTD_BLOCK)
進入Self-contained MTD device drivers --->
[*]Test driver using RAM (CONFIG_MTD_MTDRAM)
(1024) MTDRAM device size in kiB (CONFIG_MTDRAM_TOTAL_SIZE)
(128) MTDRAM erase block size in kiB (CONFIG_MTDRAM_ERASE_SIZE)
/dev/mtdblock0 b 31 0
/dev/mtdblock1 b 31 1
/dev/mtdblock2 b 31 2
依序類推...
/dev/mtd0 c 90 0
/dev/mtd1 c 90 2
/dev/mtd2 c 90 4
依序類推...
mtd-utils-1.0.0 下載
發現一個問題:
mkfs.jffs2 -d test -o test.bin
dd if=test.bin of=/dev/mtdblock0
mount -t jffs2 /dve/mtdblock0 /mnt/flash
在最後一個步驟後會有錯誤訊息,研究一下,終於了解.....
既然是模擬Flash memory,有一個參數很重要,那就是 CONFIG_MTDRAM_ERASE_SIZE,所以使用mkfs.jffs2指令來產生image檔案時,必須 "mkfs.jffs2 -e0x20000 -d ./root -o test.bin",如此才能吻合RAM所模擬的FLASH memory
註: mkfs.jffs2 的參數 -e "size" 代表erase block的大小
一般實際有Flash的系統上,會利用CFI去偵測FLASH得到這些資訊
mtd-utils-1.0.0 裡,試過mkfs.jffs2. flash_erase. flash_eraseall 這三個命令
flash_eraseall 作用在 /dev/mtd0 會有問題.看一下flash_eraseall.c, grep bbtest=1,改成bbtest=0就可以了,這個修改是讓程式跳過bad block的檢查,我想應該是核心的MTD子系統沒有建置bad block check的機制,了解不多,不過至少可以用了.... :-)
linux 2.4.20 Kernel 設定
進入Memory Technology Devices (MTD) --->
[*] Memory Technology Devices (MTD) support (CONFIG_MTD)
[*] Direct char device access to MTD devices (CONFIG_MTD_CHAR)
[*] Caching block device access to MTD devices (CONFIG_MTD_BLOCK)
進入Self-contained MTD device drivers --->
[*]Test driver using RAM (CONFIG_MTD_MTDRAM)
(1024) MTDRAM device size in kiB (CONFIG_MTDRAM_TOTAL_SIZE)
(128) MTDRAM erase block size in kiB (CONFIG_MTDRAM_ERASE_SIZE)
/dev/mtdblock0 b 31 0
/dev/mtdblock1 b 31 1
/dev/mtdblock2 b 31 2
依序類推...
/dev/mtd0 c 90 0
/dev/mtd1 c 90 2
/dev/mtd2 c 90 4
依序類推...
mtd-utils-1.0.0 下載
發現一個問題:
mkfs.jffs2 -d test -o test.bin
dd if=test.bin of=/dev/mtdblock0
mount -t jffs2 /dve/mtdblock0 /mnt/flash
在最後一個步驟後會有錯誤訊息,研究一下,終於了解.....
既然是模擬Flash memory,有一個參數很重要,那就是 CONFIG_MTDRAM_ERASE_SIZE,所以使用mkfs.jffs2指令來產生image檔案時,必須 "mkfs.jffs2 -e0x20000 -d ./root -o test.bin",如此才能吻合RAM所模擬的FLASH memory
註: mkfs.jffs2 的參數 -e "size" 代表erase block的大小
一般實際有Flash的系統上,會利用CFI去偵測FLASH得到這些資訊
mtd-utils-1.0.0 裡,試過mkfs.jffs2. flash_erase. flash_eraseall 這三個命令
flash_eraseall 作用在 /dev/mtd0 會有問題.看一下flash_eraseall.c, grep bbtest=1,改成bbtest=0就可以了,這個修改是讓程式跳過bad block的檢查,我想應該是核心的MTD子系統沒有建置bad block check的機制,了解不多,不過至少可以用了.... :-)
訂閱:
文章 (Atom)