基于WINCE6.0下载multiple XIP镜像文件
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時間:2012.03.14
類別:WINCE系統(tǒng)開發(fā)
********************************LoongEmbedded********************************
?
備注:基于usb下載的方式,MLC nand flash為K9G8G08U
?
1.????? Multiple XIP模式的文件說明
Multiple XIP模式下生成的文件有chain.bin、chain.lst、NK.bin、xip.bin和xipkernel.bin,如下圖所示:
?
圖1
2.????? Eboot下載Multiple XIP鏡像文件的順序
下載chain.lst文件, chain.lst文件定義了要把哪些bin文件下載到flash上,以及這些bin文件的下載順序,我們用UltraEdit打開chain.lst文件,內(nèi)容如下:
+XIPKERNEL.bin
NK.bin
chain.bin
表示要把這些bin文件下載到NAND FLASH中,依次下載XIPKERNEL.bin、NK.bin和chain.bin。
然后Eboot會根據(jù)lst文件自動下載XIPKERNEL.bin和NK.bin及chain.bin文件,然后會啟動WinCE6.0系統(tǒng);
3.????? Eboot下載Multiple XIP鏡像文件的具體實(shí)現(xiàn)
在按下鍵盤的U之后,eboot進(jìn)入接收PC機(jī)通過usb下載鏡像文件到RAM的狀態(tài)中,PC機(jī)下載鏡像文件到RAM的那塊區(qū)域范圍呢?這由eboot.bib文件指定:
USB_BUF????????? 83000000???????? 03000000???????? RESERVED
?
圖2
這里指定可以下載的鏡像文件的最大大小為0x03000000=48MB,如果要調(diào)整此大小,eboot中對應(yīng)的大小也要相應(yīng)修改。
?
3.1?? DNW v0.60C.exe軟件的處理機(jī)制
?
DNW v0.60C.exe和eboot是如何配置來下載multiple XIP鏡像文件的呢?在選擇DNW v0.60C.exe的“USB port->UBOOT->UBOOT”選擇chain.lst下載的時候,DNW軟件獲取到chain.lst文件的路徑及其內(nèi)容,知道要下載的鏡像文件有xipkernel.bin、nk.bin和chain.bin(總共3個bin文件),然后依次打開這三個文件來獲取它們的起始地址、長度和名稱,這些信息用結(jié)構(gòu)體MultiBINInfo來描述:
?
圖3
獲取到這些信息后計(jì)算其校驗(yàn)碼,接著創(chuàng)建ubootimage.ubi文件,然后把這些信息主要用MultiBINInfo結(jié)構(gòu)體的方式填寫在ubootimage.ubi文件的前面,緊接著依次把xipkernel.bin、nk.bin和chain.bin文件的內(nèi)容填寫到ubootimage.ubi文件MultiBINInfo結(jié)構(gòu)體描述的信息后面,然后把ubootimage.ubi文件通過usb的方式發(fā)送到指定的RAM地址處,下圖是此文件前面的內(nèi)容:
?
圖4
下面是ubootimage.ubi文件后面緊接著的一部分內(nèi)容:
?
圖5
這樣可以總結(jié)出ubootimage.ubi文件的格式如下:
?
圖6
3.2?? Eboot支持multiple XIP鏡像文件下載的處理機(jī)制
3.2.1???????? Eboot解壓鏡像文件到指定的RAM地址空間
當(dāng)我們按下鍵盤的U按鍵時,eboot進(jìn)入調(diào)用DownloadImage函數(shù)的流程,下面就來看這個函數(shù)(我把一些暫時無關(guān)的去掉了):
?
圖7
下面就分別介紹這些函數(shù):
⑴ GetImageType()函數(shù)通過去讀鏡像文件的頭7個magic number字節(jié)來獲取當(dāng)前要下載的WNCE鏡像文件的格式,WINCE6.0 eboot支持下載的文件格式有下面幾種:
“N000FF\X0A”——BL_IMAGE_TYPE_MANIFEST
“X000FF\X0A”——BL_IMAGE_TYPE_MULTIXIP
“B000FF\X0A”——BL_IMAGE_TYPE_BIN
“S000FF\X0A”——BL_IMAGE_TYPE_SIGNED_BIN
“R000FF\X0A”——BL_IMAGE_TYPE_SIGNED_NB0
無特征碼——BL_IMAGE_TYPE_UNKNOWN
當(dāng)前我們下載ubootimage.ubi文件是BL_IMAGE_TYPE_MANIFEST格式的,見圖4。
GetImageType()函數(shù)會調(diào)用到一個非常重要的函數(shù),如下圖:
?
圖8
?
⑵CheckImageManifest()函數(shù)主要用于獲取要下載的multiple XIP鏡像文件xipkernel.bin、nk.bin和chain.bin的MultiBINInfo結(jié)構(gòu)體信息的校驗(yàn)碼,并且進(jìn)行校驗(yàn)。
?
圖9
⑶DownloadBin()函數(shù)從RAM的0x83000333地址處依次讀取xipkernel.bin,nk.bin和chain.bin的內(nèi)容到config.bib中指定的RAM的內(nèi)存處,這需要結(jié)合config.bib中的配置理解,eboot從RAM中解壓鏡像文件到RAM中其他地址處的示意圖如下:
?
圖10
下面來解讀DownloadBin()函數(shù):
①讀取鏡像文件(第一個是xipkernel.bin)被解壓到RAM中起始地址,此鏡像文件實(shí)際有效數(shù)據(jù)的長度。
?
圖11
⑵對當(dāng)前解壓的鏡像文件在RAM中的起始地址和長度檢驗(yàn),如果沒有在config.bib指定的范圍之內(nèi),則會出錯。
?
圖12
③循環(huán)讀取當(dāng)前鏡像文件,直到讀取到最后一個record,最后一個record的dwRecAddr 和dwRecChk 值都為0x00000000,由此可以判斷是否到了最后一個record。
?
圖13
?
圖14
?
圖15
④判斷當(dāng)前下載的鏡像文件是否包含”CECE”以及是否包含nk.exe模塊,并且記錄下此文件被加載到RAM中的起始地址,文件長度和文件開始執(zhí)行。
?
圖16
這里有必要分析IsKernelRegion的函數(shù)體
?
圖17
TOCentry結(jié)構(gòu)體的定義如下:
typedef struct TOCentry {?????????? // MODULE BIB section structure
??? DWORD dwFileAttributes;
??? FILETIME ftTime;
??? DWORD nFileSize;
??? LPSTR?? lpszFileName;
??? ULONG?? ulE32Offset;??????????? // Offset to E32 structure
??? ULONG?? ulO32Offset;??????????? // Offset to O32 structure
??? ULONG?? ulLoadOffset;?????????? // MODULE load buffer offset
} TOCentry, *LPTOCentry;
另外為更好去理解,給出xipkernel.bin中ROMHDR和TOCentry結(jié)構(gòu)體描述的數(shù)據(jù)
?
圖18
?
這樣,圖7中執(zhí)行了3此的do…while()循環(huán)后,就把xipkernel.bin、nk.bin和chain.bin解壓到RAM中了,接下來就可以寫到flash中。
?
3.2.2???????? Eboot把解壓的鏡像文件寫到flash中
當(dāng)eboot把鏡像文件解壓到指定的RAM地址空間之后,接下來就是要把解壓后的鏡像文件燒錄到flash中,這個處理流程回到eboot的主流程控制函數(shù)BootloaderMain的下面部分:
?
圖19
下面我們來看OEMLaunch函數(shù)在下載系統(tǒng)鏡像文件和啟動所用到的部分:
?
圖20
下面就分別分析WriteOSImageToBootMedia函數(shù):
⑴計(jì)算MBR開始的邏輯扇區(qū)數(shù),并且為MBR格式化指定block數(shù)量的flash大小。
?
圖21
⑵找出包含nk.exe模塊的bin文件中ROM擴(kuò)展數(shù)據(jù)及獲取chain.bin在RAM中的起始地址和chain.bin文件的實(shí)際長度。
?
圖22
結(jié)合xipkernel.bin中下圖的內(nèi)容可以更好理解。
?
圖23
typedef struct ROMPID {
? union{
??? DWORD dwPID[PID_LENGTH];??????? // PID
??? struct{
????? char? name[(PID_LENGTH - 4) * sizeof(DWORD)];
???? ?DWORD type;
????? PVOID pdata;
????? DWORD length;
????? DWORD reserved;
??? };
? };
? PVOID pNextExt;???????????????? // pointer to next extension if any
} ROMPID, EXTENSION;
?
typedef struct _XIPCHAIN_SUMMARY {
??? LPVOID? pvAddr;???????????????? // address of the XIP
??? DWORD?? dwMaxLength;??????????? // the biggest it can grow to
??? USHORT? usOrder;??????????????? // where to put into ROMChain_t
??? USHORT? usFlags;??????????????? // flags/status of XIP
??? DWORD?? reserved;?????????????? // for future use
}XIPCHAIN_SUMMARY, *PXIPCHAIN_SUMMARY;
?
⑶確定要下載的bin文件的最大長度總和。
?
圖24
⑷創(chuàng)建BINFS分區(qū)并且往此分區(qū)中寫入bin鏡像文件
?
圖25
⑸更新TOC信息并且為剩余的flash空間創(chuàng)建FAT分區(qū)
?
圖26
?
然后調(diào)用圖19中的OEMLaunch函數(shù)啟動系統(tǒng),到此下載multiple XIP鏡像文件就暫時分析到這里了。
總結(jié)
以上是生活随笔為你收集整理的基于WINCE6.0下载multiple XIP镜像文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE6.0 chain.bin和x
- 下一篇: Real6410的NBL1.LSB和NB