打造屬於自己的uboot

對bootloader我一直是很敢興趣的,之前上嵌入式課的時候由於抽不出時間一直沒有好好研究當時使用的vivi。幸好最近忙裏偷閒,以ok6410開發板爲平臺,對於uboot進行了一番不算很深入的研究。


我對bootloader基本上沒啥瞭解,所以本質上是從0開始學起。一開始不知道從哪裏入手,幸好有一些開發板的資料,當然包括移植好的uboot,可惜版本有點老,是1.1.6的,不過不失爲很好的參考資料。


我將最新版的uboot(2011.12)作爲研究版本。本以爲有1.1.6版的參考,移植工作應該會很順利,但是一看源碼才發現,兩個版本的結構有較大的差別。而且兩個版本對smdk6410的一些設置命名也完全不同,在1.1.6中,都是以CFG_開頭的,而新版中則改爲了CONFIG_。所以不能直接依樣畫葫蘆照搬,還是要從原理出發。


由於新版的uboot中已經加入了對6410的支持,研究過程相對變得方便許多。首先我將2011-12-uboot中有關6400的文件代碼都改爲了6410,並且刪除一些不需要的文件。雖然此版本中的uboot已經支持6410的nand啓動,但是使用編譯過後的u-boot-nand.bin,串口終端還是沒有任何顯示。可能相應的nand驅動不符合吧~於是還是按照1.1.6版本的思路,對uboot進行移植。在研究工程中,我一度想放棄,因爲實在沒有思路,也沒有調試的方法。一次偶然的機會,我發現了一個較爲實用的調試手段,就是通過arm-linux-objdump工具查看uboot的反彙編代碼,具體命令爲:arm-linux-objdump -d u-boot > info.txt。反彙編代碼幫助了我許多,讓我理解了uboot的一些工作機制。


s3c6410的啓動方式有很多種,詳情可以參看點擊打開鏈接。簡單來講,有兩個模式是需要注意的,一個是IROM啓動,另一個就是NAND啓動。一開始我使用sd卡燒寫uboot,其實就是irom啓動。在s3c6410出廠時,裏面有一段固化程序(固件),一旦選擇IROM方式啓動,這部分程序會首先運行,這部分程序被稱爲bootloader0,BL0。主要完成一些初始化工作。然後根據相應管腳的設置確定具體的設備,並從制定的區域讀取4KB的程序到指定的區域運行,這段代碼被稱爲BL1。然後再跳轉到BL2。具體的,飛凌提供的方案的這樣的:提供給用戶mmc.bin用來燒寫u-boot.bin。我對mmc.bin的理解是這樣的:飛凌提供的SD_Writer.exe將MMC.bin中的BL1和BL2寫入到SD卡中相應的位置,然後選擇IROM方式啓動後,在IROM(32KB)的固化程序將SD卡中的BL1 copy至steppingstone區域(SRAM),然後BL1將BL2 copy至SDRAM,完成NAND和一些硬件的初始化,然後把保存在SD卡中的uboot和Zimage copy到內存中,並寫入NAND保存,爲Nand啓動做準備。總結來說,mmc.bin其實就是uboot1.1.6編譯得到的,只是啓動方式是movinand,所有的原理和uboot是一致的。BL0將BL1加載到steppingstone區域,然後BL1開始初始化硬件,並將u-bootcopy到nand中。當我們燒寫完uboot再從nand啓動時,從0x0c000,0000,就是steppingstone(其實就是nand 0x0的映射,硬件完成此映射工作)開始執行,對硬件進行初始化,然後將uboot從0x0 copy到ram中,即0x57e00,0000 (ram的起始地址爲0x5000,0000)。


uboot的大致工作流程如下:

1. 程序的入口是start.s,在start.s中條用其他函數

2. 首先比較重要的是初始化一些基本的硬件設備,包括關閉看門狗之類的。在lowlevel_inis.s中完成,主要是uart,nand,系統時鐘以及memory的一些初始化。

3. 然後調用copy_from_nand,將uboot從nand copy到ram中

4. 驗證copy的正確性

5. 跳轉到start_armboot,即BL2。使用c語言完成一些高級初始化工作。copy linux kernel到內存中,比如從annd的0x40000 copy 到ram的0x5000,8000.


uart的初始化若正確,則串口終端就可以顯示內容了;memory的初始化若不正確,可能在copy code from nand to ram的時候會有錯誤。另外要注意的是,由於steppingstone的大小爲4KB,所以一些關鍵性代碼必須放在uboot的前4kb中,可以通過連接腳本(uboot.lds)來指定。也就是說在前4KB的代碼,必須要完成copy from nand to ram。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章