歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux服務器 >> 使uboot支持S3C6410的SD啟動

使uboot支持S3C6410的SD啟動

日期:2017/3/2 16:34:37   编辑:Linux服務器

這裡使用的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的源碼來揭示其中的由來。

  從網上可以下載到IROM_Fusing_tools的源碼,在按下這個軟件的start控件後,先是讀取這個SD卡的第一個扇區,也就是這個磁盤的MBR 扇區,判斷是不是FAT32格式的磁盤(這也是為什麼用來做啟動的SD必須格式化為FAT32格式),接著獲取總的扇區數目TOTAl_SECOTR,並將所要燒寫的bin文件燒寫到磁盤的這個扇區:TOTAL_SECTOR – 2 - SIZE_OF_IMAGE/512。其中TOTAl_SECTOR是這個磁盤總的扇區數目;SIZE_OF_IMAGE/512是這個bin文件將要占據的扇區數(這裡是以512為扇區大小的,因此對於扇區更大的SD卡也就沒辦法使用了,而現在的大容量SD都可能使用了2K甚至4K的扇區,除非修改這個程序,並同步地在uboot中修改程序);至於2則是保留的2個扇區,至於為什麼要保留這2個扇區,需要分析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和12下一頁

Copyright © Linux教程網 All Rights Reserved