AT91RM9200Linux移植笔记(二)-移植u-boot-1.1.6

u-boot的下载地址为http://sourceforge.net/project/showfiles.php?group_id=65938 ,最新的为u-boot-1.1.6,这个版本已经可以很好的支持AT91RM9200
添加PATH环境变量或者修改u-boot的Makefile将之前编译好的工具链路径添加进来
因为我们的开发板配置和at91rm9200dk很类似,因而可以直接使用at91rm9200dk_config的配置,如果相差比较大的话可以添加自己的开发板配置,还要修改诸如flash等的驱动,具体方法可参考u-boot的文档,一种简便的做法是在u-boot已经支持的开发板中参考选择一种较接近板的进行修改。
$ tar -jxvf u-boot.1.1.6.tar.bz2
$ cd u-boot.1.1.6
$ make distclean
$ make at91rm9200dk_config
$ make all
不出意外的话,这样应该可以编译出u-boot.bin。
at91rm9200内部本身有128k的片内rom,其固化了一个bootloader和uploader, 用来支持程序的下载和引导,而且其内部固化的程序提供了很多内部服务接口(Internel Service)供我们来使用,例如Xmodem,Tempo, DataFlash, CRC, Sine服务接口。
我就是通过串口来烧写u-boot的,修改板上的跳线,reset后串口一直输出"C",先下载一个loader.bin的文件,其主要任务是初始化基本的硬件,然后就可以用Xmodem协议来下载u-boot.bin.但是刚才编译出的u-boot.bin是无法运行的,这是因为在u-boot.1.1.6/include/configs/at91rm9200dk.h有一个预编译宏CONFIG_SKIP_LOWLEVEL_INIT。
在u-boot.1.1.6/cpu/arm920t/start.S中有如下语句:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
 bl cpu_init_crit
#endif
CONFIG_SKIP_LOWLEVEL_INIT这个宏如果没有定义, u-boot就自己来初始化硬件了,而刚才的loader.bin已经做过初始化了,所以会出问题。因此我们需要在at91rm9200dk.h定义这个宏:
#define CONFIG_SKIP_LOWLEVEL_INIT
在u-boot-1.1.4中cpu_init_crit没有加到该宏的预编译中,编译中会出问题,在1.1.6中已经得到了修正,start.S文件我们无需修改
at91rm9200dk.h的一些配置参数和我们的开发板有所区别,需要进行修改
我的系统空间配置为
0x10000000 - 0x1001FFFF u-boot.bin  or boot.bin + u-boot.gz
0x10020000 - 0x101FFFFF zImage
0xC0000000 - 0xC0800000 Ramdisk.gz
原来的配置会有地址上的重叠,主要是环境变量存储位置,修改如下:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT//ifdef改成ifndef
//#define CFG_ENV_ADDR   (PHYS_FLASH_1 + 0x60000)  /* after u-boot.bin */
#define CFG_ENV_ADDR   (PHYS_FLASH_1 + 0x100000)  /* after u-boot.bin and zImage*/
#define CFG_ENV_SIZE   0x10000 /* sectors are 64K here */
#else
#define CFG_ENV_ADDR   (PHYS_FLASH_1 + 0xe000)  /* between boot.bin and u-boot.bin.gz */
#define CFG_ENV_SIZE   0x2000  /* 0x8000 */
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
#define CFG_BOOT_SIZE  0x00 /* 0 KBytes */
#define CFG_U_BOOT_BASE  PHYS_FLASH_1
#define CFG_U_BOOT_SIZE  0x60000 /* 384 KBytes */
#else
#define CFG_BOOT_SIZE  0x6000 /* 24 KBytes */
#define CFG_U_BOOT_BASE  (PHYS_FLASH_1 + 0x10000)
#define CFG_U_BOOT_SIZE  0x10000 /* 64 KBytes */
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
定义以下默认环境变量,主要为将来进行tftp传输和启动内核使用,当然也可以在u-boot启动后在配置
#define CONFIG_ETHADDR 12.24.96.78.91.11
#define CONFIG_IPADDR 192.168.0.37
#define CONFIG_SERVERIP 192.168.0.39
#define CONFIG_BOARDNAME "AT91RM9200DEVKIT"
#define CONFIG_BOOTCOMMAND "cp.b 10020000 20008000 e0000;cp.b C0000000 21000000 200000;go 20008000"
重新编译后下载loader.bin和u-boot.bin,终于可以看到u-boot的启动界面,然后通过u-boot的命令重新下载并烧写到flash中去。这里有两种方式,一种是自带的boot.bin+uboot.gz,只要将刚才生成的u-boot.bin进行压缩得到uboot.gz,boot.bin会在从片内启动时被下载到板子上,以后还会被烧写到片外Flash中,以便在片外启动时用它来引导并解压u-boot.gz,并跳转到u-boot来执行。
u-boot-1.1.6已经可以直接烧入flash的0地址(这里的地址应为0x10000000)后,直接启动,进入u-boot下,因此另一种方法无需boot.bin,直接将u-boot.bin烧入flash的启动地址(0x10000000)。这时uboot需要对硬件进行初始化,注释掉刚才的定义的CONFIG_SKIP_LOWLEVEL_INIT宏,重新编译,然后烧写到flash中,修改回跳线,一切OK!
然后就可以通过u-boot下载烧写内核和文件系统了。

发表于 @ 2007年07月15日 14:52:00

posted on 2010-03-18 14:46  shevsten  阅读(629)  评论(0编辑  收藏  举报