基于cortex-A8的Bootloader設(shè)計(jì)
該函數(shù)實(shí)現(xiàn)對Nand Flash發(fā)送命令或者地址。
③ int (*dev_ready)(struct mtd_info *mtd);
該函數(shù)實(shí)現(xiàn)檢測Nand Flash設(shè)備狀態(tài)。
最后將成員ecc.mode設(shè)置為NAND_ECC_SOFT,即ECC軟件校驗(yàn)。
配置文件中相應(yīng)的宏定義如下所示:
#define CONFIG_NAND_S5PV210 /* 告訴Makefile編譯Nand模塊 */
#define CONFIG_SYS_MAX_NAND_DEVICE 1 /* 指定設(shè)備數(shù)量 */
#define CONFIG_SYS_NAND_BASE 0xB0E00000 /* Nand Flash 控制器的基址 */
3.2 支持網(wǎng)卡
支持nfs或tftp網(wǎng)絡(luò)下載會(huì)極大的方便我們從Linux服務(wù)器上下載文件或鏡像到硬件平臺上。所以使能網(wǎng)卡在U-Boot移植過程中也顯得非常重要。以網(wǎng)卡dm9000為例,U-Boot已經(jīng)抽象出一套完整的關(guān)于dm9000的驅(qū)動(dòng)代碼(其源碼路徑為driversnetdm9000x.c)。用戶只需要根據(jù)具體的硬件電路配置相應(yīng)的宏即可。U-Boot中 dm9000網(wǎng)卡初始化函數(shù)的調(diào)用關(guān)系為:
board_init_r()->eth_initialize()->board_eth_init()->dm9000_initialize()。
配置文件中相應(yīng)的宏定義如下所示:
#define CONFIG_DRIVER_DM9000 /* DM9000網(wǎng)卡模塊加入編譯 */
#define CONFIG_DM9000_BASE (0x88001000) /* 基地址 */
#define DM9000_IO (CONFIG_DM9000_BASE) /* IO口地址 */
#define DM9000_DATA (CONFIG_DM9000_BASE + 0x300C) /* 數(shù)據(jù)口地址 */
3.3.支持環(huán)境變量的保存和修改
為了方便用戶配置,U-Boot將一部分變量,如串口波特率、ip地址、內(nèi)核參數(shù)、啟動(dòng)命令等存在Flash或SD卡上,這部分?jǐn)?shù)據(jù)稱為環(huán)境變量。每次上電啟動(dòng)時(shí),U-Boot會(huì)檢查Flash或SD卡上是否存放有環(huán)境變量。如果有則將其讀取出來并使用,如果沒有就使用默認(rèn)的環(huán)境變量。默認(rèn)的環(huán)境變量定義在 env_default.h中。用戶也可以隨時(shí)修改或保存環(huán)境變量到Flash或SD卡中。
對于環(huán)境變量的移植也非常簡單。以Nand Flash為例,開發(fā)人員在smdkv210.h源文件中只需要添加如下的宏定義即可:
#define CONFIG_ENV_IS_IN_NAND /* 告訴Makefile環(huán)境變量保存在Nand Flash中 */
#define CONFIG_ENV_OFFSET 0x80000 /* 環(huán)境變量保存的Nand Flash中的偏移地址 */
#define CONFIG_ENV_SIZE 0x20000 /* 環(huán)境變量的大小 */
#define CONFIG_ENV_OVERWRITE /* 規(guī)定環(huán)境變量和覆蓋 */
4. 測試結(jié)果
4.1. 測試U-Boot啟動(dòng)
測試平臺的軟硬件環(huán)境:
◆ 硬件平臺為友善之臂的smart210開發(fā)板;
◆ Linux服務(wù)器版本為ubuntu9.0;
◆ U-Boot版本為2013-01;
◆ GCC交叉編譯工具鏈版本為4.3.2。
首先將修改后的源碼包放到裝有交叉編譯工具鏈的Linux服務(wù)器上,輸入命令make即可以編譯生成兩個(gè)二進(jìn)制文件。一個(gè)是smdkv210- spl.bin,即BL1代碼,存放在spl目錄下。另一個(gè)是u-boot.bin,即BL2代碼,存放在頂層目錄下。然后插入SD卡,執(zhí)行 write2sd.sh腳本就可以把BL1和BL2分別燒寫到SD卡的第1扇區(qū)和第49扇區(qū)。write2sd.sh腳本實(shí)現(xiàn)如下:
#!/bin/sh
sudo dd iflag=dsync oflag=dsync if=spl/smdkv210-spl.bin of=/dev/sdc seek=1
sudo dd iflag=dsync oflag=dsync if=u-boot.bin of=/dev/sdc seek=49
燒寫完成之后將SD卡插入到smart210開發(fā)板的SD卡槽中,連接好串口和網(wǎng)線,上電啟動(dòng)。之后可以通過串口工具(本次測試使用的是SecureCRT)看到輸出信息如圖四所示,表示該U-Boot已經(jīng)成功運(yùn)行在開發(fā)板上。
圖四 測試U-Boot啟動(dòng)
4.2 測試Nand Flash和網(wǎng)卡。
在等待命令狀態(tài)下輸入“nfs 20000000 192.168.1.123:/work/nfs_root/uImage”,該命令表示從ip為192.168.1.123的Linux服務(wù)器上,通過 nfs下載該服務(wù)器上“/work/nfs_root”目錄下的uImage,并存放在內(nèi)存地址為0x20000000處。uImage為適配于 s5pv210開發(fā)板的Linux內(nèi)核鏡像。等待一段時(shí)間后看到“Bytes transferred = 2127008 (2074a0 hex)”字樣,表示下載成功。
下載成功之后輸入命令“nand erase.part kernel”,該命令表示擦除Nand Flash上的kernel分區(qū)。接著輸入命令“nand write 20000000 kernel”,該命令表示拷貝內(nèi)存地址為0x20000000的內(nèi)容,燒寫到Nand Flash的kernel分區(qū)中。內(nèi)存地址0x20000000存放的內(nèi)容正是之前我們從Linux服務(wù)器上下載下來的uImage。kernel保存在環(huán)境變量mtdparts中,kernel規(guī)定了該分區(qū)的起始地址和大小。執(zhí)行完這兩條命令后看到“4194304 bytes written: OK”字樣,表示系統(tǒng)內(nèi)核已經(jīng)成功燒寫到Nand Flash中,證明了Nand Flash和網(wǎng)卡均可以正常使用。其實(shí)驗(yàn)結(jié)果如圖五所示:
圖五 測試Nand Flash和網(wǎng)卡
4.3 測試引導(dǎo)內(nèi)核啟動(dòng)
燒寫完內(nèi)核之后執(zhí)行boot命令就可以啟動(dòng)該內(nèi)核。boot命令實(shí)際上是執(zhí)行環(huán)境變量bootcmd中的一條語句,其內(nèi)容為“nand read 20000000 kernel; bootm 20000000”,該語句表示從Nand Flash的kernel分區(qū)中讀出內(nèi)核并存放在內(nèi)存地址為0x20000000處,然后跳轉(zhuǎn)在該地址執(zhí)行內(nèi)核鏡像。啟動(dòng)過程中可以看到串口打印出如圖六所示的信息,證明了該U-Boot已經(jīng)成功支持引導(dǎo)Linux操作系統(tǒng)。
圖六 測試引導(dǎo)內(nèi)核啟動(dòng)
評論