日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于WINCE6.0下载multiple XIP镜像文件

發布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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镜像文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。