<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 使uboot支撐 S3C6410的SD啟動(dòng)

使uboot支撐 S3C6410的SD啟動(dòng)

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò ) 收藏
這里運用 的uboot并非uboot官方揭曉的uboot代碼,而是為三星定制的一個(gè)uboot版本s3c-u-boot-1.1.6,其代碼作者就包含了三星的程序員與denx的員工。這個(gè)版本支撐 SD啟動(dòng),不過(guò)默認是nand啟動(dòng),使它支撐 uboot須要 做以下事情:

  1、 雖然支撐 uboot啟動(dòng),但是uboot代碼里不叫SD啟動(dòng)形式,而是叫movinand啟動(dòng)形式 ,在incluede/configs/smdk6410.h中就有這個(gè)選項,所以在這個(gè)文件里關(guān)上 nand啟動(dòng),打開(kāi)movinand啟動(dòng)就能夠 了:

本文引用地址:http://dyxdggzs.com/article/201611/319261.htm

  //#define CONFIG_BOOT_NOR

  //#define CONFIG_BOOT_NAND 注釋nand啟動(dòng)

  #define CONFIG_BOOT_MOVINAND 打開(kāi)movinand啟動(dòng)

  //#define CONFIG_BOOT_ONENAND

  //#define CONFIG_BOOT_ONENAND_IROM

  #define CONFIG_NAND

  //#define CONFIG_ONENAND

  #define CONFIG_MOVINAND 打開(kāi)movinand選項,使uboot支撐 movinand的操作

  2、假如 單純是做上面的改動(dòng),仍舊 不夠的,在運行的時(shí)刻 會(huì )發(fā)覺(jué) 到了必須 的時(shí)刻 uboot就死掉了,本來(lái)這是因為uboot中假設SMDK6410在運用 SD形式 的時(shí)刻 是從CH0啟動(dòng)的,但是手上的這個(gè)板子是議決 CH1啟動(dòng),那么在運行被復制到SRAM中的8K代碼時(shí)刻 沒(méi)要領(lǐng) 在CH0檢測到SD,更沒(méi)要領(lǐng) 將SD 里的代碼復制到SDRAM中。修改要領(lǐng) 是在incluede/

  movi.h中HSMMC_CHANNEL修改為1。

  3、然后假如 將上述修改后編譯出來(lái)的u-boot.bin議決 IROM_Fusing_tools直接燒寫(xiě)到SD中也是沒(méi)要領(lǐng)啟動(dòng)的,須要 運行以下的命令實(shí)行 處理:

  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)歷 這些處理,實(shí)際上是將u-boot.bin內容重復一次后(為了保證達到256K,假如 這個(gè)bin更小,那么可能須要重復3次、4次,直到超過(guò)256K 為止),將前256K制成u-boot_256k.bin,再將前8K制成u-boot_8k.bin,結尾將u-boot_256k.bin +u-boot_8k.bin合并成一個(gè)256K+8K大小的文件u-boot_mmc.bin,這個(gè)文件前256K就是u-boot_256k.bin 而后8K就是u-boot_8k.bin。把這個(gè)u-boot_mmc.bin議決 IROM_Fusing_tools燒寫(xiě)到SD卡就能夠成功啟動(dòng)系統了。

  為什么要做這樣的處理這個(gè)bin文件呢?下面議決 剖析 IROM_Fusing_tools、uboot的源碼來(lái)揭示其中的由來(lái)。

  從網(wǎng)上能夠下載到IROM_Fusing_tools的源碼,在按下這個(gè)軟件的start控件后,先是讀取這個(gè)SD卡的第一個(gè)扇區,也就是這個(gè)硬盤(pán)的MBR 扇區,判斷是不是FAT32格式的硬盤(pán)(這也是為什么用來(lái)做啟動(dòng)的SD必須格式化為FAT32格式),接著(zhù)獲取總的扇區數目TOTAl_SECOTR,并將所要燒寫(xiě)的bin文件燒寫(xiě)到硬盤(pán)的這個(gè)扇區:TOTAL_SECTOR – 2 - SIZE_OF_IMAGE/512。其中TOTAl_SECTOR是這個(gè)硬盤(pán)總的扇區數目;SIZE_OF_IMAGE/512是這個(gè)bin文件將要占據的扇區數(這里是以512為扇區大小的,因此對于扇區更大的SD卡也就沒(méi)要領(lǐng)運用 了,而現在的大容量SD都可能運用 了2K甚至4K的扇區,除非修改這個(gè)程序,并同步地在uboot中修改程序);至于2則是保存的2個(gè)扇區,至于為什么要保存 這2個(gè)扇區,須要 剖析 uboot的源碼情況,下面將做進(jìn)一步的闡述。

  在SD啟動(dòng)形式 下,S3C6410內部的IROM程序BL0最先 運行,并將SD中的結尾 18個(gè)扇區開(kāi)始的16個(gè)扇區內容復制到片內的8K SRAM,也就是SteppingStone,接著(zhù)跳轉到這塊SRAM的開(kāi)始地址開(kāi)始運行,這8K的代碼實(shí)際上就是上面u-boot_mmc.bin這個(gè)文件的結尾 8K,也是u-boot.bin的最開(kāi)始8K代碼,這段代碼也叫BL1。從BL0跳轉到BL1的時(shí)刻 uboot也就接管了CPU。

Uboot的入口在start.S這個(gè)文件,cpu/s3c64x0/start.S中有這樣一段代碼:

  #ifdef CONFIG_BOOT_MOVINAND

  ldr sp, _TEXT_PHY_BASE

  bl movi_bl2_copy

  b after_copy

  #endif

  這段代碼是實(shí)現SD啟動(dòng)的主要。到了這里后就執行movi_bl2_copy,這個(gè)函數負責將SD內的uboot完整地復制到SDRAM,這時(shí)刻完整的uboot也叫BL2,而這個(gè)函數實(shí)際上是調用了以下函數:

  CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint *)BL2_BASE, MOVI_INIT_REQUIRED);

  HSMMC_CHANNEL這是SD/MMC通道號,手上板子運用 的是CH1,而默認是CH0,所以須要 對這個(gè)實(shí)行修改。

  MOVI_BL2_POS 是須要 copy 的數據位于SD的起始扇區,其計算要領(lǐng)是這樣的,先得到這個(gè)SD的總扇區數TOTAL,再減去256K的BL2和8K的BL1所占的扇區數,結尾 減去0.5K 的eFuse和0.5K的保存 區所占的扇區數,而這里還解釋SD的扇區為512B。從這里能夠看到和IROM_Fusing_tools對SD卡的處理是完全對應的。這里還有一個(gè)疑問(wèn) ,總扇區數TOTAL是如何得到的?從程序來(lái)看是從(TCM_BASE - 0x4)這個(gè)地址讀取到的,至于TOTAL是如何 被放到這里的就只好從BL0的代碼找答案了。

  MOVI_BL2_BLKCNT是須要復制的扇區數目,這里就是解釋為256K,這也是為什么必須把u-boot.bin轉換成256K的文件。

  BL2_BASE是目標 地址,也就是SDRAM中的地址。這里解釋為0x57E00000,就是128M 的SDRAM的結尾 2M,因為到這里為止MMU尚未打開(kāi),因此這里運用 的是物理地址。

  MOVI_INIT_REQUIRED這個(gè)參數的意義是什么暫時(shí)沒(méi)有任何資料表明 。

  而CopyMovitoMem這個(gè)函數的解釋是這樣的:

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

這個(gè)解釋實(shí)際上是調用了位于TCM_BASE + 0x8這個(gè)地址的函數指針,其中TCM_BASE的值為0x0C004000,至于這個(gè)地址放的是什么,也沒(méi)資料表明 。

  當復制完BL2后便會(huì )跳轉到BL2的start_armboot這個(gè)C語(yǔ)言函數中運行了,此后的運行流程 就不須要 再剖析了。



關(guān)鍵詞: ubootS3C6410SD啟

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>