新增4個register,用來存放 sleep 時,retain的資料: INFORM0-3
PowerOff時,將SLEEPDATA_VASE_VIRTUAL 開始,SLEEPDATA_SIZE大小的data作checksum。 放在 INFORM3 中。
啟動後(reset),check這段區域否符合checksum。
4.28.2007
hybrid sensor locatioin intelligence
一篇Sirf VP的interview說到,他們正在設計一個混合GPS, Wifi 的location 裝置,有Wifi的情況下,利用Wifi 來彌補暫時GPS斷訊。
方法大概是這樣吧 (我鬼扯的)
裝置從P1 到P2到P3,在P3時失去GPS信號。
裝置可以藉由P1,P2時的GPS位置和AP1, AP2強度 (s1, s2, s1', s2')算出AP1, AP2的位置。
在P3的時候,用計算出的AP1, AP2位置,和P2時對AP1, AP2的信號強度(S1'', S2'')求出P3的位置。
從上圖可以知道,計算出的AP1, AP2會是對P1, P2移動線對稱的。
但是由P3信號時,對稱的兩側算出的結果會是一樣的。
除非...移動方向不是直線..
但是,因為AP的信號會受環境障礙的影響...所以...應該不會很準...(算不出來)。
Sirf說,今後的location sensor將會是hybrid sensor, 包含多種sensor (gps, wifi, gsm, rfid)。
方法大概是這樣吧 (我鬼扯的)
裝置從P1 到P2到P3,在P3時失去GPS信號。
裝置可以藉由P1,P2時的GPS位置和AP1, AP2強度 (s1, s2, s1', s2')算出AP1, AP2的位置。
在P3的時候,用計算出的AP1, AP2位置,和P2時對AP1, AP2的信號強度(S1'', S2'')求出P3的位置。
從上圖可以知道,計算出的AP1, AP2會是對P1, P2移動線對稱的。
但是由P3信號時,對稱的兩側算出的結果會是一樣的。
除非...移動方向不是直線..
但是,因為AP的信號會受環境障礙的影響...所以...應該不會很準...(算不出來)。
Sirf說,今後的location sensor將會是hybrid sensor, 包含多種sensor (gps, wifi, gsm, rfid)。
4.27.2007
?差異太大了吧?
0.1 和 1.0 版的datasheet竟然這麼大。
register的bit definition 完全不一樣。
IO Port Configuration Register部份,原來cofigur, data 是兩個register,現在改成一個register,每個pin站兩個bit,一個bit 是configure,一個bit是 data...
那...我拿到的這個sample是follow 0.1 還是 1.0 datasheet的sample ? @#$$
register的bit definition 完全不一樣。
IO Port Configuration Register部份,原來cofigur, data 是兩個register,現在改成一個register,每個pin站兩個bit,一個bit 是configure,一個bit是 data...
那...我拿到的這個sample是follow 0.1 還是 1.0 datasheet的sample ? @#$$
- PORT A : CON, DAT分開改為合併
- PORT B.C.D.E. G. H. J . L.M : 每個pin的兩個bit定義剛好相反
- PORT F : Pull Up/Down 控制改到另一個register (EXTINT0)
- PORT K : 整個刪掉
- MISCCR : 加入RSTCON
- EXTINT0. 1 : 塞入 GPF 的pull up/down 控制
- GSTATUS 3.4 : 整個刪掉
- DATAPDEN : 新增
4.25.2007
CAMERA Module
WINCE Serial Port
Serial 使用 serpddcm, com_mdd2 兩個library。
HW_INDEP_INFO 中的 pHWObj 指向 PDD object。
在 COM_Init 中,會由 GetSerialObject(DevIndex) 產生一個PDD Object 的"空殼"。
DevIndex 是由 registry key 中取出的。
GetSerialObject( ) 在 serpdd.cpp 中。
GetSerialObject( )除了allocate object 外,還initialize object,object 中重要的property是 pFuncTbl。
從名字就知道,pFuncTbl 是function table,宣告在 cserpdd.cpp 中。
名稱宣告和cserpdd.cpp中宣告的function table實體不一樣 (煙霧?)。
但是大概是把 開頭的"HW"改成"Ser"。
真正create出pdd實體的function 是 上面Funtion Table中的 HWInit( ),也就是 SerInit( )。
SerInit( )呼叫Platform\Driver\Serial\ser_xxx.cpp中的CreateSerialObject( )生出CSerialPDD物件。
被用來指定mcu上實體的serial port (port 0, 1, 2,,,etc)。
Send Data Out的calling route:
mdd.c : COM_Write : DoTxData
mdd.c : DoTxData : pFuncTbl->HWTxIntrHandler
經過 HW_VTBL , 指向 SerTxIntrEx
cserpdd.cpp : SerTxIntrEx : XmitInterruptHandler
XmitInterruptHandler 是 CSerialPDD 的virtual function。
實際的 platform pdd driver繼承自CSerialPDD,所以都要implement這個virtual function。
platform 的serial driver也分為兩個部份,因為通常target都不只一個serial port,所以利用 class 的方式 由parent class 產生許多實際的serial port class。
parent class : pddplatname.cpp : CPddPlatUart 繼承自 CSerialPDD
child class : ser_platname.cpp : CPddPlatSerial1[2.3....] 繼承自 CPddPlatUart
所以serial port的PDD有兩部分:
在 platform 的source code中有: CreateSerialObject ( ),依照argument生出對應的 platform object 。
另外 COM driver 是 uart和IR共用的,所以在IOControl 中有 IOCTL_SERIAL_ENABLE_IR 用設定該 COM port是IR還是uart使用。
該IOCTL 呼叫 pFuncTbl->HWEnableIR( )
HWEnableIR ( cserpdd.cpp : SerEnableIR ) 呼叫 pSerialPDD->SetOutputMode(TRUE, FALSE)
SetOutputMode (pddplatform_ser.cpp) 呼叫 ... platform implement 的 CPddPlatformUart :: SetBaudRate( ) ..
IR 和UART的差異除了baudrate generate不一樣外,還有UART是全雙工,可是IR半雙工。所以在 XmitInterruptHandler ( ) 中,作TX時,會呼叫Rx_Pause( )將Rx關閉。
並且由IR Setting bit (hardware register)決定,需不需要等TX complete,然後把RX再打開。
Rx_Pause( )也是一個Virtual function,所以實際implement時,如果該port 是要作 IR用,就要implement這個function (將RX關閉,打開)。
如果不作IR用,就不能implement這個function ,否則,因為 XmitInterruptHandler( )的行為,反而會使 Rx發生問題。
- Serpddcm : PUBLIC\COMMON\OAK\DRIVERS\SERIAL\SERPDDCM
- com_mdd2 : PUBLIC\COMMON\OAK\DRIVERS\SERIAL\COM_MDD2
HW_INDEP_INFO 中的 pHWObj 指向 PDD object。
在 COM_Init 中,會由 GetSerialObject(DevIndex) 產生一個PDD Object 的"空殼"。
DevIndex 是由 registry key 中取出的。
GetSerialObject( ) 在 serpdd.cpp 中。
GetSerialObject( )除了allocate object 外,還initialize object,object 中重要的property是 pFuncTbl。
從名字就知道,pFuncTbl 是function table,宣告在 cserpdd.cpp 中。
__HW_VTBL *pFuncTbl__HW_VTBL 宣告在 serhw.h (OAK\INC)。
名稱宣告和cserpdd.cpp中宣告的function table實體不一樣 (煙霧?)。
但是大概是把 開頭的"HW"改成"Ser"。
真正create出pdd實體的function 是 上面Funtion Table中的 HWInit( ),也就是 SerInit( )。
SerInit( )呼叫Platform\Driver\Serial\ser_xxx.cpp中的CreateSerialObject( )生出CSerialPDD物件。
MDD至此和PDD相關了。CreateSerialObject( )的argument : DeviceArrayIndex,是從registery讀出來的。
被用來指定mcu上實體的serial port (port 0, 1, 2,,,etc)。
switch(DeviceArrayIndex){所以修改registery中的DeviceArrayIndex,就可以改變comport mapping。
case 0:
pSerialPDD = new CPddXXXSerial1(...);
break;
case 1:
pSerialPDD = new CPddXXXSerial2(...);
break;
case 2:
pSerialPDD = new CPddXXXSerial3(...);
break;
}
return pSerialPDD;
Send Data Out的calling route:
mdd.c : COM_Write : DoTxData
mdd.c : DoTxData : pFuncTbl->HWTxIntrHandler
經過 HW_VTBL , 指向 SerTxIntrEx
cserpdd.cpp : SerTxIntrEx : XmitInterruptHandler
XmitInterruptHandler 是 CSerialPDD 的virtual function。
實際的 platform pdd driver繼承自CSerialPDD,所以都要implement這個virtual function。
platform 的serial driver也分為兩個部份,因為通常target都不只一個serial port,所以利用 class 的方式 由parent class 產生許多實際的serial port class。
parent class : pddplatname.cpp : CPddPlatUart 繼承自 CSerialPDD
child class : ser_platname.cpp : CPddPlatSerial1[2.3....] 繼承自 CPddPlatUart
所以serial port的PDD有兩部分:
- PUBLIC : CSerialPDD (virtual)
- Platform : CPddPlatUart/Serial (implement)
在 platform 的source code中有: CreateSerialObject ( ),依照argument生出對應的 platform object 。
另外 COM driver 是 uart和IR共用的,所以在IOControl 中有 IOCTL_SERIAL_ENABLE_IR 用設定該 COM port是IR還是uart使用。
該IOCTL 呼叫 pFuncTbl->HWEnableIR( )
HWEnableIR ( cserpdd.cpp : SerEnableIR ) 呼叫 pSerialPDD->SetOutputMode(TRUE, FALSE)
SetOutputMode (pddplatform_ser.cpp) 呼叫 ... platform implement 的 CPddPlatformUart :: SetBaudRate( ) ..
但是很奇怪的是 這個function 沒有refence enIR 這個argument。
IR 和UART的差異除了baudrate generate不一樣外,還有UART是全雙工,可是IR半雙工。所以在 XmitInterruptHandler ( ) 中,作TX時,會呼叫Rx_Pause( )將Rx關閉。
並且由IR Setting bit (hardware register)決定,需不需要等TX complete,然後把RX再打開。
Rx_Pause( )也是一個Virtual function,所以實際implement時,如果該port 是要作 IR用,就要implement這個function (將RX關閉,打開)。
如果不作IR用,就不能implement這個function ,否則,因為 XmitInterruptHandler( )的行為,反而會使 Rx發生問題。
4.24.2007
hijacj the TMC.
在這裡看到的新聞
一個叫 Inverse Path 的j network security 公司,解開了.歐洲地區的 RDS TMC (Radio Data System - Traffic Message Channel),也就是交通路況廣播。
在他的sRDSd (Simple RDS decoder) Opensource 專案中,提供他們hack的decoder,利用這個decoder,可以取出RDS TMC的資料,更有甚者,可以broadcast fake TMC 。
專案(sRDSd)的內容真是太仔細了,可以download那個51 page 的pdf 下來看。
一開始說明RDS/TMC 系統:
Project中含一個小script,可以從serial port將上面說名的TMC data顯示在google map上。
OK,開始邪的部份 : Injection.
就是將traffic message加入FM readio 中發射出去,讓有TMC得的導航裝置收到這個假的信息。
project 中成功的讓那台裝有SatNav導航裝置的Honda收到:
事實上,這家公司只是為了說明,沒有加密的protocol是多麼的不安全(可靠)。
附帶一題,該公司是support opensource的,所以上述專案的所有program(包含電路圖)都是open source的。
一個叫 Inverse Path 的j network security 公司,解開了.歐洲地區的 RDS TMC (Radio Data System - Traffic Message Channel),也就是交通路況廣播。
在他的sRDSd (Simple RDS decoder) Opensource 專案中,提供他們hack的decoder,利用這個decoder,可以取出RDS TMC的資料,更有甚者,可以broadcast fake TMC 。
專案(sRDSd)的內容真是太仔細了,可以download那個51 page 的pdf 下來看。
一開始說明RDS/TMC 系統:
使用FM signal,57k sideband作數位傳輸。sniffing RDS:
利用Philips FM1216 TV Tuner來作,使用TDA7330B 作demodulation,用PIC作decoding。說明RDS protocol 。
Project中含一個小script,可以從serial port將上面說名的TMC data顯示在google map上。
OK,開始邪的部份 : Injection.
就是將traffic message加入FM readio 中發射出去,讓有TMC得的導航裝置收到這個假的信息。
project 中成功的讓那台裝有SatNav導航裝置的Honda收到:
- Queue Traffice
- Closing Road
- Security Messages : Terrorist Incident (?), Air Raid, Air Crash, Bomb(?),
- Bull fight,
事實上,這家公司只是為了說明,沒有加密的protocol是多麼的不安全(可靠)。
附帶一題,該公司是support opensource的,所以上述專案的所有program(包含電路圖)都是open source的。
VirtualBox NAT : X32 Wifi no work
使用 VirtualBox Install Ubuntu 7.04,安裝還算OK。
但是網路部份有大問題,我用NAT,用X32的 Wifi card。
結果造成 X32 的wireless function 不work,X32 的function key : Fn - F5 失效。
只好把VirtualBox移除,然後用"Access IBM - Thinkpad Software Installer"重新install所有driver。
當然,安裝完後,所有Wifi preference都要重新設定。
其實剛裝好時,Wifi還OK,但是VirtualBox的network一直出不去,所以我一直設定Wifi 為share,一直失敗,然後還設bridge,最後重開機,Wifi Function Key 掛點!
VMWare會比較好嗎? 沒在X32上試過。
紀錄一下,VirtualBox default的 HD 放置folder是在
解除安裝時,不會自動刪除。
但是網路部份有大問題,我用NAT,用X32的 Wifi card。
結果造成 X32 的wireless function 不work,X32 的function key : Fn - F5 失效。
只好把VirtualBox移除,然後用"Access IBM - Thinkpad Software Installer"重新install所有driver。
當然,安裝完後,所有Wifi preference都要重新設定。
其實剛裝好時,Wifi還OK,但是VirtualBox的network一直出不去,所以我一直設定Wifi 為share,一直失敗,然後還設bridge,最後重開機,Wifi Function Key 掛點!
VMWare會比較好嗎? 沒在X32上試過。
紀錄一下,VirtualBox default的 HD 放置folder是在
C:\Document and Settings\yourname\.VirtualBox\VDI有一個"."喔。
解除安裝時,不會自動刪除。
4.18.2007
4.17.2007
USB Enumeration Log - Mass Storage
R 80 6 0 1 0 0 40 0
T 12 1 0 2 0 0 0 40 5E 4 FF FF 0 0 1 2 2 1
R 0 5 47 0 0 0 0 0
R 80 6 0 1 0 0 12 0
T 12 1 0 2 0 0 0 40 5E 4 FF FF 0 0 1 2 2 1
R 80 6 0 2 0 0 9 0
T 9 2 20 0 1 1 0 C0 0 9
R 80 6 0 3 0 0 FF 0
T 4 3 9 4
R 80 6 2 3 9 4 FF 0
T 7C 3 47 0 65 0 6E 0 65 0 72 0 69 0 63 0 20 0 4D 0 61 0 73 0 73 0 20 0 53 0 74 0 6F 0 72 0
61 0 67 0 65 0 20 0 28 0 50 0 52 0 4F 0 54 0 4F 0 54 0 59 0 50 0 45 0
T 2D 0 2D 0 52 0 65 0 6D 0 65 0 6D 0 62 0 65 0 72 0 20 0 74 0 6F 0 20 0 63 0 68 0 61 0 6E 0
67 0 65 0 20 0 69 0 64 0 56 0 65 0 6E 0 64 0 6F 0 72 0 29 0
R 80 6 0 2 0 0 FF 0
T 9 2 20 0 1 1 0 C0 0 9 4 0 0 2 8 6 50 0 7 5 81 2 0 2 0 7 5 2 2 0 2 0
R 80 6 0 3 0 0 FF 0
T 4 3 9 4
R 80 6 2 3 9 4 FF 0
T 7C 3 47 0 65 0 6E 0 65 0 72 0 69 0 63 0 20 0 4D 0 61 0 73 0 73 0 20 0 53 0 74 0 6F 0 72 0
61 0 67 0 65 0 20 0 28 0 50 0 52 0 4F 0 54 0 4F 0 54 0 59 0 50 0 45 0
T 2D 0 2D 0 52 0 65 0 6D 0 65 0 6D 0 62 0 65 0 72 0 20 0 74 0 6F 0 20 0 63 0 68 0 61 0 6E 0
67 0 65 0 20 0 69 0 64 0 56 0 65 0 6E 0 64 0 6F 0 72 0 29 0
R 80 6 0 3 0 0 FF 0
T 4 3 9 4
R 80 6 2 3 9 4 FF 0
T 7C 3 47 0 65 0 6E 0 65 0 72 0 69 0 63 0 20 0 4D 0 61 0 73 0 73 0 20 0 53 0 74 0 6F 0 72 0
61 0 67 0 65 0 20 0 28 0 50 0 52 0 4F 0 54 0 4F 0 54 0 59 0 50 0 45 0
T 2D 0 2D 0 52 0 65 0 6D 0 65 0 6D 0 62 0 65 0 72 0 20 0 74 0 6F 0 20 0 63 0 68 0 61 0 6E 0
67 0 65 0 20 0 69 0 64 0 56 0 65 0 6E 0 64 0 6F 0 72 0 29 0
R 80 6 0 1 0 0 12 0
T 12 1 0 2 0 0 0 40 5E 4 FF FF 0 0 1 2 2 1
R 80 6 0 2 0 0 9 0
T 9 2 20 0 1 1 0 C0 0 9
R 80 6 0 2 0 0 20 0
T 9 2 20 0 1 1 0 C0 0 9 4 0 0 2 8 6 50 0 7 5 81 2 0 2 0 7 5 2 2 0 2 0
R 80 6 0 3 0 0 2 0
T 4 3
R 80 6 0 3 0 0 4 0
T 4 3 9 4
R 80 6 2 3 9 4 2 0
T 7C 3
R 80 6 2 3 9 4 7C 0
T 7C 3 47 0 65 0 6E 0 65 0 72 0 69 0 63 0 20 0 4D 0 61 0 73 0 73 0 20 0 53 0 74 0 6F 0 72 0
61 0 67 0 65 0 20 0 28 0 50 0 52 0 4F 0 54 0 4F 0 54 0 59 0 50 0 45 0
T 2D 0 2D 0 52 0 65 0 6D 0 65 0 6D 0 62 0 65 0 72 0 20 0 74 0 6F 0 20 0 63 0 68 0 61 0 6E 0
67 0 65 0 20 0 69 0 64 0 56 0 65 0 6E 0 64 0 6F 0 72 0 29 0
R 0 9 1 0 0 0 0 0
R A1 FE 0 0 0 0 1 0
T 0 0
..
SetProcPermissions
每個process有自己的記憶體空間,Kernel 會確保process無法隨意的access其他process的空間。
Driver常常需要存取caller process的記憶體空間,傳遞參數。
這時候就要用
這個function 的 argument是DWORD。
其中一個 bit代表一個process。
bit是1代表對該 process的記憶體空間有存取權。
所以5.0 的process數限制是32 ?
附帶一提,要知道目前自己的存取全,可以用
Driver常常需要存取caller process的記憶體空間,傳遞參數。
這時候就要用
SetProcPermissions (perms)變更自己的存取權限。
這個function 的 argument是DWORD。
其中一個 bit代表一個process。
bit是1代表對該 process的記憶體空間有存取權。
所以5.0 的process數限制是32 ?
附帶一提,要知道目前自己的存取全,可以用
GetCurrentPermissions
4.16.2007
manually build usb mdd+pdd
run platform builder的 sysgen - 要花40min.
所以每次modify-build-test的cycle會浪費很多時間在build上。
所以就要手動作build動作,以下是usb mdd的手動.
usb mdd 的source code 在
然後到 %_TARGETPLATROOT%\SRC\Drivers\USB\.. 下,作
最後,作 make image,重新產生 image 。
這樣作,只要2min就夠了,可以減少你浪費的生命
怎麼知道sysgen 後要下 ufnmdd 呢 ?
看 MDD folder下的source 可以看到target name,然後再看看 pdd 的source,需要 ufnmdd.lib。
然後下下看會不會fault,
成功的化,到workspace, rel\lib 下看看ufnmdd.lib 的timetag 有沒有更新..
也就是說....完全用猜的..
platefoem builder的build process真是隱晦不明呀!!
所以每次modify-build-test的cycle會浪費很多時間在build上。
所以就要手動作build動作,以下是usb mdd的手動.
usb mdd 的source code 在
PUBLIC\COMMON\OAK\DRIVERS\USBFN\CONTROLLER\MDD修改後,在這個folder下作
build -c然後run
sysgen -p common ufnmdd就會產生ufnmdd.lib 在 workspace的 rel\lib 中。
然後到 %_TARGETPLATROOT%\SRC\Drivers\USB\.. 下,作
build -c將pdd 和 mdd link成 usb driver。
最後,作 make image,重新產生 image 。
這樣作,只要2min就夠了,可以減少你浪費的生命
怎麼知道sysgen 後要下 ufnmdd 呢 ?
看 MDD folder下的source 可以看到target name,然後再看看 pdd 的source,需要 ufnmdd.lib。
然後下下看會不會fault,
成功的化,到workspace, rel\lib 下看看ufnmdd.lib 的timetag 有沒有更新..
也就是說....完全用猜的..
platefoem builder的build process真是隱晦不明呀!!
4.15.2007
debian ruby
大概是follow 這個..
但是這個沒有command line interpreter,所以還要裝
然後ruby 也有和 Perl 的CPAN一樣的東西 - gems
#aptitude install ruby然後
#ruby -v
ruby 1.8.5 (2006-08-25) [i486-linux]
但是這個沒有command line interpreter,所以還要裝
#aptitude install irb就可以啟動interpreter
#irbexit 就可以退出。
irb(main):001:0>
然後ruby 也有和 Perl 的CPAN一樣的東西 - gems
#aptitude install rubygems
backup of ftp.tw.debian.org
最近Debian 4.0 出來了。
所以最近用 ftp.tw.debian.org 來 apt update 都會timeout. (有關係嗎?)
在moto 學園 有說..可以用
http://mirror.nttu.edu.tw/
嗯,可惜這個mirror site沒有 src.
所以最近用 ftp.tw.debian.org 來 apt update 都會timeout. (有關係嗎?)
在moto 學園 有說..可以用
http://mirror.nttu.edu.tw/
嗯,可惜這個mirror site沒有 src.
4.08.2007
UML 沒有開啟xterm.
Run UML, 然後出現4個xterm,每個都有
在 User Mode Linux HOWTO 中 : xterms appear, then immediately disappear.
原來是缺了port-helper 這個file,是在 /Project/bin 中,但是我有 project 這個folder。
我連 uml_utility 這個package.都沒裝。
這一篇有Debian 上run UML 的說明,雖然有點舊了.. 2004 的。
這一篇也是,比較新的,中文的。
Can't find the execpt of port-helper
在 User Mode Linux HOWTO 中 : xterms appear, then immediately disappear.
If you're running an up to date kernel with an old release of uml_utilities,
the port-helper program will not work properly,
so xterms will exit straight after they appear.
The solution is to upgrade to the latest release of uml_utilities.
Usually this problem occurs when you have installed a packaged release of UML then compiled your own development kernel without upgrading the uml_utilities from the source distribution.
原來是缺了port-helper 這個file,是在 /Project/bin 中,但是我有 project 這個folder。
我連 uml_utility 這個package.都沒裝。
這一篇有Debian 上run UML 的說明,雖然有點舊了.. 2004 的。
這一篇也是,比較新的,中文的。
4.06.2007
CPU 100% , Dos in VMWARE
TONY 在VMWare上run Dos,會造成host cpu useage 滿載。
想不到,在qemu 的document中竟然有解法 :
再紀錄一下,這個Link已經失效了,Google一下dosidle才發現原來這是一個shareware.... 並不是VMWare的patch.
想不到,在qemu 的document中竟然有解法 :
3.11.3.1 CPU usage reduction
DOS does not correctly use the CPU HLT instruction. The result is that it takes host CPU cycles even when idle. You can install the utility from http://www.vmware.com/software/dosidle210.zip to solve this problem.
紀錄一下。
再紀錄一下,這個Link已經失效了,Google一下dosidle才發現原來這是一個shareware.... 並不是VMWare的patch.
4.05.2007
need memory
因為同事在念 "自己動手寫作業系統",所以推薦 orz microkernel 給他。
所以也要在自己的機器上run一下。
結果:
結果是..
這個,,, 事後孔明,看圖說故事:
這還可以繼續實驗,看看網罩的孔徑與耗油的關係。
其實,我想 拆掉 尾門,車重減輕,減少的油耗應該比較大吧。
所以也要在自己的機器上run一下。
結果:
- 在XP上用qemu :run 不起來
- 在colinux上用qemu : 要有足夠的ram。才能正確run 到 shell prompt. - 要啟動swap.
結果是..
- 拆除尾門,裝上網罩最省油,省5%。
- 將尾門放下最費油。
這個,,, 事後孔明,看圖說故事:
- 將尾門放下,車頭造成的尾流區應該是最大,drag最大,所以最費油。
- 將尾門合起,尾流區會分為兩部份 : 車頭,尾門。drag變小。
- 尾們上打洞,會尾門的尾流區變小,drag變小。
這還可以繼續實驗,看看網罩的孔徑與耗油的關係。
其實,我想 拆掉 尾門,車重減輕,減少的油耗應該比較大吧。
OrzLab - 有趣的embedded system
一個以embedded system 為主的lab 誕生了 (實際上,已經誕生很久了)。
OrzLab
成立的目的我不太會說,不過內容都是一些有趣的東西,Lab 的blog 有一些文章..
而且這個Lab 不是只開案,不實作,而是將有實際進度的專案才公開出來。
每個都符合opensource的精神,SourceCode也都在sourceforge中公開。
有問題還可以到 Lab 的groupe 發問。
有興趣動手實做的,這個 Lab 的內容可以讓你玩好幾天。
說這麼多,去blog看看,就知道內容有多豐富有趣了。
感想:
以往作embedded system,第一個麻煩就是target board,要買到target board,才有機會繼續,否則一步都無法前進。
而target board的價格都不是單純"有興趣",就買得起。
現在OrzLab 的各項模擬器研究,就可以讓你先在軟體模擬器上實驗,當然,藉由模擬器,也可以進一步瞭解hardware的動作 (甚至kernel 的行為)。
真是方便多啦,希望作embedded system 人能因此而多了起來。
OrzLab
成立的目的我不太會說,不過內容都是一些有趣的東西,Lab 的blog 有一些文章..
- OpenMoko\Neo1973 硬體模擬
- 可攜式造字引擎
- 視覺化系統模擬與偵錯
- Lightweight kHTTPd for Linux Kernel
- Intel/Marvell PXA27X 系統模擬
- PXA27x Linux
- RTLinux
而且這個Lab 不是只開案,不實作,而是將有實際進度的專案才公開出來。
每個都符合opensource的精神,SourceCode也都在sourceforge中公開。
有問題還可以到 Lab 的groupe 發問。
有興趣動手實做的,這個 Lab 的內容可以讓你玩好幾天。
說這麼多,去blog看看,就知道內容有多豐富有趣了。
感想:
以往作embedded system,第一個麻煩就是target board,要買到target board,才有機會繼續,否則一步都無法前進。
而target board的價格都不是單純"有興趣",就買得起。
現在OrzLab 的各項模擬器研究,就可以讓你先在軟體模擬器上實驗,當然,藉由模擬器,也可以進一步瞭解hardware的動作 (甚至kernel 的行為)。
真是方便多啦,希望作embedded system 人能因此而多了起來。
4.04.2007
MLC nand flash
MLC和SLC有什麼不同 (使用上) ?
好像也就只有這個。google了半天,也沒有人說明partial programming是什麼?還有為甚麼MLC不行?
只有一篇有說.. MLC 上對同一page的某個sector作write動作時,會 "cause failure distribute" 。
是說 ?寫這個sector會影響到同page的其他sector ?
這一篇 :
那,SLC哪裡用到partial programming ?
大概是FTL吧,以前就懷疑 spare area部份有用到 flash 允許將1寫成0的特性,來mark "dirty" page.但是CE是沒有source code,所以僅只於猜測。
在這一篇,有一句
所以?是猜對囉。
所以現有的CE block driver不適用MLC。如果要支援,連FTL都要重新寫過...
opensource 還是比較好.. YFFS2 已經支援這個,在Wiki中有提到..
有關 nandflash, ecc, wear leveling , bad block management.
MICRO 的網站有一系列 application note 說明:
http://www.micron.com/products/nand_flash/clearnand.html
順帶推銷一下,他們的 ClearNand - with on-die ECC 的 Nand.
* 這個很不錯 (? 如果 price 沒增加的話), 因為 Nand ECC bit 增加的速度太外,Application Processor 跟本追不上,常常面臨, 開發完成,nand已經換代的問題。
不允許 "partial programming" ?
好像也就只有這個。google了半天,也沒有人說明partial programming是什麼?還有為甚麼MLC不行?
只有一篇有說.. MLC 上對同一page的某個sector作write動作時,會 "cause failure distribute" 。
是說 ?寫這個sector會影響到同page的其他sector ?
這一篇 :
最近改Nand driver,從SLC改為支持MLC。難道就是這個原因 ?
但改完了發現一個問題:
1、全部先擦一遍
2、連續寫20個Page,每一個Page都是2K內容 + 64Byte的OOB
(此時若將這20個Page讀出來,發現全部都是正確的)
3、將前8個Page的OOB部分寫入一些信息
(此時是只寫OOB)
4、再將這20個Page讀出來,發現有些Page的內容都不對了,包括後面12個Page中也有些內容不對了。
問題就是這樣。
我知道MLC的Page+OOB需要一次寫入,所以每次寫Page時都是2K內容 + 64Byte的OOB,第3步執行完後,我想MLC不至於將原來的Page內容也就弄錯掉了吧。
想請問,單獨寫入MLC的OOB部分,會不會將這個Page的內容弄亂?會不會將其他Page的內容弄亂?還是都不會亂,是我程序的問題?
請達人幫忙看下!
那,SLC哪裡用到partial programming ?
大概是FTL吧,以前就懷疑 spare area部份有用到 flash 允許將1寫成0的特性,來mark "dirty" page.但是CE是沒有source code,所以僅只於猜測。
在這一篇,有一句
....... much like the way translation layers work for single-bit-per-cell flash memories.
所以?是猜對囉。
所以現有的CE block driver不適用MLC。如果要支援,連FTL都要重新寫過...
opensource 還是比較好.. YFFS2 已經支援這個,在Wiki中有提到..
Each page within a block must be written to in sequential order, and each page must be written only once. YAFFS2 was designed to accommodate these newer chips.這不就是MLC的限制嗎?
有關 nandflash, ecc, wear leveling , bad block management.
MICRO 的網站有一系列 application note 說明:
http://www.micron.com/products/nand_flash/clearnand.html
順帶推銷一下,他們的 ClearNand - with on-die ECC 的 Nand.
* 這個很不錯 (? 如果 price 沒增加的話), 因為 Nand ECC bit 增加的速度太外,Application Processor 跟本追不上,常常面臨, 開發完成,nand已經換代的問題。
4.01.2007
X on colinux
果然,要run remote X,client 端不用install X server。
用Debian 最簡單,就install 你要run 的X Client ,例如..Xterm。
然後,設定環境變數 DISPLAY
X Server那台機器,install Xming,啟動XLaunch, MultiWindow Mode,display numbert:0。
Start no client。
接下來,在debian 上run Xterm& 就可以了。
這果然是在colinux上run X最簡單的方式。
依照往例,會有一些問題:
這是因為XP的firewall的關係,關掉後就ping得到了。
還有,XLaunch 中有一項 "No Access Control",把他enable就可以。
還要注意一下,colinux啟動後,host會有兩個ip,Xming 不知道lisent 哪一個。
可以開啟 Xming "View log"看看。
用Debian 最簡單,就install 你要run 的X Client ,例如..Xterm。
然後,設定環境變數 DISPLAY
export DISPLAY=192.168.0.1:0192.168.0.1 就是我要run X Server的機器的IP。
X Server那台機器,install Xming,啟動XLaunch, MultiWindow Mode,display numbert:0。
Start no client。
接下來,在debian 上run Xterm& 就可以了。
這果然是在colinux上run X最簡單的方式。
依照往例,會有一些問題:
Can't open display: 192.168.0.1:0然後ping也ping不到。
這是因為XP的firewall的關係,關掉後就ping得到了。
還有,XLaunch 中有一項 "No Access Control",把他enable就可以。
還要注意一下,colinux啟動後,host會有兩個ip,Xming 不知道lisent 哪一個。
可以開啟 Xming "View log"看看。
訂閱:
文章 (Atom)