上一篇博文:《mini2440移植uboot 2014.04(五)》html
代碼已經上傳到github上:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440linux
(十)添加nand 啓動代碼git
nand啓動是uboot中最讓人困惑的東西,它用到SPL(secondary program loader),對SPL進行講解的文檔比較少,初次接觸有點無所適從的感受。github
主要參考文檔能夠查看當前版本uboot下的doc/README.SPL和doc/README.arm-relocationide
還有個參考文檔是google chromium-os u-boot porting guide: http://www.chromium.org/chromium-os/u-boot-porting-guidepost
其實當前版本代碼結構有點奇怪,uboot源代碼下有spl,nand_spl兩個相似的文件夾,不知道應該使用哪一個文件夾。ui
nand_spl是很早之前版本就存在的文件夾,spl好像是新添加的文件夾(不清楚是哪一個版本新添加的文件夾)。google
uboot 2014.07-rc3版本(下載地址)中已經再也不包含nand_spl文件夾,彷佛之後版本會在spl下編譯代碼。url
仔細查看了一下,2014年6月6日的uboot代碼中將nand_spl文件夾所有刪除,其連接地址在這裏。spa
關於NAND有好幾個常見的宏定義:CONFIG_NAND_SPL,CONFIG_SPL_BUILD,CONFIG_NAND_U_BOOT.
其中CONFIG_NAND_SPL已通過時了,2013.01版本uboot代碼中有相關說明(參看《uboot 2013.01 代碼簡析(3)第二階段初始化》中貼出的部分代碼)。
當前使用CONFIG_SPL_BUILD來代替CONFIG_NAND_SPL,但從當前uboot代碼來看,支持這個宏的開發板平臺並不不少(omap,ti一些開發板有相應支持)。
而CONFIG_NAND_U_BOOT在Makefile中使用,若是定義了這個宏,那麼就會編譯nand_spl下代碼,在該文件夾下生成u-boot-spl,
再將u-boot-spl擴充到4k大小(名爲u-boot-spl-16k.bin),而後將其加入到之前生成的u-boot.bin前面,生成u-boot-nand.bin.
而硬件在使用nand 啓動時,只能讀取u-boot-nand.bin前面的4k大小,若是使用nand 啓動,那麼剛好讀取對應於u-boot-spl-16k.bin這部分代碼並執行。
以後再執行必要的輸出化,而後將u-boot-nand.bin中後續代碼(對應u-boot.bin)搬運到內存,再從內存執行後續代碼,其執行過程和直接內存啓動uboot很是相似了。
本文中參考https://gitcafe.com/keinye/mini2440-uboot代碼來實現nand 啓動. 它使用了CONFIG_NAND_U_BOOT和CONFIG_NAND_SPL 這兩個宏。
在include/configs/mini2440.h中添加下面一行代碼:
#define CONFIG_BOARD_EARLY_INIT_F
在board/friendlyarm/mini2440/mini2440.c中添加下面代碼:
#ifdef CONFIG_NAND_SPL void __weak board_init_f(ulong dummy) { unsigned int i; unsigned int stack = 0x33f80000; __asm__ __volatile__ ( "mov sp, %0" ::"r"(stack) :"sp"); nand_boot(); } #endif
從新編譯,加載到內存運行,一切正常。
在nand_spl下建立mini2440的文件夾:
mkdir -p nand_spl/board/friendlyarm/mini2440
而後在nand_spl/board/friendlyarm/mini2440下建立三個文件,它們分別是Makefile、u-boot.lds和config.mk。
這三個文件的實際內容比較長,文件具體內容請查看我上面的github連接。
而後須要對之前的代碼也進行修改,主要是參考https://gitcafe.com/keinye/mini2440-uboot,具體修改內容參看我上面的github連接。
改好代碼後,從新編譯:
make mini2440_config make CROSS_COMPILE=arm-linux-
而後打開三個控制檯,
而後打開三個控制檯,一個執行"sudo minicom",另外一個執行"openocd -f interface/jlink.cfg -f board/mini2440.cfg",最後一個控制檯執行下面內容:
telnet localhost 4444 reset init_2440
nand probe 0
nand erase 0
nand write 0 /home/host/soft/mini2440/u-boot-2014.04/u-boot-nand.bin 0 reset
倒數第二步執行 nand write花了28分鐘(uboot文件大小是548KB),
在minicom所在控制檯上能夠正常顯示和進入uboot。
可是,這個u-boot-nand.bin還有個問題,就是它不能直接啓動,若是關掉開發板再從新打開開發板,那麼就不能進入uboot界面(這個bug留到之後再來解決)。
這種狀況下,在從新打開開發板後,仍是打開三個控制檯,在最後一個控制檯,執行下面命令:
halt
init_2440
reset
而後就能在minicom所在控制檯上看到uboot能正常顯示和執行。