WINCE6.0+S3C2443的启动过程---eboot4
http://blog.csdn.net/chinesedragon2010/archive/2010/10/05/5922489.aspx
?
2 main函數(shù)
void main(void)
{
??? //MemoryTest_Function();
??? BootloaderMain();
??? // Should never get here.
??? SpinForever();
}
Main函數(shù)主要是通過調(diào)用BootloaderMain函數(shù)來實(shí)現(xiàn)其功能的,下面來看看BootloaderMain函數(shù)的流程圖:
?????????????????????????????????????????
2.1 KernelRelocate()
?
⑴pTOC的結(jié)構(gòu)體ROMHDR
結(jié)構(gòu)體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這段內(nèi)存的大小就是eboot.bin的大小
?
RAM Free – RAM Start=0x7000,這段RAM用于做什么呢?不知道,還望知者指教,難道是用于全局變量的重定位嗎?用于把boot loader中的全局變量重定位到這段RAM中嗎?我想也許是,見我發(fā)的相關(guān)帖子http://topic.csdn.net/u/20101009/10/d2598ab6-f926-49f1-a708-7bc8c9ec2e6d.html
對于如何實(shí)現(xiàn)重定位的,見下面這個(gè)鏈接,在此就不描述了。
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函數(shù)主要用于設(shè)置后blcommon.lib庫需要回調(diào)的函數(shù)OEMVerifyMemory和OEMMultiBINNotify,這兩個(gè)函數(shù)的具體作用,后面再詳細(xì)描述。OEMDebugInit函數(shù)還調(diào)用OEMInitDebugSerial函數(shù)來初始化用于debug的串口端口。
?
2.3 OEMPlatformInit ()
注:本文是基于SD卡的更新方式
OEMPlatformInit()的工作如下:
2.3.1 初始化顯示控制器
通過調(diào)用函數(shù)InitDisplay來初始化LCD控制器,初始化之后可以來顯示eboot階段的logo信息。
?
2.3.2 初始化BSP參數(shù)結(jié)構(gòu)體
通過調(diào)用函數(shù)OALArgsInit(pBSPArgs)來初始化BSP的共享數(shù)據(jù),OAL與EBoot會(huì)共享一些參數(shù),即EBoot會(huì)將一些參數(shù)傳給OAL使用,在此可以給參數(shù)初始化。
// Initialize the BSP args structure.
??? //
OALArgsInit(pBSPArgs);?????
pBSPArgs在eboot/loader.h的相關(guān)定義如下
// 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對應(yīng)的虛擬和物理地址的宏定義如下:
#define IMAGE_SHARE_ARGS_PA_START?????? 0x30020000
#define IMAGE_SHARE_ARGS_UA_START?????? 0xA0020000
pBSPArgs是一個(gè)結(jié)構(gòu)體((BSP_ARGS)類型的指針。BSP_ARGS結(jié)構(gòu)體的成員中,就保存了這些共享參數(shù)。它指向的是bootloader和OS共享的參數(shù)內(nèi)存區(qū)域,用于在bootloader和OS的OAL及驅(qū)動(dòng)之間傳共享的參數(shù),這個(gè)內(nèi)存的其實(shí)地址和大小在files/config.bib下面定義:
; Common RAM areas
?????? ARGS??????????????? 80020000? 00000800? RESERVED
?
接下來看看BSP_ARGS結(jié)構(gòu)體的定義:
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 ;
?????? //我們可以在這個(gè)結(jié)構(gòu)體中定義項(xiàng)目所需要的在bootloader和OS之間共享的數(shù)據(jù)。
} BSP_ARGS, *PBSP_ARGS;
重點(diǎn)解釋下面的結(jié)構(gòu)體成員:
header是信息頭,用來指示pBSPArgs所指內(nèi)存是否包含有效信息。
deviceId是設(shè)備ID,用來標(biāo)識(shí)KITL使用的端口外設(shè)。
kitl用于存儲(chǔ)KITL端口的相關(guān)配置信息。
?
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的主要函數(shù)體如下:
?
先是通過ReadFlashID函數(shù)來得到當(dāng)前nandflash的ID,然后分離出此ID的MID和DID,接著通過數(shù)值astNandSpec來比較當(dāng)前nandflash的MID和DID是否和astNandSpec中支持的吻合,如果不吻合就需要在astNandSpec中假如,這也是如果項(xiàng)目所使用的nandflash發(fā)生變化時(shí),而astNandSpec又沒有相應(yīng)的支持,就需要astNandSpec中假如新的nandflash的技術(shù)參數(shù)。
?
?
獲取nandflash的技術(shù)參數(shù),比如此nandflash有多少個(gè)block,每個(gè)block有多少頁,每個(gè)sector的大小是多少,每個(gè)block有多少個(gè)Byte。
?
?
2.3.4 讀取TOC信息
TOC: Table Of Contents, OEM on disk structure.
通過調(diào)用函數(shù)TOC_Read()來從nandflash中讀取出TOC的信息
?
我們目前nandflash的保存布局是:stepldr保存在第0個(gè)block中,TOC保存在第1個(gè)block中,eboot保存在第2個(gè)block中,nk保存在第三個(gè)block開始的地方,上面的代碼是從第1個(gè)block中把TOC的信息讀取出來保存在g_pTOC這個(gè)全局的指針數(shù)組中。
?
通過判讀從nandflash中讀取出來的g_pTOC是否為NULL和g_pTOC->dwSignature是否等于0x434F544E來判斷當(dāng)前的TOC信息是否有效。
?
Si是SectorInfo的結(jié)構(gòu)體變量,這個(gè)結(jié)構(gòu)體的定義如下:
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中,每個(gè)物理扇區(qū)的Spare區(qū)都保存一個(gè)SectorInfo的數(shù)據(jù)結(jié)構(gòu):
dwReserved1:這部分保留給FAL層使用,FAL層將填寫邏輯扇區(qū)號。
bOEMReserved:這部分保留給OEM使用,可用于定義讀寫屬性。
bBadBlock:這部分是由nandflash芯片壞塊標(biāo)志定義。
wReserved2:這部分保留給FAL層使用,FAL層將填寫標(biāo)志位來防止掉電錯(cuò)粗。
FAL層通過FMD_ReadSector與FMD_WriteSector函數(shù)來獲取和寫入扇區(qū)信息。
?
?
解析來看看TOC的結(jié)構(gòu)體
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的WINCE6.0+S3C2443的启动过程---eboot4的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NK.bin和NK.nb0学习
- 下一篇: WINCE6.0+S3C2443的启动过