時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)
這里使用的uboot并非uboot官方發(fā)布的uboot代碼,而是為三星定制的一個uboot版本s3c-u-boot-1.1.6,其代碼作者就包括了三星的程序員與denx的員工。這個版本支持SD啟動,不過默認是nand啟動,使它支持uboot需要做以下事情:
1、? 雖然支持uboot啟動,但是uboot代碼里不叫SD啟動方式,而是叫movinand啟動方式,在incluede/configs/smdk6410.h中就有這個選項,所以在這個文件里關閉nand啟動,打開movinand啟動就可以了:
//#define CONFIG_BOOT_NOR
//#define CONFIG_BOOT_NAND 注釋nand啟動
#define CONFIG_BOOT_MOVINAND?? 打開movinand啟動
//#define CONFIG_BOOT_ONENAND
//#define CONFIG_BOOT_ONENAND_IROM
#define???? CONFIG_NAND
//#define CONFIG_ONENAND
#define CONFIG_MOVINAND?? 打開movinand選項,使uboot支持movinand的操作
2、如果單純是做上面的改動,還是不夠的,在運行的時候會發(fā)現(xiàn)到了一定的時候uboot就死掉了,其實這是因為uboot中假設SMDK6410在使用SD方式的時候是從CH0啟動的,但是手上的這個板子是通過CH1啟動,那么在運行被復制到SRAM中的8K代碼時候沒辦法在CH0檢測到SD,更沒辦法將SD 里的代碼復制到SDRAM中。修改辦法是在incluede/
movi.h中HSMMC_CHANNEL修改為1。
3、然后如果將上述修改后編譯出來的u-boot.bin通過IROM_Fusing_tools直接燒寫到SD中也是沒辦法啟動的,需要運行以下的命令進行處理:
cat u-boot.bin >> temp
cat u-boot.bin >> temp
split -b 256k temp
mv xaa u-boot_256k.bin
split -b 8k u-boot.bin
mv xaa u-boot_8k.bin
cat u-boot_256k.bin >> u-boot_mmc.bin
cat u-boot_8k.bin >> u-boot_mmc.bin
經(jīng)過這些處理,實際上是將u-boot.bin內(nèi)容重復一次后(為了保證達到256K,如果這個bin更小,那么可能需要重復3次、4次,直到超過256K 為止),將前256K制成u-boot_256k.bin,再將前8K制成u-boot_8k.bin,最后將u-boot_256k.bin +u-boot_8k.bin合并成一個256K+8K大小的文件u-boot_mmc.bin,這個文件前256K就是u-boot_256k.bin 而后8K就是u-boot_8k.bin。把這個u-boot_mmc.bin通過IROM_Fusing_tools燒寫到SD卡就可以成功啟動系統(tǒng)了。
為什么要做這樣的處理這個bin文件呢?下面通過分析IROM_Fusing_tools、uboot的源碼來揭示其中的由來。
從網(wǎng)上可以下載到IROM_Fusing_tools的源碼,在按下這個軟件的start控件后,先是讀取這個SD卡的第一個扇區(qū),也就是這個磁盤的MBR 扇區(qū),判斷是不是FAT32格式的磁盤(這也是為什么用來做啟動的SD必須格式化為FAT32格式),接著獲取總的扇區(qū)數(shù)目TOTAl_SECOTR,并將所要燒寫的bin文件燒寫到磁盤的這個扇區(qū):TOTAL_SECTOR – 2 - SIZE_OF_IMAGE/512。其中TOTAl_SECTOR是這個磁盤總的扇區(qū)數(shù)目;SIZE_OF_IMAGE/512是這個bin文件將要占據(jù)的扇區(qū)數(shù)(這里是以512為扇區(qū)大小的,因此對于扇區(qū)更大的SD卡也就沒辦法使用了,而現(xiàn)在的大容量SD都可能使用了2K甚至4K的扇區(qū),除非修改這個程序,并同步地在uboot中修改程序);至于2則是保留的2個扇區(qū),至于為什么要保留這2個扇區(qū),需要分析uboot的源碼情況,下面將做進一步的闡述。
在SD啟動方式下,S3C6410內(nèi)部的IROM程序BL0首先運行,并將SD中的最后18個扇區(qū)開始的16個扇區(qū)內(nèi)容復制到片內(nèi)的8K SRAM,也就是SteppingStone,接著跳轉(zhuǎn)到這塊SRAM的開始地址開始運行,這8K的代碼實際上就是上面u-boot_mmc.bin這個文件的最后8K,也是u-boot.bin的最開始8K代碼,這段代碼也叫BL1。從BL0跳轉(zhuǎn)到BL1的時候uboot也就接管了CPU。
Uboot的入口在start.S這個文件,cpu/s3c64x0/start.S中有這樣一段代碼:
#ifdef CONFIG_BOOT_MOVINAND
ldr?? sp, _TEXT_PHY_BASE
bl???? movi_bl2_copy
b???? after_copy
#endif
這段代碼是實現(xiàn)SD啟動的關鍵。到了這里后就執(zhí)行movi_bl2_copy,這個函數(shù)負責將SD內(nèi)的uboot完整地復制到SDRAM,這時候完整的uboot也叫BL2,而這個函數(shù)實際上是調(diào)用了以下函數(shù):
CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint *)BL2_BASE, MOVI_INIT_REQUIRED);
HSMMC_CHANNEL這是SD/MMC通道號,手上板子使用的是CH1,而默認是CH0,所以需要對這個進行修改。
MOVI_BL2_POS 是需要拷貝的數(shù)據(jù)位于SD的起始扇區(qū),其計算辦法是這樣的,先得到這個SD的總扇區(qū)數(shù)TOTAL,再減去256K的BL2和8K的BL1所占的扇區(qū)數(shù),最后減去0.5K 的eFuse和0.5K的保留區(qū)所占的扇區(qū)數(shù),而這里還定義SD的扇區(qū)為512B。從這里可以看到和IROM_Fusing_tools對SD卡的處理是完全對應的。這里還有一個問題,總扇區(qū)數(shù)TOTAL是如何得到的?從程序來看是從(TCM_BASE - 0x4)這個地址讀取到的,至于TOTAL是如何被放到這里的就只能從BL0的代碼找答案了。
MOVI_BL2_BLKCNT是需要復制的扇區(qū)數(shù)目,這里就是定義為256K,這也是為什么必須把u-boot.bin轉(zhuǎn)換成256K的文件。
BL2_BASE是目的地址,也就是SDRAM中的地址。這里定義為0x57E00000,就是128M 的SDRAM的最后2M,因為到這里為止MMU尚未打開,因此這里使用的是物理地址。
MOVI_INIT_REQUIRED這個參數(shù)的意義是什么暫時沒有任何資料說明。
而CopyMovitoMem這個函數(shù)的定義是這樣的:
#define CopyMovitoMem(a,b,c,d,e)???? (((int(*)(int, uint, ushort, uint *, int))(*((uint *)(TCM_BASE + 0x8))))(a,b,c,d,e))
這個定義實際上是調(diào)用了位于TCM_BASE + 0x8這個地址的函數(shù)指針,其中TCM_BASE的值為0x0C004000,至于這個地址放的是什么,也沒資料說明。
當復制完BL2后便會跳轉(zhuǎn)到BL2的start_armboot這個C語言函數(shù)中運行了,此后的運行過程就不需要再分析了。
關鍵詞標簽:uboot,S3C6410
相關閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內(nèi)存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關機、重啟、注銷 命令 查看linux服務器硬盤IO讀寫負載