記錄Ok6410 sd 啓動uboot

1\參考資料https://github.com/SeanXP/ARM-Tiny6410/tree/master/no-os/sd-no-os/u-bootlinux

2\參考資料https://blog.csdn.net/xinxin_2011/article/details/85228961git

3\編譯sd ram128版本的ubootgithub

make ARCH=arm CROSS_COMPILE=$(編譯器路徑)/arm-linux-  forlinx_sd_ram128_config函數

make ARCH=arm CROSS_COMPILE=$(編譯器路徑)/arm-linux-  all -j8工具

 

4\操做編譯出來的u-boot.bin

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

學習

5\根據寫入位置信息,將u-boot寫入sd卡中spa

dd if=u-boot_256k.bin of=/dev/sdc seek= 7625166 bs=512.net

dd if=u-boot_256k.bin of=/dev/sdc seek=7625166 bs=512調試

synccode

 

 

下面是參考的資料

前面講了Uboot啓動流程和如何修改調試串口,相信你們對Uboot已經有了初步的瞭解,今天來進行更深一點的分析。上篇文章 OK6410開發板Uboot學習總結----(二)修改調試打印串口 遺留一個問題:燒寫文件時Uboot仍是使用原串口0打印。此次咱們就解決這個問題,製做本身的燒寫Uboot。
S3C6410芯片SD卡啓動流程能夠參見《S3C6410_Internal_ROM_Booting.pdf》文檔:

從圖中能夠看出,芯片上電後先執行BL0代碼,這部分程序是寫死在內部iROM中,出廠時廠家就燒寫好了的。而設置SD卡啓動後大體流程是先準備8K的引導代碼在BL1(寫在SD卡最後保留扇區中的那部分),它啓動後用來初始化系統,時鐘,串口,SDRAM等硬件,而且將SD卡中完整的Uboot(有效內容大小不能超過256K)拷貝到BL2上運行。
下面來分析拷貝的代碼,在cpu/s3c64xx/start.S文件:

若是從NAND Flash啓動,不須要拷貝,直接跳轉到after_copy處;若是從SD啓動,跳轉到movi_bl2_copy實現Uboot拷貝到BL2的功能。這個函數在哪裏了呢,這是一段C代碼,在cpu/s3c64xx/movi.c文件中:

6410是有兩個MMC通道的,OK6410使用的是通道0,若是板子使用其餘通道的話,須要修改include/movi.h文件的HSMMC_CHANNEL宏:

計算偏移量和大小這裏面涉及到的宏較多,重要的是MOVI_BL2_POS和BL2_BASE,都是在include/movi.h文件中定義的,BL2_BASE好分析,先來看它:


因爲拷貝代碼後才使能MMU單元,因此這個地址是映射前的物理地址,由TEXT_BASE決定。記得第一篇博文OK6410開發板Uboot學習總結----(一)Uboot啓動分析 裏面提到uboot1.1.6\board\samsung\smdk6410\u-boot.lds文件:

那麼這個TEXT_BASE地址就是0x00000000嗎,再看同目錄下的Makefile文件:

在編譯的時候包含了當前目錄的config.mk文件,這裏有對有TEXT_BASE的定義:

顯示TEXT_BASE已經被更新爲0x5FE00000了。再來看MOVI_BL2_POS宏定義:

可見MOVI_BL2_POS 是須要拷貝的數據位於SD的起始扇區位置,其計算須要依靠其餘幾個宏,也定義在movi.h文件:

這裏定義SD卡扇區大小固定爲512了,這也是爲何大容量的SD卡直接用於燒寫是不行的(網上有說經過改寫上位機SD卡製做程序才行,大扇區SD卡也得改成512來讀寫,之後有時間試試)。經過計算:

MOVI_LAST_BLKPOS = *((volatile unsigned int*)(TCM_BASE - 0x4))-((1 * 1024)/512)
MOVI_BL1_BLKCNT = (8*1024) / 512 = 16
MOVI_BL2_BLKCNT = (256 * 1024) / 512 = 512
MOVI_ENV_BLKCNT = 0x4000/512 = 32
1
2
3
4
MOVI_BL1_BLKCNT是BL1代碼所佔的大小(16x512=8K),MOVI_BL2_BLKCNT是BL2代碼所佔的大小(512x512=256K),這也解釋了爲何Uboot代碼不能超過256K了。目前只有MOVI_LAST_BLKPOS還沒計算出來,大體看出了MOVI_BL2_POS的計算方式:
先獲得這個SD的總扇區數TOTAL,再減去256K的BL2和8K的BL1所佔的扇區數,最後減去0.5K 的eFuse和0.5K的保留區所佔的扇區數。
看下圖會更清楚,這也是爲何上位機制做燒寫SD的工具須要操做最後的18個扇區:

程序中用到了寄存器地址TCM_BASE-4來得到SD卡的總容量的,具體怎麼獲得的呢?先看它在movi.h文件中定義:

TCM_BASE - 0x4就是0x0C003FFC,這塊地址是幹什麼的呢,顯然不是外設地址(外設是從0x70000000開始的),仍是看手冊吧:

手冊裏介紹這塊屬於內部SRAM地址範圍,啓動的時候該地址會被映射的,而其餘的手冊並無介紹,仍是看《S3C6410_Internal_ROM_Booting.pdf》文檔:


終於找到這個既熟悉又陌生的地址了,它就表明SD卡的總容量塊數,是芯片內部自動讀取到的。這文檔沒有中文的啊,就乎看吧,要是有個英語好的妹子記得聯繫我啊,能助我一臂之力。唔,不說了,好害羞啊。。。
再回頭去看movi_bl2_copy函數中CopyMovitoMem函數:

也是用這個地址+8,這個拷貝函數也是芯片自動實現的:

這個拷貝函數對於SDHC類型的卡有什麼限制條件嗎:

要求每塊扇區大小是512字節,這就是爲何前面計算時扇區大小固定爲512了,你要用大容量的SD卡,扇區不是512字節的就不行了,拷貝函數首先就不支持了。

分析完6410的SD卡啓動流程,那麼如何編譯燒寫用的mmc.bin文件呢,在uboot1.1.6/include/configs/smdk6410.h文件裏有相關的宏定義:


可見是經過定義FORLINX_BOOT_NAND 和FORLINX_BOOT_SD來區分的,當定義FORLINX_BOOT_SD宏時,CONFIG_BOOT_MOVINAND宏也會被定義,並且CONFIG_BOOTCOMMAND就變爲燒寫u-boot.bin等一系列燒寫命令了,這就是爲何SD卡啓動的Uboot能自動實現燒寫功能。
那麼FORLINX_BOOT_NAND宏在哪裏定義的呢?在uboot1.1.6/include/config.h文件中定義的:

註釋上寫得很清楚,這個是自動產生的,不須要咱們本身編輯。編譯前執行命令「make forlinx_nand_ram256_config」產生的這些宏定義,咱們來看下Makefile文件:

下面的forlinx_sd_ram256_config標籤就應該是配置SD卡啓動的編譯宏定義,兩者區別只在於一個有「NAND」,一個有「SD」。分析一下這個命令,首先unconfig 命令是刪除之前的配置文件,然後面的@$(MKCONFIG):
@表示不要echo這個命令到標準輸出
$(MKCONFIG) 是個環境變量,對應腳本的名字是mkconfig
那麼至關於執行「mkconfig smdk6410 arm s3c64xx…」命令,後面的內容以參數的形式傳入了mkconfig腳本中,好比smdk6410對應的就是$1,依次推算,NAND或SD對應的是$7,那麼看一下腳本文件:

若是是SD,就往config.h文件寫入FORLINX_BOOT_SD宏,若是是NAND,就往config.h文件寫入FORLINX_BOOT_NAND宏。因而可知,只要執行「make forlinx_sd_ram256_config」,就能完成支持SD卡啓動Uboot的編譯配置。可是編譯完的u-boot.bin文件,大小並無符合上面要求的256K+8K的條件,因此還得本身寫個腳本:

cat u-boot.bin >> tempcat u-boot.bin >> tempsplit -b 256k tempmv xaa u-boot_256k.binsplit -b 8k u-boot.binmv xaa u-boot_8k.bincat u-boot_256k.bin >> u-boot_mmc.bincat u-boot_8k.bin >> u-boot_mmc.bin12345678這個腳本負責把大小不足256K的u-boot.bin文件填充至256K,再在後面加上8K大小的BL1啓動的Uboot程序。因爲飛凌原來的mmc.bin文件大小就是280K(這可能與上位機燒寫軟件SD_Writer.exe寫法有關),因此這裏在256K的u-boot_256k.bin文件後面又添加了3個8K的u-boot_8k.bin,正好大小爲280K。把咱們新生成的u-boot_mmc.bin文件用SD_Writer.exe程序寫進SD卡中,燒寫後,這下燒寫用的Uboot調試串口也改成咱們指定的串口3了,大功告成!!!--------------------- 做者:竹影雲 來源:CSDN 原文:https://blog.csdn.net/xinxin_2011/article/details/85228961 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索