使uboot支援S3C6410的SD啟動

2021-07-25 15:51:49 字數 3042 閱讀 3762

**:

這裡使用的uboot並非uboot官方發布的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、如果單純是做上面的改動,還是不夠的,在執行的時候會發現到了一定的時候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

經過這些處理,實際上是將u-boot.bin內容重複一次後(為了保證達到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卡就可以成功啟動系統 了。

為什麼要做這樣的處理這個bin檔案呢?下面通過分析irom_fusing_tools、uboot的原始碼來揭示其中的由來。

在sd啟動方式下,s3c6410內部的irom程式bl0首先執行,並將sd中的最後18個扇區開始的16個扇區內容複製到片內 的8k sram,也就是steppingstone,接著跳轉到這塊sram的開始位址開始執行,這8k的**實際上就是上面u-boot_mmc.bin這個 檔案的最後8k,也是u-boot.bin的最開始8k**,這段**也叫bl1。從bl0跳轉到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

這段**是實現sd啟動的關鍵。到了這裡後就執行movi_bl2_copy,這個函式負責將sd內的uboot完整地複製到sdram,這時候完整的uboot也叫bl2,而這個函式實際上是呼叫了以下函式:

copymovitomem(hsmmc_channel, movi_bl2_pos, movi_bl2_blkcnt, (uint *)bl2_base, movi_init_required);

hsmmc_channel這是sd/mmc通道號,手上板子使用的是ch1,而預設是ch0,所以需要對這個進行修改。

movi_bl2_pos 是需要拷貝的資料位於sd的起始扇區,其計算辦法是這樣的,先得到這個sd的總扇區數total,再減去256k的bl2和8k的bl1所佔的扇區數,最 後減去0.5k 的efuse和0.5k的保留區所佔的扇區數,而這裡還定義sd的扇區為512b。從這裡可以看到和irom_fusing_tools對sd卡的處理是 完全對應的。這裡還有乙個問題,總扇區數total是如何得到的?從程式來看是從(tcm_base - 0x4)這個位址讀取到的,至於total是如何被放到這裡的就只能從bl0的**找答案了。

movi_bl2_blkcnt是需要複製的扇區數目,這裡就是定義為256k,這也是為什麼必須把u-boot.bin轉換成256k的檔案。

bl2_base是目的位址,也就是sdram中的位址。這裡定義為0x57e00000,就是128m 的sdram的最後2m,因為到這裡為止mmu尚未開啟,因此這裡使用的是實體地址。

movi_init_required這個引數的意義是什麼暫時沒有任何資料說明。

而copymovitomem這個函式的定義是這樣的:

#define copymovitomem(a,b,c,d,e)     (((int(*)(int, uint, ushort, uint *, int))(*((uint *)(tcm_base + 0x8))))(a,b,c,d,e))

這個定義實際上是呼叫了位於tcm_base + 0x8這個位址的函式指標,其中tcm_base的值為0x0c004000,至於這個位址放的是什麼,也沒資料說明。

當複製完bl2後便會跳轉到bl2的start_armboot這個c語言函式中執行了,此後的執行過程就不需要再分析了。

使uboot支援S3C6410的SD啟動

這裡使用的uboot並非uboot官方發布的uboot 而是為三星定製的乙個uboot版本s3c u boot 1.1.6,其 作者就包括了三星的程式設計師與denx的員工。這個版本支援sd啟動,不過預設是nand啟動,使它支援uboot需要做以下事情 1 雖然支援uboot啟動,但是uboot 裡...

使uboot支援S3C6410的SD啟動

一直以來都不知道sd卡中的uboot和nandflash中的uboot有什麼區別?今天終於看到一篇文章,介紹了一下兩者的區別,和如何用原生uboot製作sd卡uboot,記錄下來以供後面查閱。找到了原出處 6410的手冊上說,可以從nandflash onenand sd卡啟動,沒有專用的燒錄工具的...

使uboot支援S3C6410的SD啟動

這裡使用的uboot並非uboot官方發布的uboot 而是為三星定製的乙個uboot版本s3c u boot 1.1.6,其 作者就包括了三星的程式設計師與denx的員工。這個版本支援sd啟動,不過預設是nand啟動,使它支援uboot需要做以下事情 1 雖然支援uboot啟動,但是uboot 裡...