基于WINCE6.0下载multiple XIP镜像文件
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時間:2012.03.14
類別:WINCE系統開發
********************************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文件,內容如下:
+XIPKERNEL.bin
NK.bin
chain.bin
表示要把這些bin文件下載到NAND FLASH中,依次下載XIPKERNEL.bin、NK.bin和chain.bin。
然后Eboot會根據lst文件自動下載XIPKERNEL.bin和NK.bin及chain.bin文件,然后會啟動WinCE6.0系統;
3.????? Eboot下載Multiple XIP鏡像文件的具體實現
在按下鍵盤的U之后,eboot進入接收PC機通過usb下載鏡像文件到RAM的狀態中,PC機下載鏡像文件到RAM的那塊區域范圍呢?這由eboot.bib文件指定:
USB_BUF????????? 83000000???????? 03000000???????? RESERVED
?
圖2
這里指定可以下載的鏡像文件的最大大小為0x03000000=48MB,如果要調整此大小,eboot中對應的大小也要相應修改。
?
3.1?? DNW v0.60C.exe軟件的處理機制
?
DNW v0.60C.exe和eboot是如何配置來下載multiple XIP鏡像文件的呢?在選擇DNW v0.60C.exe的“USB port->UBOOT->UBOOT”選擇chain.lst下載的時候,DNW軟件獲取到chain.lst文件的路徑及其內容,知道要下載的鏡像文件有xipkernel.bin、nk.bin和chain.bin(總共3個bin文件),然后依次打開這三個文件來獲取它們的起始地址、長度和名稱,這些信息用結構體MultiBINInfo來描述:
?
圖3
獲取到這些信息后計算其校驗碼,接著創建ubootimage.ubi文件,然后把這些信息主要用MultiBINInfo結構體的方式填寫在ubootimage.ubi文件的前面,緊接著依次把xipkernel.bin、nk.bin和chain.bin文件的內容填寫到ubootimage.ubi文件MultiBINInfo結構體描述的信息后面,然后把ubootimage.ubi文件通過usb的方式發送到指定的RAM地址處,下圖是此文件前面的內容:
?
圖4
下面是ubootimage.ubi文件后面緊接著的一部分內容:
?
圖5
這樣可以總結出ubootimage.ubi文件的格式如下:
?
圖6
3.2?? Eboot支持multiple XIP鏡像文件下載的處理機制
3.2.1???????? Eboot解壓鏡像文件到指定的RAM地址空間
當我們按下鍵盤的U按鍵時,eboot進入調用DownloadImage函數的流程,下面就來看這個函數(我把一些暫時無關的去掉了):
?
圖7
下面就分別介紹這些函數:
⑴ GetImageType()函數通過去讀鏡像文件的頭7個magic number字節來獲取當前要下載的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
當前我們下載ubootimage.ubi文件是BL_IMAGE_TYPE_MANIFEST格式的,見圖4。
GetImageType()函數會調用到一個非常重要的函數,如下圖:
?
圖8
?
⑵CheckImageManifest()函數主要用于獲取要下載的multiple XIP鏡像文件xipkernel.bin、nk.bin和chain.bin的MultiBINInfo結構體信息的校驗碼,并且進行校驗。
?
圖9
⑶DownloadBin()函數從RAM的0x83000333地址處依次讀取xipkernel.bin,nk.bin和chain.bin的內容到config.bib中指定的RAM的內存處,這需要結合config.bib中的配置理解,eboot從RAM中解壓鏡像文件到RAM中其他地址處的示意圖如下:
?
圖10
下面來解讀DownloadBin()函數:
①讀取鏡像文件(第一個是xipkernel.bin)被解壓到RAM中起始地址,此鏡像文件實際有效數據的長度。
?
圖11
⑵對當前解壓的鏡像文件在RAM中的起始地址和長度檢驗,如果沒有在config.bib指定的范圍之內,則會出錯。
?
圖12
③循環讀取當前鏡像文件,直到讀取到最后一個record,最后一個record的dwRecAddr 和dwRecChk 值都為0x00000000,由此可以判斷是否到了最后一個record。
?
圖13
?
圖14
?
圖15
④判斷當前下載的鏡像文件是否包含”CECE”以及是否包含nk.exe模塊,并且記錄下此文件被加載到RAM中的起始地址,文件長度和文件開始執行。
?
圖16
這里有必要分析IsKernelRegion的函數體
?
圖17
TOCentry結構體的定義如下:
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結構體描述的數據
?
圖18
?
這樣,圖7中執行了3此的do…while()循環后,就把xipkernel.bin、nk.bin和chain.bin解壓到RAM中了,接下來就可以寫到flash中。
?
3.2.2???????? Eboot把解壓的鏡像文件寫到flash中
當eboot把鏡像文件解壓到指定的RAM地址空間之后,接下來就是要把解壓后的鏡像文件燒錄到flash中,這個處理流程回到eboot的主流程控制函數BootloaderMain的下面部分:
?
圖19
下面我們來看OEMLaunch函數在下載系統鏡像文件和啟動所用到的部分:
?
圖20
下面就分別分析WriteOSImageToBootMedia函數:
⑴計算MBR開始的邏輯扇區數,并且為MBR格式化指定block數量的flash大小。
?
圖21
⑵找出包含nk.exe模塊的bin文件中ROM擴展數據及獲取chain.bin在RAM中的起始地址和chain.bin文件的實際長度。
?
圖22
結合xipkernel.bin中下圖的內容可以更好理解。
?
圖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
⑷創建BINFS分區并且往此分區中寫入bin鏡像文件
?
圖25
⑸更新TOC信息并且為剩余的flash空間創建FAT分區
?
圖26
?
然后調用圖19中的OEMLaunch函數啟動系統,到此下載multiple XIP鏡像文件就暫時分析到這里了。
總結
以上是生活随笔為你收集整理的基于WINCE6.0下载multiple XIP镜像文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE6.0 chain.bin和x
- 下一篇: Real6410的NBL1.LSB和NB