WINCE6.0+S3C2443的启动过程---eboot4
http://blog.csdn.net/chinesedragon2010/archive/2010/10/05/5922489.aspx
?
2 main函數
void main(void)
{
??? //MemoryTest_Function();
??? BootloaderMain();
??? // Should never get here.
??? SpinForever();
}
Main函數主要是通過調用BootloaderMain函數來實現其功能的,下面來看看BootloaderMain函數的流程圖:
?????????????????????????????????????????
2.1 KernelRelocate()
?
⑴pTOC的結構體ROMHDR
結構體ROMHDR在/WINCE600/PUBLIC/COMMON/OAK/INC/Romldr.h中定義,如下所示
?
?
?
從上圖我們知道Physical first=0x80038000,這就是eboot/boot.bib中eboot指定的地址
EBOOT??? 80038000? 00040000? RAMIMAGE
Physical last=0x8004FE54=image start+length=0x80038000+0x00017E54,所以從physical first到physical last這段內存的大小就是eboot.bin的大小
?
RAM Free – RAM Start=0x7000,這段RAM用于做什么呢?不知道,還望知者指教,難道是用于全局變量的重定位嗎?用于把boot loader中的全局變量重定位到這段RAM中嗎?我想也許是,見我發的相關帖子http://topic.csdn.net/u/20101009/10/d2598ab6-f926-49f1-a708-7bc8c9ec2e6d.html
對于如何實現重定位的,見下面這個鏈接,在此就不描述了。
http://blog.csdn.net/chinesedragon2010/archive/2010/10/09/5929007.aspx
?
2.2 OEMDebugInit ()
BOOL OEMDebugInit(void)
{
?
??? // Set up function callbacks used by blcommon.
??? //
??? g_pOEMVerifyMemory?? = OEMVerifyMemory;????? // Verify RAM.
??? g_pOEMMultiBINNotify = OEMMultiBINNotify;
?
??? // Call serial initialization routine (shared with the OAL).
??? //
??? OEMInitDebugSerial();
?
??? return(TRUE);
}
OEMDebugInit函數主要用于設置后blcommon.lib庫需要回調的函數OEMVerifyMemory和OEMMultiBINNotify,這兩個函數的具體作用,后面再詳細描述。OEMDebugInit函數還調用OEMInitDebugSerial函數來初始化用于debug的串口端口。
?
2.3 OEMPlatformInit ()
注:本文是基于SD卡的更新方式
OEMPlatformInit()的工作如下:
2.3.1 初始化顯示控制器
通過調用函數InitDisplay來初始化LCD控制器,初始化之后可以來顯示eboot階段的logo信息。
?
2.3.2 初始化BSP參數結構體
通過調用函數OALArgsInit(pBSPArgs)來初始化BSP的共享數據,OAL與EBoot會共享一些參數,即EBoot會將一些參數傳給OAL使用,在此可以給參數初始化。
// Initialize the BSP args structure.
??? //
OALArgsInit(pBSPArgs);?????
pBSPArgs在eboot/loader.h的相關定義如下
// Driver globals pointer (parameter sharing memory used by bootloader and OS).
//
#define pBSPArgs??????? ((BSP_ARGS *) IMAGE_SHARE_ARGS_UA_START)
IMAGE_SHARE_ARGS_UA_START對應的虛擬和物理地址的宏定義如下:
#define IMAGE_SHARE_ARGS_PA_START?????? 0x30020000
#define IMAGE_SHARE_ARGS_UA_START?????? 0xA0020000
pBSPArgs是一個結構體((BSP_ARGS)類型的指針。BSP_ARGS結構體的成員中,就保存了這些共享參數。它指向的是bootloader和OS共享的參數內存區域,用于在bootloader和OS的OAL及驅動之間傳共享的參數,這個內存的其實地址和大小在files/config.bib下面定義:
; Common RAM areas
?????? ARGS??????????????? 80020000? 00000800? RESERVED
?
接下來看看BSP_ARGS結構體的定義:
typedef struct {
??? OAL_ARGS_HEADER header;
??? UINT8 deviceId[16];???????? // Device identification
??? OAL_KITL_ARGS kitl;
??? //UINT8 uuid[16];
??? BOOL bUpdateMode;????? // TRUE = Enter update mode on reboot.
??? BOOL bHiveCleanFlag;???? / TRUE = Clean hive at boot
??? BOOL bCleanBootFlag;???? // TRUE = Clear RAM, hive, user store at boot
??? BOOL bFormatPartFlag;???? // TRUE = Format partion when mounted at boot
?????? DWORD????? nfsblk;
?????? HANDLE g_SDCardDetectEvent; //kim
?????? DWORD g_SDCardState ;
?????? //我們可以在這個結構體中定義項目所需要的在bootloader和OS之間共享的數據。
} BSP_ARGS, *PBSP_ARGS;
重點解釋下面的結構體成員:
header是信息頭,用來指示pBSPArgs所指內存是否包含有效信息。
deviceId是設備ID,用來標識KITL使用的端口外設。
kitl用于存儲KITL端口的相關配置信息。
?
2.3.3 初始化nandflash及從nandflash中獲取信息
⑴ FMD_GetInfo()
// Get flash info
??? if (!FMD_GetInfo(&flashInfo)) {
??????? OALMSG(OAL_ERROR, (L"ERROR: BLFlashDownload: "
??????????? L"FMD_GetInfo call failed/r/n"
??????? ));
}
FMD_GetInfo的主要函數體如下:
?
先是通過ReadFlashID函數來得到當前nandflash的ID,然后分離出此ID的MID和DID,接著通過數值astNandSpec來比較當前nandflash的MID和DID是否和astNandSpec中支持的吻合,如果不吻合就需要在astNandSpec中假如,這也是如果項目所使用的nandflash發生變化時,而astNandSpec又沒有相應的支持,就需要astNandSpec中假如新的nandflash的技術參數。
?
?
獲取nandflash的技術參數,比如此nandflash有多少個block,每個block有多少頁,每個sector的大小是多少,每個block有多少個Byte。
?
?
2.3.4 讀取TOC信息
TOC: Table Of Contents, OEM on disk structure.
通過調用函數TOC_Read()來從nandflash中讀取出TOC的信息
?
我們目前nandflash的保存布局是:stepldr保存在第0個block中,TOC保存在第1個block中,eboot保存在第2個block中,nk保存在第三個block開始的地方,上面的代碼是從第1個block中把TOC的信息讀取出來保存在g_pTOC這個全局的指針數組中。
?
通過判讀從nandflash中讀取出來的g_pTOC是否為NULL和g_pTOC->dwSignature是否等于0x434F544E來判斷當前的TOC信息是否有效。
?
Si是SectorInfo的結構體變量,這個結構體的定義如下:
typedef struct _SectorInfo
{
??? DWORD dwReserved1;????????????? // Reserved - used by FAL
??? BYTE? bOEMReserved;???????????? // For use by OEM
??? BYTE? bBadBlock; ??????????? // Indicates if block is BAD
??? WORD? wReserved2;???????? ??????// Reserved - used by FAL
???
}SectorInfo, *PSectorInfo;
在NAND FLASH中,每個物理扇區的Spare區都保存一個SectorInfo的數據結構:
dwReserved1:這部分保留給FAL層使用,FAL層將填寫邏輯扇區號。
bOEMReserved:這部分保留給OEM使用,可用于定義讀寫屬性。
bBadBlock:這部分是由nandflash芯片壞塊標志定義。
wReserved2:這部分保留給FAL層使用,FAL層將填寫標志位來防止掉電錯粗。
FAL層通過FMD_ReadSector與FMD_WriteSector函數來獲取和寫入扇區信息。
?
?
解析來看看TOC的結構體
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的WINCE6.0+S3C2443的启动过程---eboot4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NK.bin和NK.nb0学习
- 下一篇: WINCE6.0+S3C2443的启动过