1. 程式人生 > >第四章:基於九鼎X210開發板移植2014.10版U-boot之使用sd卡啟動

第四章:基於九鼎X210開發板移植2014.10版U-boot之使用sd卡啟動

start.S是所有armv7架構的cpu共用的,在start.S中的應該都不需要太多的改動。分析到下面,對uboot有了解的朋友,應該都知道這幾個函式主要幹嘛的

cpu_init_cp15:對cp15暫存器進行初始化的,這個不去動它。

cpu_init_crit:分析進去這個函式,可以發現最後它呼叫的就是我們板級目錄下的lowlevel_init.S檔案,這個得好好改改。

_main:這個函式在crt0.S,用來初始化記憶體的棧,然後去執行board_f函式。

接下來就進入lowlevel_init中分析,lowlevel_init.s路徑:/board/samsung/x210,在這裡面主要做了關看門狗、禁止中斷、設定SRAM、設定串列埠等,參考開發板廠商的uboot,設定相應的電源置鎖程式碼。設定完成後再列印一個O來表示成功。

這時候就需要將uboot拷貝到sd卡中去啟動,要不然之前的uboot啟動時已經制鎖了電源按鍵,我們自己測就測不出效果了。

當然,結果還是不能啟動,這時候需要分析一下,之前我們使用tftp下載,能夠正常啟動,那應該就能說明這個新版的uboot是沒有問題的,但是用sd卡啟動卻啟動不了。

假設1:sd卡通道壞了。
於是我用之前編譯過的舊版的uboot燒錄到sd卡中,能夠正常啟動。

排除上述假設之後,想起之前學習x210裸機的時候提及到:

S5PV210啟動時,會先執行內部IROM中的固化程式碼進行一些必要的初始化,執行完後硬體上會自動讀取NAND Flash或sd卡等啟動裝置的前16K的資料到IRAM中,這16K資料中的前16byte中儲存了一個叫校驗和的值,拷貝資料時S5PV210會統計出待執行的bin檔案中含‘1’的個數,然後和校驗和做比較,如果相等則繼續執行程式,否則停止執行。

在sd卡燒錄映象的製作工具中,會拆分uboot.bin為BL1和BL2,然後將BL1這部分的檔案的前16個位元組填充,填充格式如下


因此在編譯uboot.bin的時候,要在uboot前面加上16位元組的無用資訊佔位,要不然燒錄工具製作的時候,就會將前16位元組給覆蓋了。

怎麼新增16位元組的無效資料佔位呢?首先在/arch/arm/cpu/uboot.lds中找到整個uboot的入口為_start。


然後找到_start在arch/arm/lib下的vectors.S中,然後在_start前面加上16位元組的無效資料作為填充。

(ps:之前的uboot的start在start.s下,一開始的時候,直接就在start.s前面加填充位元組,結果無效,後來才意識到要找_start這個入口)

 

修改完vectors.S後,再次編譯,然後檢視主目錄下的system.map檔案,可以看到_start的入口地址挪動了16個位元組了。

燒錄到sd卡中,啟動後,打印出了O,鬆開電源鍵,電源也被鎖住了。算是成功了一小步。