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源码包:

本次移植采用的是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);

}

  • 1
  • 2
  • 下一页

相关内容