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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

WINCE6.0+S3C2443的启动过程---eboot4

發布時間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.bibeboot指定的地址

EBOOT??? 80038000? 00040000? RAMIMAGE

Physical last=0x8004FE54=image start+length=0x80038000+0x00017E54,所以從physical firstphysical 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庫需要回調的函數OEMVerifyMemoryOEMMultiBINNotify,這兩個函數的具體作用,后面再詳細描述。OEMDebugInit函數還調用OEMInitDebugSerial函數來初始化用于debug的串口端口。

?

2.3 OEMPlatformInit ()

注:本文是基于SD卡的更新方式

OEMPlatformInit()的工作如下:

2.3.1 初始化顯示控制器

通過調用函數InitDisplay來初始化LCD控制器,初始化之后可以來顯示eboot階段的logo信息。

?

2.3.2 初始化BSP參數結構體

通過調用函數OALArgsInit(pBSPArgs)來初始化BSP的共享數據,OALEBoot會共享一些參數,即EBoot會將一些參數傳給OAL使用,在此可以給參數初始化。

// Initialize the BSP args structure.

??? //

OALArgsInit(pBSPArgs);?????

pBSPArgseboot/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結構體的成員中,就保存了這些共享參數。它指向的是bootloaderOS共享的參數內存區域,用于在bootloaderOSOAL及驅動之間傳共享的參數,這個內存的其實地址和大小在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 ;

?????? //我們可以在這個結構體中定義項目所需要的在bootloaderOS之間共享的數據。

} 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函數來得到當前nandflashID,然后分離出此IDMIDDID,接著通過數值astNandSpec來比較當前nandflashMIDDID是否和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保存在第0block中,TOC保存在第1block中,eboot保存在第2block中,nk保存在第三個block開始的地方,上面的代碼是從第1block中把TOC的信息讀取出來保存在g_pTOC這個全局的指針數組中。

?

通過判讀從nandflash中讀取出來的g_pTOC是否為NULLg_pTOC->dwSignature是否等于0x434F544E來判斷當前的TOC信息是否有效。

?

SiSectorInfo的結構體變量,這個結構體的定義如下:

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_ReadSectorFMD_WriteSector函數來獲取和寫入扇區信息。

?

?

解析來看看TOC的結構體

?

?

?

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的WINCE6.0+S3C2443的启动过程---eboot4的全部內容,希望文章能夠幫你解決所遇到的問題。

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