前言
今年1月份到2月份在自己博客上发表了几篇关于AT91RM9200引导程序的**,分别是
建立交叉编译工具链
TFTP和NFS服务的设置
U-Boot1.1.4在AT91RM9200上的移植
时间过的很快,工作也很忙,一晃就过了半年多。再回头看,已经发现很多都落伍了。新版本出了一波又一波。linux已经到了2.6.20。federo也已经到了FC7。如果不对本人以前的**更新的话,势必会误导初学者。所以针对目前比较新的环境,重新写下整个过程。不过,由于实在挺忙的,所以比第一次写的要简洁许多,大家如果有不明白的地方,可以参考以前的**。大多数内容都大同小异,只不过一些细节需要注意。由于比较匆忙,没有仔细核对。如果您在文中发现有不当之处敬请批评指正。
这次使用的环境及软件源码版本如下:
软件环境
宿主机:FC6 ,虚拟机vmware 6.0
Linux-2.6.19.2 +at91patch
U-Boot 1.2 , busybox1.2.2.1(或者busybox-1.6.1)
硬件环境
母板:AT91RM9200EK
CPU:AT91RM9200 ,180MHz(200MIPS)
存储器:32M SDRAM(MT48LC8M16A2)
64Mbits Flash(SST39VF6401B)
USB接口:USB-Host USB-Device
网络接口: 10/100M DM9161E
DBGU串行调试接口
JTAG接口
使用ELDK4.1 构建交叉编译环境
1. 下载ELDK4.1的iso文件。在www.denx.de网站上可以找到。其有两个版本,一个是使用uclibc库,另一个使用libc库。建议使用uclibc,因为用uclibc库编译出来的二进制可执行文件要小许多。
#mkdir /mnt/iso
#mount –o loop ./arm-2007-01-22-uclibc.iso /mnt/iso
2. 安装ELDK,普通用户即可执行,无需根用户,只要保证普通用户有执行权限和拥有权限。
#mkdir /ELDK
#./install –d /ELDK
等待安装结束。
3. 设置环境变量
#PATH=$PATH:/ELDK/usr/bin (注意:$PATH与冒号之间无空格)
本人使用的板子是以EK板为母板设计的。他和DK板有一点不同。无论是Linux内核还是U-Boot,都对DK板做了很好的支持,对EK板没有相应的配置及修改文件。所以,本人针对EK板做修改。至于用DK板的朋友,就不用那么麻烦了。
Linux-2.6.19.2的移植
1. 首先下载2.6.19.2的内核源代码,同时要下载针对AT91RM9200的patch包。然后执行
# tar zxvf linux-2.6.19.tar.gz
#cp 2.6.19-at91.patch.gz linux-2.6.19
# cd linux-2.6.19
# zcat ./2.6.19-at91.patch.gz | patch -p1打补丁
2. 修改Makefile:
ARCH ?=arm
CROSS_COMPILE ?=/ELDK/usr/bin/arm-linux-修改Makefile,使交叉编译
3. 修改好之后进行编译。
# make mrproper
# make distclean
# make at91rm9200ek_defconfig
# make menuconfig
说明:这里大家会出现一个出现ics1523.c错误,原因是linux2.6.19.2里的EK默认配置将一个视频驱动编进去了,但是该驱动已经很老了。所以会出现错误。将device drivers->graphic support ->CONFIG_FB_S1D13** 去除,即能消除错误。
4. 修改其中Boot Options->Default Kernel Command String:
mem=32M console=ttyS0,115200 initrd=0x20410000,3145728 root=/dev/ram0 rw initrd=/linuxrc
最后#make 则在arch/arm/boot/下生成zImage内核映象文件。
U-Boot1.2在AT91RM9200EK板上的移植
1. 在Makefile中添加at91rm9200ek_config 编译项
2. 建立目录 board/at91rm9200ek
3. 将原目录at91rm9200dk里的文件拷到at91rm9200ek目录下
4. 参照前一篇**“U-Boot1.1.4在AT91RM9200上的移植”,对文件进行修改
5. 针对at91rm9200ek,改at91rm9200ek.c里
gd->bd->bi_arch_number = MACH_TYPE_AT91RM9200EK;
不过,光这样还不行,光这样,EK板的机器类型码还不能传输到内核参数里。因为go只是执行普通的应用程序,不考虑到传递参数给内核。需要修改U-boot的common/cmd_boot.c的do_go()函数:
/*#if defined(CONFIG_I386)*/ <==注释掉
DECLARE_GLOBAL_DATA_PTR; (在使用gd之前)
/*#endif*/ <==注释掉
....
#if !defined(CONFIG_NIOS)
/*******************add here*******************************/
if(argc==2)
rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
else
/*********************add end *****************************/
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
经过编译后一切OK,这样就大功告成了。完美的AT91RM9200EK启动程序就这样产生了,享受ARM带给你的乐趣吧。 |