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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WINCE6.0+S3C2443的启动过程---eboot5 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2.3.5 SD卡控制器的相關(guān)初始化

一個相關(guān)的帖子http://topic.csdn.net/u/20100812/16/d0d5108b-dce1-4535-9e15-6f87bad57e43.html?r=67649425

?

GPG8---nCD_SD,這個引腳用于判斷是否有SD卡存在。

GPH8---WP_SD,這個引腳用于判斷SD卡是否lock

GPE5---SD_CLK

GPE6---SD_CMD

GPE7---SD_DATA0

GPE8---SD_DATA1

GPE9---SD_DATA2

GPE10---SD_DATA3

GPG8GPH8設(shè)置為輸入,以便判斷SD卡是否存在?SD卡是否lock?并且把GPE5GPE10配置為SD卡的功能腳。

?

?

初始化SD卡控制器并且初始化并且通過調(diào)用函數(shù)f_mountdrv來安裝文件系統(tǒng),

SD_card_init()即是初始化SD卡控制器的,在這里就不詳細(xì)描述這兩個函數(shù)了。

?

解析FAT/FAT32格式,找到NK.BIN,并能將其讀取到內(nèi)存中,再假設(shè)NK.BIN如下載一般到內(nèi)存中,將其燒寫到nand flash中。

?

2.3.6顯示bootloader更新NK的進(jìn)度條

?

?

2.4 OEMPreDownload (),對于SD卡的更新方式,這里只是根據(jù)之前的條件判斷當(dāng)前的動作是正常啟動還是要更新NK,在這里應(yīng)該也可以對bootloaderOS之間共享的數(shù)據(jù)進(jìn)行設(shè)置。

?

?

2.5 DownloadImage()

下圖是BootloaderMain函數(shù)的主要函數(shù)體,也即更新NK并且跳到特定地址啟動OS的主要實(shí)現(xiàn)部分

?

這里我們看看DownloadImage函數(shù),主要內(nèi)容如下:

通過調(diào)用函數(shù)dwImageType = GetImageType()來獲取

?

調(diào)用函數(shù)OEMReadData來得到SD卡中映像文件,并且取出這個文件的前面7個字符保存在g_hdr數(shù)組中,接下來便判斷當(dāng)前的映像文件是什么類型的。我們要

更新的是NK.bin,我們來看看NK.bin的格式

?

可以知道NK.bin的頭7個字符是B000FF,所以GetImageType函數(shù)返回BL_IMAGE_TYPE_SIGNED_BIN值來為后面的更新動作做好準(zhǔn)備,我們在這里來看看OEMReadData函數(shù)功能:

?

接下來會調(diào)用函數(shù)SdMmcReadData

?

SdMmcReadData函數(shù)中的

volatile U32 readLenIndex = SDBUFFER

#define SDBUFFER 0x32200000

這里SDBUFFERSDRAM地址,從SD卡從讀取到NK就放在以這個地址為開始地址的內(nèi)存中。

?

DownloadSignedBin函數(shù),就是download NK的函數(shù)。

根據(jù)前面得到的image typeBL_IMAGE_TYPE_BIN來執(zhí)行DownloadImage函數(shù)中下面的語句

case BL_IMAGE_TYPE_BIN:

??? rval &= DownloadBin( pdwImageStart, pdwImageLength, pdwLaunchAddr );

break;

下面來詳細(xì)學(xué)習(xí)DownloadBin這個函數(shù)的函數(shù)體:

通過調(diào)用OEMReadData函數(shù)來獲取NK.bin的起始地址和長度。

圖中串口輸出的信息如下

DownloadBin image dwImageStart = 0x80200000, dwImageLength = 0xE82498

?

目前我們的bootloaderdownloade單個bin

?

g_DownloadManifest 的定義如下:

static DownloadManifest g_DownloadManifest;

在這之前bootloader沒有對g_DownloadManifest變量的初始化,所以g_DownloadManifest.dwNumRegions的初始值是0.

接著看看DownloadManifest結(jié)構(gòu)體的定義:

?

從上面的定義可知

dwNumRegions:表示當(dāng)前要downloade的映像個數(shù),在這里知識download NK.bin,所以dwNumRegions=1.

Region:用來描述某個映像文件的其實(shí)地址,長度和這個映像文件的名字,這里描述的

?

調(diào)用OEMMultiBINNotify函數(shù)來提供download的信息給OEM,也即給bootloader

?

OEMMultiBINNotify的主要函數(shù)體如下

?

上圖中第1798行就是把downloadNK.bin的信息賦值給bootloader中定義的全局變量g_BINRegionInfo

?

通過調(diào)用OEMVerifyMemory函數(shù)來判斷當(dāng)前downloadNK.bin(也可以downloader eboot.bin)

?

?

下圖中第1730和第1731行的宏的定義如下:

//

// Nk Memory reigions defined in config.bib...

//

#define ROM_RAMIMAGE_START????????? 0x80200000

#define ROM_RAMIMAGE_SIZE?????????? 0x02300000

這些值是要和files/config.bib下指定的值一直,是用來判斷當(dāng)前要downloadNK.bin是否在0x802000000x825000000的范圍之內(nèi),在這里我們這次downloadNK.bin信息是dwImageStart = 0x80200000, dwImageLength = 0xE82498

?

?

從而可以知道當(dāng)前的image typeIMAGE_TYPE_RAMIMAGE

?

?

調(diào)用函數(shù)OEMReadData來讀取NK.bin的內(nèi)容到SDRAM內(nèi)存中

每次的讀取是以一個record為單位,分別讀取這個record的開始地址,長度和校驗(yàn)碼,上圖的第1128行用于判斷當(dāng)前讀取的record是否是最后的一個record,如果是,就退出while循環(huán),也即把整個NK.bin讀取到SDBUFFER指向的內(nèi)存中,所以要保證有足夠的內(nèi)存來保存NK.binNK.bin的格式如下:

?

……………………

?

NK.bin文件的最開端,會放置一個BinFile結(jié)構(gòu),imageStartImageLength分別對應(yīng)鏡像展開后在內(nèi)存中存放的首地址和長度。該結(jié)構(gòu)中的RecordNum為不確定的,通常在最后一個記錄之后增加一個addressChksum都為0的紀(jì)錄表示結(jié)束,而這個表示結(jié)束的結(jié)構(gòu)中的Length則標(biāo)示其實(shí)際入口點(diǎn)。

?

調(diào)用函數(shù)OEMMapMemAddrFLASH地址映射到RAM地址中。

?

如果目標(biāo)系統(tǒng)的需求是要能支持把操作系統(tǒng)的鏡像文件下載到FLASH中去,就必須調(diào)用本函數(shù)。由于FLASH操作速度比RAM慢,在片擦除的時候甚至?xí)棺x寫操作停滯,這樣在每次下載操作系統(tǒng)鏡像文件時,由于FLASH的擦寫都會使下載停滯。而OEMMapMemAddr使用了RAM緩沖操作系統(tǒng)鏡像文件的方式,使得用戶在下載操作系統(tǒng)鏡像文件時感覺不到停滯,這個函數(shù)將FLASH地址映射到RAM地址,這樣向FLASH寫的數(shù)據(jù)實(shí)際上先被緩沖到RAM中,然后再寫到FLASH中。下面是相關(guān)帖子的鏈接:http://topic.csdn.net/u/20091218/11/e56acdfd-23a0-4542-bfac-2364a97fe2e7.html

有必要看看OEMMapMemAddr函數(shù)體:

?

#define CACHED_TO_UNCACHED_OFFSET?? 0x20000000

#define FILE_CACHE_START?? (0x80200000 | CACHED_TO_UNCACHED_OFFSET)??????? // Start of file cache (temporary store for flash images).

得到這個cache地址后,就把讀出出來的數(shù)據(jù)塊放在這個cache地址處,這個地址就是上面函數(shù)注釋中提到的file cache location

?

讀出當(dāng)前的record的數(shù)據(jù)塊并且校驗(yàn)

?

讀取到的數(shù)據(jù)塊就保存在FLASH地址映射的RAM地址lpDest上。

?

通過查找ROMHDR的地址來計算ROM的偏移量

?

?

#define ROM_SIGNATURE_OFFSET 64   //0x40

#define ROM_SIGNATURE 0x43454345??? //cece 4byte??? =>ROMHDR 0x44偏移處,每個bin 都有個pToc指向ROMHDR開頭的地址,看下面的bin 文件結(jié)構(gòu),0x44offset處地址里面放的是ROMHDR地址,開始是-1,romimage.exe來設(shè)置的

上圖的第1154行主要用于判斷當(dāng)前的NK.bin是否為CE的映像文件。

1169的串口輸出信息是:rom_offset=0x0.

?

?

判斷當(dāng)前下載的bin文件是否包含TOC和內(nèi)核(nk.exe)

?

1188行用于判斷NK.bin文件中地址為0x80200000+0x40=0x80200040地址處保存的內(nèi)容是cece,也即是否是WINCENK.bin,通過IsKernelRegion函數(shù)來判斷NK.bin中是否包含有NK.exe,因?yàn)橛邪?#xff0c;所以通過11941196行返回NK.bin的起始地址,長度和跳轉(zhuǎn)地址給DownloadImage函數(shù),下面看IsKernelRegion函數(shù)體:

?

這個函數(shù)的串口輸出信息如下:

kandi IsKernelRegion dwCacheAddress =0x81080628

TOC的指針地址是0x80200044處,這個地址保存的值就是TOC記錄的地址,也即從0x80200044處獲取其值(0x81080628),也就知道TOC存放在哪個record上了,在本NK.bin中,是第161record,可從下面的圖片看出來

kandi IsKernelRegion toc copy number =191

kandi IsKernelRegion pROMHeader =0x81080628

kandi IsKernelRegion testTet =0x20

kandi IsKernelRegion plTOC =0x8108067C

0x8108067C-0x81080628=0x54(84),也就是ROMHDR結(jié)構(gòu)體占用的字節(jié)數(shù),通過下圖的Length=0x00000054也可得知。

?

1458行為什么還要加上ROM_SIGNATURE_OFFSET(0x40)呢?因?yàn)檫@從0x80200000x8020003F是用于記錄NK.bin的開始地址和長度,而加上sizeof(ULONG)是表示0x802000400x80200043是用于記錄WINCE的“cece”恰好是4個字節(jié),public/common/oal/inc/romldr.h下面的定義可以讓我們更清晰去理解:

?

這里的physfirst address=image start=0x80200000

1471行的while用于查詢NK.bin中是否包含NK.exe,如果沒有就表示此NK.bin沒有包含內(nèi)核,這樣的NK.bin就不是所需要的。

上圖第1463行的dwNumModules=191,表示NK.bin中包含的模塊的數(shù)量,包括exedll文件,下圖是通過viewbin –t nk.bin >aoutput.txt中關(guān)于module的內(nèi)容:

?

……………………………………………

從上圖也可以看出NK.bin中包含的modules236-46+1,正好是191個,而第一個就是NK.exe

?

NK.bin解壓到SDRAM中后,接著就計算NK.bin的檢驗(yàn)碼,并且判讀是否馬上在DownloadImage函數(shù)中把解壓后的映像寫到flash中。

?

ComputeChecksum函數(shù)計算校驗(yàn)碼的原理很簡單,就不介紹了,下面看WriteImageToFlash的函數(shù)體

?

串口輸出信息如下(換了個NK.bin,所以大小不同啊,哈哈)

Completed file(s):

-----------------------------------

[0]: Address=0x80200000? Length=0xE50694? Name="" Target=RAM

這個函數(shù)也很簡單,就不介紹了,到此DownloadImage函數(shù)的工作就完成了,接著回到BootloaderMain函數(shù)中,后面將繼續(xù)。

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。