嵌入式开发--蒹葭的专栏

Care and Diligence Bring Luck.(谨慎和勤奋才能抓住机遇!)

用户操作
[即时聊天] [发私信] [加为好友]
蒹葭ID:flylonginsky
170550次访问,排名446好友2人,关注者39
flylonginsky的文章
原创 95 篇
翻译 0 篇
转载 12 篇
评论 118 篇
蒹葭的公告

奋斗永无止境
仁者不忧,知者不惑,勇者不惧。 Gold Price per Gram in China Yuan Renminbi
最近评论
bluehouse1985:Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Total……
gsb19870:初学者.........看了下........
jxzxf:不好看懂
xkxiaodao:嗯,都是目标没时间的
zhengyun_ustc:非常感谢!!
文章分类
收藏
相册
MetaWeblog API
工作花絮
那人那事
引用
山外有山
Bekars涡轮增压的Blog
linux应用开发电子报(RSS)
叶帆工作室(RSS)
胶管的Blog(RSS)
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 使用ELDK4.1构建交叉编译环境及AT91RM9200EK的引导攻略收藏

新一篇: USB枚举详细过程剖析 | 旧一篇: modem及hylafax安装

 

前言

今年1月份到2月份在自己博客上发表了几篇关于AT91RM9200引导程序的文章,分别是

建立交叉编译工具链

TFTPNFS服务的设置

U-Boot1.1.4AT91RM9200上的移植
时间过的很快,工作也很忙,一晃就过了半年多。再回头看,已经发现很多都落伍了。新版本出了一波又一波。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_S1D13XXX 去除,即能消除错误。

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.2AT91RM9200EK板上的移植

1. 在Makefile中添加at91rm9200ek_config 编译项

2. 建立目录 board/at91rm9200ek

3. 将原目录at91rm9200dk里的文件拷到at91rm9200ek目录下

4. 参照前一篇文章“U-Boot1.1.4AT91RM9200上的移植”,对文件进行修改

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带给你的乐趣吧。

使用Busybox制作Ramdisk根文件系统

这部分说难也不难,但是网上资料特别是中文资料奇少。因为很多人都是用现成的根文件系统,而不是自己做的。如果要自己做,会发现有很多问题没有考虑到。我也的确走了一些弯路。

Linux的根文件系统至少包含以下几个内容:

1. 基本的文件系统结构。包含一些必需的目录如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等

2. 基本程序运行所需的库函数,如glibc等

3. 必要的设备文件:如hd*,tty*等

4. 基本的配置文件:如rcS,inittab等

5. 基本的应用程序,如sh,ls,cp等

我们使用busybox来定制嵌入式的应用程序,从而可以运行ls,cp,mount 等shell命令,并且可以应用ftp,NFS等服务。之前选用busybox1.0.0,发现NFS不能使用,换成1.2.2.1之后,NFS可用。你可以从busybox官方网站下载busybox源代码包,解压缩,然后进行配置。

#tar xvfz busybox-1.2.2.1.tar.gz

#cd busybox-1.2.2.1

#make menuconfig

配置选项特别要注意几点:
1) Busybox Setting->General Configuration->show verbose applet usage messages
2) Build Options
[*] Build Busybox as a static binary (no shared libs)――这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作.
3) Install Options
[*] Don’t use /usr――注意必须选上。否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令
4) Linux System Utilities 选中mount ,支持NFS
5) Shells -> choose your default shell(ash)――注意:在这里我也犯了一个错误:就是defaultshell为none。结果启动后找不到shell解释程序。

6) Init要选中,否则没有linuxre以及初始化函数。

配置完成后,退出保存。

编译安装busybox

#make

#make install

编译好之后,在busybox目录下生成子目录_install,里面的内容:

drwxr-xr-x 2 root root 4096 12月 24 15:28 bin

lrwxrwxrwx 1 root root 11 12月 24 15:28 linuxrc -> bin/busybox

drwxr-xr-x 2 root root 4096 12月 24 15:28 sbin

其中可执行文件busybox在bin目录下,其它的都是指向他的符号链接。

7)修改Makefile ,使之用交叉编译工具链来编译。

一些开发调试必需的applet:nfs,ls,more,hostname,ip ,ifconfig,tftp,tee,dmesg,insmod,lsmod,mknode,find,grep,awk,vi等等

制作根文件系统

我们新建一个目录/mylinux/rootf作为我们的根文件系统目录。以后我们将向该目录陆续添加一些嵌入式Linux系统必需的文件以及目录,从而形成一个完整的嵌入式Linux根文件系统。

首先,我们将busybox下

创建必要的目录,建立必要的设备文件名,我们必须需要的设备有console ,tty,tty0,tty1,tty2,tty3,null,zero,loop0,loop1,cdrom,fd0,fd1,ram,ram0,ram1等。

需要的配置文件有/etc/init.d/rcS ,fstab等.

添加共享链接库

具体操作如下:

#cd /opt/croostool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu / arm-softfloat-linux-gnu/lib

#cp *-*.so /rootf/lib

# cp –d *.so.[*0-9] /rootfs/lib

写了制作映象文件的shell脚本,该脚本基于2.6内核:
#!/bin/sh

umount /mnt/loop

dd if=/dev/zero of=/mylinux/loop_tmp bs=1k count=3072>/dev/null

losetup /dev/loop0 /mylinux/loop_tmp

mke2fs -m 0 /dev/loop0 2>/dev/null

mount /dev/loop0 /mnt/loop -t ext2

cp -a /mylinux/rootf/* /mnt/loop/

umount /mnt/loop
生成的/mylinux/loop_tmp即为ramdisk映象文件。连同内核编译生成的zImage,拷贝到tftpboot/下,则arm板启动后自动下载这两个文件,并解压缩。最终成功在目标板上运行linux系统。

发表于 @ 2007年07月10日 15:22:00|评论(loading...)|编辑

新一篇: USB枚举详细过程剖析 | 旧一篇: modem及hylafax安装

评论

#greatsnows 发表于2007-08-16 09:13:59  IP: 219.133.168.*
兄弟,有没有测试过,EILD4.1-uclibc能够编译多新的busybox?
#flylonginsky 发表于2007-08-16 10:06:25  IP: 221.137.198.*
忘记试过哪些版本了。1.4的好像能够编译。
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 蒹葭