基于cortex-A8的Bootloader設計
該函數實現對Nand Flash發送命令或者地址。
③ int (*dev_ready)(struct mtd_info *mtd);
該函數實現檢測Nand Flash設備狀態。
最后將成員ecc.mode設置為NAND_ECC_SOFT,即ECC軟件校驗。
配置文件中相應的宏定義如下所示:
#define CONFIG_NAND_S5PV210 /* 告訴Makefile編譯Nand模塊 */
#define CONFIG_SYS_MAX_NAND_DEVICE 1 /* 指定設備數量 */
#define CONFIG_SYS_NAND_BASE 0xB0E00000 /* Nand Flash 控制器的基址 */
3.2 支持網卡
支持nfs或tftp網絡下載會極大的方便我們從Linux服務器上下載文件或鏡像到硬件平臺上。所以使能網卡在U-Boot移植過程中也顯得非常重要。以網卡dm9000為例,U-Boot已經抽象出一套完整的關于dm9000的驅動代碼(其源碼路徑為driversnetdm9000x.c)。用戶只需要根據具體的硬件電路配置相應的宏即可。U-Boot中 dm9000網卡初始化函數的調用關系為:
board_init_r()->eth_initialize()->board_eth_init()->dm9000_initialize()。
配置文件中相應的宏定義如下所示:
#define CONFIG_DRIVER_DM9000 /* DM9000網卡模塊加入編譯 */
#define CONFIG_DM9000_BASE (0x88001000) /* 基地址 */
#define DM9000_IO (CONFIG_DM9000_BASE) /* IO口地址 */
#define DM9000_DATA (CONFIG_DM9000_BASE + 0x300C) /* 數據口地址 */
3.3.支持環境變量的保存和修改
為了方便用戶配置,U-Boot將一部分變量,如串口波特率、ip地址、內核參數、啟動命令等存在Flash或SD卡上,這部分數據稱為環境變量。每次上電啟動時,U-Boot會檢查Flash或SD卡上是否存放有環境變量。如果有則將其讀取出來并使用,如果沒有就使用默認的環境變量。默認的環境變量定義在 env_default.h中。用戶也可以隨時修改或保存環境變量到Flash或SD卡中。
對于環境變量的移植也非常簡單。以Nand Flash為例,開發人員在smdkv210.h源文件中只需要添加如下的宏定義即可:
#define CONFIG_ENV_IS_IN_NAND /* 告訴Makefile環境變量保存在Nand Flash中 */
#define CONFIG_ENV_OFFSET 0x80000 /* 環境變量保存的Nand Flash中的偏移地址 */
#define CONFIG_ENV_SIZE 0x20000 /* 環境變量的大小 */
#define CONFIG_ENV_OVERWRITE /* 規定環境變量和覆蓋 */
4. 測試結果
4.1. 測試U-Boot啟動
測試平臺的軟硬件環境:
◆ 硬件平臺為友善之臂的smart210開發板;
◆ Linux服務器版本為ubuntu9.0;
◆ U-Boot版本為2013-01;
◆ GCC交叉編譯工具鏈版本為4.3.2。
首先將修改后的源碼包放到裝有交叉編譯工具鏈的Linux服務器上,輸入命令make即可以編譯生成兩個二進制文件。一個是smdkv210- spl.bin,即BL1代碼,存放在spl目錄下。另一個是u-boot.bin,即BL2代碼,存放在頂層目錄下。然后插入SD卡,執行 write2sd.sh腳本就可以把BL1和BL2分別燒寫到SD卡的第1扇區和第49扇區。write2sd.sh腳本實現如下:
#!/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開發板的SD卡槽中,連接好串口和網線,上電啟動。之后可以通過串口工具(本次測試使用的是SecureCRT)看到輸出信息如圖四所示,表示該U-Boot已經成功運行在開發板上。

圖四 測試U-Boot啟動
4.2 測試Nand Flash和網卡。
在等待命令狀態下輸入“nfs 20000000 192.168.1.123:/work/nfs_root/uImage”,該命令表示從ip為192.168.1.123的Linux服務器上,通過 nfs下載該服務器上“/work/nfs_root”目錄下的uImage,并存放在內存地址為0x20000000處。uImage為適配于 s5pv210開發板的Linux內核鏡像。等待一段時間后看到“Bytes transferred = 2127008 (2074a0 hex)”字樣,表示下載成功。
下載成功之后輸入命令“nand erase.part kernel”,該命令表示擦除Nand Flash上的kernel分區。接著輸入命令“nand write 20000000 kernel”,該命令表示拷貝內存地址為0x20000000的內容,燒寫到Nand Flash的kernel分區中。內存地址0x20000000存放的內容正是之前我們從Linux服務器上下載下來的uImage。kernel保存在環境變量mtdparts中,kernel規定了該分區的起始地址和大小。執行完這兩條命令后看到“4194304 bytes written: OK”字樣,表示系統內核已經成功燒寫到Nand Flash中,證明了Nand Flash和網卡均可以正常使用。其實驗結果如圖五所示:

圖五 測試Nand Flash和網卡
4.3 測試引導內核啟動
燒寫完內核之后執行boot命令就可以啟動該內核。boot命令實際上是執行環境變量bootcmd中的一條語句,其內容為“nand read 20000000 kernel; bootm 20000000”,該語句表示從Nand Flash的kernel分區中讀出內核并存放在內存地址為0x20000000處,然后跳轉在該地址執行內核鏡像。啟動過程中可以看到串口打印出如圖六所示的信息,證明了該U-Boot已經成功支持引導Linux操作系統。

圖六 測試引導內核啟動










評論