亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1165 | 回復(fù): 1
打印 上一主題 下一主題

使uboot支持S3C6410的SD啟動(dòng) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-01-03 22:25 |只看該作者 |倒序?yàn)g覽
這里使用的uboot并非uboot官方發(fā)布的uboot代碼,而是為三星定制的一個(gè)uboot版本s3c-u-boot-1.1.6,其代碼作者就包括了三星的程序員與denx的員工。這個(gè)版本支持SD啟動(dòng),不過默認(rèn)是nand啟動(dòng),使它支持uboot需要做以下事情:

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

  //#define CONFIG_BOOT_NOR

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

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

  //#define CONFIG_BOOT_ONENAND

  //#define CONFIG_BOOT_ONENAND_IROM

  #define     CONFIG_NAND

  //#define CONFIG_ONENAND

  #define CONFIG_MOVINAND         打開movinand選項(xiàng),使uboot支持movinand的操作

  2、如果單純是做上面的改動(dòng),還是不夠的,在運(yùn)行的時(shí)候會(huì)發(fā)現(xiàn)到了一定的時(shí)候uboot就死掉了,其實(shí)這是因?yàn)閡boot中假設(shè)SMDK6410在使用SD方式的時(shí)候是從CH0啟動(dòng)的,但是手上的這個(gè)板子是通過CH1啟動(dòng),那么在運(yùn)行被復(fù)制到SRAM中的8K代碼時(shí)候沒辦法在CH0檢測(cè)到SD,更沒辦法將SD 里的代碼復(fù)制到SDRAM中。修改辦法是在incluede/

  movi.h中HSMMC_CHANNEL修改為1。

  3、然后如果將上述修改后編譯出來的u-boot.bin通過IROM_Fusing_tools直接燒寫到SD中也是沒辦法啟動(dòng)的,需要運(yùn)行以下的命令進(jìn)行處理:

  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內(nèi)容重復(fù)一次后(為了保證達(dá)到256K,如果這個(gè)bin更小,那么可能需要重復(fù)3次、4次,直到超過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燒寫到SD卡就可以成功啟動(dòng)系統(tǒng)了。

  為什么要做這樣的處理這個(gè)bin文件呢?下面通過分析IROM_Fusing_tools、uboot的源碼來揭示其中的由來。

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

  在SD啟動(dòng)方式下,S3C6410內(nèi)部的IROM程序BL0首先運(yùn)行,并將SD中的最后18個(gè)扇區(qū)開始的16個(gè)扇區(qū)內(nèi)容復(fù)制到片內(nèi)的8K SRAM,也就是SteppingStone,接著跳轉(zhuǎn)到這塊SRAM的開始地址開始運(yùn)行,這8K的代碼實(shí)際上就是上面u-boot_mmc.bin這個(gè)文件的最后8K,也是u-boot.bin的最開始8K代碼,這段代碼也叫BL1。從BL0跳轉(zhuǎn)到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í)現(xiàn)SD啟動(dòng)的關(guān)鍵。到了這里后就執(zhí)行movi_bl2_copy,這個(gè)函數(shù)負(fù)責(zé)將SD內(nèi)的uboot完整地復(fù)制到SDRAM,這時(shí)候完整的uboot也叫BL2,而這個(gè)函數(shù)實(shí)際上是調(diào)用了以下函數(shù):

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

  HSMMC_CHANNEL這是SD/MMC通道號(hào),手上板子使用的是CH1,而默認(rèn)是CH0,所以需要對(duì)這個(gè)進(jìn)行修改。

  MOVI_BL2_POS 是需要拷貝的數(shù)據(jù)位于SD的起始扇區(qū),其計(jì)算辦法是這樣的,先得到這個(gè)SD的總扇區(qū)數(shù)TOTAL,再減去256K的BL2和8K的BL1所占的扇區(qū)數(shù),最后減去0.5K 的eFuse和0.5K的保留區(qū)所占的扇區(qū)數(shù),而這里還定義SD的扇區(qū)為512B。從這里可以看到和IROM_Fusing_tools對(duì)SD卡的處理是完全對(duì)應(yīng)的。這里還有一個(gè)問題,總扇區(qū)數(shù)TOTAL是如何得到的?從程序來看是從(TCM_BASE - 0x4)這個(gè)地址讀取到的,至于TOTAL是如何被放到這里的就只能從BL0的代碼找答案了。

  MOVI_BL2_BLKCNT是需要復(fù)制的扇區(qū)數(shù)目,這里就是定義為256K,這也是為什么必須把u-boot.bin轉(zhuǎn)換成256K的文件。

  BL2_BASE是目的地址,也就是SDRAM中的地址。這里定義為0x57E00000,就是128M 的SDRAM的最后2M,因?yàn)榈竭@里為止MMU尚未打開,因此這里使用的是物理地址。

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

  而CopyMovitoMem這個(gè)函數(shù)的定義是這樣的:

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

  這個(gè)定義實(shí)際上是調(diào)用了位于TCM_BASE + 0x8這個(gè)地址的函數(shù)指針,其中TCM_BASE的值為0x0C004000,至于這個(gè)地址放的是什么,也沒資料說明。

  當(dāng)復(fù)制完BL2后便會(huì)跳轉(zhuǎn)到BL2的start_armboot這個(gè)C語言函數(shù)中運(yùn)行了,此后的運(yùn)行過程就不需要再分析了。

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
2 [報(bào)告]
發(fā)表于 2011-12-19 13:52 |只看該作者
對(duì)薩達(dá)撒
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP