首页 / 操作系统 / Linux / U-Boot在JX2410上的移植
平台: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.bz24. 修改顶层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.c6. 修改/include/configs/smdk2410.h文件名称mv /include/configs/smdk2410.h /include/configs/zfxjx2410.h7. 根据实际需要修改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: 64MBFlash: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);}