GNU ARM匯編--(十九)u-boot-nand-spl啟動過程分析
移植環(huán)境:
本文引用地址:http://www.ex-cimer.com/article/201611/321712.htmubuntu 12.04
U-Boot 2012.07 (Nov 28 2012 - 20:05:48)
arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2009q1-203) 4.3.3
GNU ld (Sourcery G++ Lite 2009q1-203) 2.19.51.20090205
我移植的uboot只支持nand flash,原因是手頭沒辦法燒寫nor flash,所以不敢去動.支持tftp下載各種鏡像文件.
給出patch下載的地址:http://download.csdn.net/detail/dndxhej/4833784
因?yàn)槭遣捎玫膎and_spl方式從nand flash啟動,將前面4K的鏡像執(zhí)行過程和后面252K大小的鏡像執(zhí)行過程做一個(gè)大概的描述性的分析,不想寫的過于具體,因?yàn)橹肋^程后和必備的知識后,如果哪里出了問題,那時(shí)候也可以一句一句代碼的查問題.
前面4K代碼在內(nèi)部sram中執(zhí)行的步驟是:
1.設(shè)置cpu為svc模式
2.關(guān)閉開門狗和中斷
3.初始化系統(tǒng)時(shí)鐘
4.禁用MMU和Cache
5.初始化sdram控制器
6.設(shè)置sp,跳到剛才提到的nand_boot.c里面的nand_boot函數(shù),這個(gè)函數(shù)初始化nand的控制器,并將4K之后的u-boot.bin image從nand中l(wèi)oad到sdram中,然后跳轉(zhuǎn)到u-boot.bin image的開始處繼續(xù)后續(xù)的工作
后面252K代碼在sdram中執(zhí)行的步驟是:
1.依舊是從start.S匯編開始call_board_init_f,設(shè)置好sp后跳到arch/arm/lib/board.c中的board_init_f函數(shù)
2.board_init_f完成部分初始化工作后跳轉(zhuǎn)到匯編寫的relocate_code
3.relocate_code完成重定位工作后跳轉(zhuǎn)到board_init_r
4.board_init_r函數(shù)完成后續(xù)的初始化工作后跳轉(zhuǎn)到main_loop,根據(jù)延時(shí)進(jìn)入引導(dǎo)os的過程,如果打斷這個(gè)過程,就進(jìn)入uboot的命令行模式
簡短的分析到這里了,對uboot移植做一個(gè)小結(jié):
首先,要有信心解決移植過程中遇到的各種問題
其次,要具備解決各種問題的知識要點(diǎn),大概列舉有makefile,shell腳本,簡單的正則表達(dá)式,編譯鏈接和鏈接腳本的寫法,arm體系結(jié)構(gòu)和匯編語言,仔細(xì)閱讀相關(guān)的datasheet.
雖然uboot移植成功了,但是uboot作為一款強(qiáng)大的bootloader,還有很多有意思的東西值得我們?nèi)W(xué)習(xí),比如說:
1.hush的實(shí)現(xiàn),uboot的命令行模式就是基于hush實(shí)現(xiàn)的,linux下的shell也是基于這個(gè)的,這個(gè)處理還是相當(dāng)復(fù)雜的.
2.uboot下的網(wǎng)絡(luò)實(shí)現(xiàn)了物理層(DM9000),網(wǎng)絡(luò)層(ICMP),傳輸層(UDP)和應(yīng)用層(tftp)的具體實(shí)現(xiàn),以后要深入學(xué)習(xí)網(wǎng)絡(luò),可以從uboot實(shí)現(xiàn)的簡單網(wǎng)絡(luò)協(xié)議棧入手,再深入到linux下的網(wǎng)絡(luò).
還有很多值得說道的地方,就不詳細(xì)說了,路漫漫,但是路在腳下
評論