相關系列閱讀:
u-boot2010.03 移植篇(一)-----建立編譯目標 http://www.linuxidc.com/Linux/2012-11/73814.htm
u-boot2010.03 移植篇(二)-----修改start.S,支持nand啟動 http://www.linuxidc.com/Linux/2012-11/73815.htm
u-boot2010.03 移植篇(三)-----修正配置文件.解決內存大小顯示問題 http://www.linuxidc.com/Linux/2012-11/73816.htm
u-boot2010.03 移植篇(四)-----支持DM9000,實現tftp下載 http://www.linuxidc.com/Linux/2012-11/73817.htm
下面開始 移植篇(二)-----修改start.S,支持nand啟動
----------------------------------------------------------
使用環境
PC: Ubuntu 11.04
kernel: 2.6.32-28-generic
corss: arm-linux-gcc 4.3.2
arm: s3c6410
uboot: uboot-2010-03
----------------------------------------------------------
作者: LvApp
聯系方式: [email protected]
一切版權均有作者所有,歡迎轉載,請指明出處,如何修改請與本人聯系,謝謝
uboot的第一階段,其實做的事情也是比較多的,,但是一般來說,重點就是配置各種硬件環境,來保證第二階段能正常啟動.
而該部分根據不同的硬件也是不同的..像我的,s3c6410有2片dram,和一片nand..所以我為了保證我的代碼能正常執行,我必須得把代碼搬移到內存裡面去.不然代碼在nand中也沒法執行...但是為什麼代碼在nand中不能執行呢?其中一個比較重要的原因就是nand並不是掛在CPU總線上面的,而是采用專門的硬件處理單元來控制的...nand控制器.
在你不添加任何代碼的情況下,是不能控制外圍的nand芯片的...但是怎麼辦.cpu內根本沒有代碼,怎麼才能讀取nand中的代碼到內存中去呢?沒錯-----s3c6410在啟動的時候會幫我們以nand的最基本的時序.搬移nand中的前8K代碼,到stepping這樣就可以執行了.而uboot的代碼遠比這個大..以至於我們得緊靠這部分代碼,來完成剩下的代碼部分的搬移....
今天的重點就是這個了.主要是來完成nand中剩余部分的uboot搬移到ram中,以便uboot能正常啟動起來....好了.直接開始..
首先,你得有smdk6410_config 編譯目標,不然怎麼開始.....此處省略N字...請看我的移植篇第一篇...
下面開始.打開start.S (cpu/arm1176/start.S)和smdk6410.h (include/configs/smdk6410.h)
我們得一邊參看頭文件中的配置,一邊修改代碼,來達到我們的目的..
在start.S 中,最開始就是一段啥?異常向量表,此處忽略,請參考分析篇中對start.S的分析
前面一部分是MMU啥的...直接招待after_copy:這個標簽
什麼?之前沒有任何copy的東西???怎麼有after_copy一說呢?
沒錯..所以我們得把copy代碼添加在這裡..從nand中把數據搬移出來,放到這之前完成,這樣才對得起這個after_copy的標簽
說干就干,這裡我是調用的C代碼,你也可以用匯編來完成的,只要功能一樣就行了
這裡我們得向我們的配置頭文件內添加一個宏,就是 #define CONFIG_NAND_BOOT
接著,我們要去添加我們要調用的copy_from_nand