平台:Ubuntu、武漢創維特ARM9實驗箱JXARM9-2410-1、u-boot-1.1.6、arm-linux-gcc-3.3.2
在開始移植之前,得先了解u-boot的啟動過程,明白各個主要文件目錄。可閱讀README文檔。以下以S3C2410為例子簡要說明啟動過程中所用到的文件名:
cpu/arm920t/start.s 完成硬件初始化,設置cpu工作模式、關看門狗、設置時鐘等
→board/smdk2410/lowlevel_init.s 為第二階段准備RAM空間
→lib_arm/board.c跳轉到第二階段代碼的c入口點,初始化隊列中各項,分別到其他文件中調用。
→common/main.c循環調用main_loop
了解u-boot編譯過程:
make [board]_config 配置目標板,其中[board]為目標板名稱,需在board目錄下有相應文件夾,在include/configs/目錄下有相應頭文件。
→make all 編譯鏈接
1. 獲取U-Boot源碼包:http://www.linuxidc.com/Linux/2011-07/38897.htm
本次移植采用的是1.1.6版本。
2. 安裝交叉編譯器arm-linux-gcc-3.3.2。解壓到/usr/local/arm目錄下;出現3.3.2文件夾;修改環境變量/etc/profile;在最後添加export PATH=/usr/local/arm/3.3.2/bin:$PATH;執行source /etc/profile;使用arm-linux-gcc –v命令查看版本信息。
3. 解壓u-boot:tar –jxvf u-boot-1.1.6.tar.bz2
4. 修改頂層Makefile,為目標板建立編譯項。
smdk2410_config:unconfig
@$(MKCONFIG)$(@:_config=) arm arm920t smdk2410 NULL s3c24x0
修改為:
zfxjx2410_config:unconfig
@$(MKCONFIG)$(@:_config=) arm arm920t jx2410 NULL s3c24x0
其中:
arm,就表示現在用的是CPU的架構是arm體系結構。
arm920t,指明這是cpu的內核類型,它對應於cpu/arm920t目錄。
Smdk2400,這是開發板的型號,它的目錄在board/smdk2400目錄下。
NULL,表示開發者或者經銷商是誰(vender)。
S3c24x0,表示開發板上的cpu是啥。
5. 修改/board/smdk2410文件夾名稱:
mv /board/smdk2410 /board/jx2410
修改/board/smdk2410/smdk2410.c文件名稱:
mv /board/smdk2410/smdk2410.c /board/jx2410/jx2410.c
6. 修改/include/configs/smdk2410.h文件名稱
mv /include/configs/smdk2410.h /include/configs/zfxjx2410.h
7. 根據實際需要修改start.s。本次移植不需要修改。
根據需要修改/board/jx2410/jx2410.c。可配置時鐘MPLL、UPLL、I/O初始化。本次移植不修改。
若是2440,修改cpu/arm920t/s3c24x0/speed.c。因為2410與2440在計算MPLL公式不同。
8. 到前為止,可以編譯u-boot下載到目標板中看看效果。
從串口中可以看到u-boot啟動信息:
U-Boot 1.1.6(Sep 19 2011 -12:24:07)
DRAM: 64MB
Flash:512kB
……
但是從以上信息中可以看到Flash的信息和目標板真實信息不符。原因是在/include/configs/zfxjx2410.h中未根據硬件修改。不過目前能看到串口信息,我們之後的調試就變得簡單多了。如未能看到串口信息,可能波特率設置不對或串口驅動部分有問題。
9. 配置文件中一些顯示信息的修改。/include/configs/zfxjx2410.h
#define CONFIG_BOOTDELAY 1 //啟動延時
#define CFG_PROMPT "ZFX_JX2410 # " //命令行前的顯示信息
10. SDRAM的驅動。本次移植未修改。
11. 增加網口的驅動。
由於u-boot源碼是針對CS8900芯片的,而實驗箱用的是RTL8019。而我們在/driver目錄下找到了RTL8019的驅動程序,因此,只需在/include/configs/zfxjx2410.h中修改。 將
#define CONFIG_DRIVER_CS8900 1
#define CS8900_Base 0x19000300
#define CS8900_Bus16 1
修改為:
#define CONFIG_DRIVER_RTL8019 1
#define RTL8019_Base 0x18000300 //基地址,和硬件有關
#define RTL8019_Bus16 1
修改為:
#CFG_ETHADDR 01:36:75:18:14:37
#CFG_NETMASK 255.255.255.0
#CFG_IPADDR 172.30.0.116
#CFG_SERVERIP 172.30.0.117
編譯成功,下載,但是在tftp下載時,發生packet too big!錯誤,然後重啟。
在網上搜索,發現因為/drivers/rtl8019中,缺少volatile。加上,下載運行成功。
Static unsigned char get_reg(unsigned int regno)
{
return (*(volatile unsigned cahr *)regno);
}