歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

u-boot2010.03 移植篇(二)-----修改start.S,支持nand啟動

 

相關系列閱讀:

 

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

  1. *
  2. * copy U-Boot to SDRAM and jump to ram (from NAND or OneNAND)
  3. * r0: size to be compared
  4. * Load 1'st 2blocks to RAM because U-boot's size is larger than 1block(128k) size
  5. *///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  6. .globl copy_from_nand
  7. copy_from_nand:
  8. mov r10, lr /* save return address */
  9. mov r9, r0
  10. /* get ready to call C functions */
  11. ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
  12. sub sp, sp, #12
  13. mov fp, #0 /* no previous frame, so fp=0 */
  14. mov r9, #0x1000
  15. bl copy_uboot_to_ram /* 此函數需要添加,稍後說明。 */
  16. 3: tst r0, #0x0
  17. bne copy_failed /* 判斷返回值是否失敗 */
  18. ldr r0, =0x0c000000 /* 判斷內容是否一致 */
  19. ldr r1, _TEXT_PHY_BASE
  20. 1: ldr r3, [r0], #4
  21. ldr r4, [r1], #4
  22. teq r3, r4
  23. bne compare_failed /* not matched */
  24. subs r9, r9, #4
  25. bne 1b
  26. 4: mov lr, r10 /* all is OK */
  27. mov pc, lr
  28. copy_failed:
  29. nop /* copy from nand failed */
  30. b copy_failed
  31. compare_failed:
  32. nop /* compare failed */
  33. b compare_failed
Copyright © Linux教程網 All Rights Reserved