1、,AKA嵌入式兴趣小组系列专题,Assabet/Sa1110开发板 嵌入式Linux 移植简介,姚文龙 2003/09/07 Alan_Y,0 目录,简要说明准备交叉编译工具编译redboot烧录redboot 使用redboot 装载并执行kernel装载并运行文件系统,1 简要说明,1.1 版权说明 1.2 体例说明 1.3 assabet / sa1110 1.4 ecos / redboot 1.5 常用术语,1.1 版权说明,源码都来自opensource社区,用google可以搜索到。所以,不再详细标明出处。版权属于原作者。 本文档由Alan Yao为AKA嵌入式小组编写,不得用于
2、商业用途。 具体的Assabet开发板来自于中基教育软件产品SPC。转载本文档时,不得损害该公司的商业利益。,1.2 体例说明,本文中提到的源码都放在本文档的同一目录下。 所提到的版本,基本上只能保证该版本可用,并不代表更新或更旧的版本可用。 本文档的说明均以同一目录下的资料为依据,并且此存放目录是:/opt/orig 所有源码解压后,都放在/opt/src #代表root用户的操作;%代表普通用户的操作,1.3 assabet / sa1110,Intel公司的StrongARM 1110( SA-1110 )是一款通用RISC微处理器, arm体系结构。 16KB的指令Cache、8KB的
3、数据Cache、一个512B小型Cache、一个write buffer 、一个read buffer、一个内存管理单元(MMU)集成在一个芯片中。功耗是206M Hz/400mW Assabet开发板是基于sa1110的,有PCMCIA/CF插槽和JTAG接口,可以用来调试 32M的内存和32M的flash 详细说明参见sa1110的datasheet: sa1100-278240.pdf,1.4 ecos / redboot,ecos的源代码和相关工具可以从eCOS主页获得: http:/ eCos支持很多种平台,包括ARM/Hitachi /SH/NEC/PPC/MIPS/SPARC等
4、Redboot是ecos的bootloader,相当于PC上的bios Redboot支持JTAG和网卡调试,能够支持assabet上的flash, PCMCIA/CF网卡,串口/并口,1.5 常用术语,Host:一般指用来开发的PC机,这里是:PIII 1G 256M+redhat 7.3,即i686-pc-linux-gnu Target:指的是assabet开发板,即arm-linux Build:是指当前工作的编译工具所在的主机 构建:一般不提倡在源码目录下直接编译,而是新建一个build目录,通过configure脚本程序生成build代码,然后编译。这里,所有的build目录,都在
5、/opt/build下 cross-compile:交叉编译工具,就是在host上编译能在target上运行的程序,这里放在/opt/arm下 target根目录:target上运行的程序和系统存放在host上的根目录,这里是/opt/arm/arm-linux,2 编译交叉编译工具,2 准备 2.0 更新本地gcc编译器 2.1 建立Kernel的头文件 2.2 编译Binutils工具 2.3 编译C编译器 2.4 编译GLIBC库 2.5 编译C+编译器 2.6 编译kernel和hello world,2 准备,建立相关目录 %mkdir p /opt/orig %mkdir p /o
6、pt/src %mkdir p /opt/build %mkdir p /opt/arm 将所有文件拷贝到/opt/orig下,2.0 更新本地gcc编译器,源文件 gcc-2.95.3.tar.gz 以root用户编译: #cd /opt/src #tar -xzvf /opt/orig/gcc-2.95.3.tar.gz #mkdir p /opt/build/gcc-local #cd /opt/build/gcc-local #/opt/src/gcc-2.95.3/configure -prefix=/usr #make ; make install 确认GCC版本是2.95.3 #
7、gcc -version,2.1 建立Kernel的头文件,源文件 linux-2.4.18.tar.gz patch-2.4.18-rmk3.gz diff-2.4.18-rmk3-pxa2.gz Patch %cd /opt/src %tar xzvf /opt/orig/linux-2.4.18.tar.gz %gzip -dc /opt/orig/patch-2.4.18-rmk3.gz | patch -p1 -d /opt/src/linux %gzip -dc /opt/orig /diff-2.4.18-rmk3-pxa2.gz | patch -p1 -d /opt/src/
8、linux %mkdir p /opt/arm/arm-linux/includee,2.1 建立Kernel的头文件,配置ARM linux kernel %cd /opt/src/linux/ %cp arch/arm/def-configs/assabet .config %yes “” | make oldconfig ARCH=arm %make dep 这里会出错,不影响! %cp arf include/asm-arm /opt/arm/arm-linux/include/asm %cp arf include/linux /opt/arm/arm-linux/include/l
9、inux,2.2 编译Binutils工具,源文件 binutils-2.12.tar.gz 编译: %cd /opt/src %tar -xzvf src/binutils-2.12.tar.gz %mkdir -p opt/build/binutils %cd /opt/build/binutils %/opt/src/binutils-2.12/configure -target=arm-linux -prefix=/opt/arm %make ; make install,2.2 编译Binutils工具,这里生成的Bin工具是用于ELF执行格式的,前缀使用arm-linux 将Bin
10、工具添加的执行路径中: %export PATH=/opt/arm/bin:$PATH 别忘了在$HOME/.bashrc_profile中添加上述语句,使路径修改长期有效,2.3 编译C编译器,编译C+编译器,必须在编译GLIBC之后,才能进行。 在这里,要先编译C编译器,然后用C编译器编译GLIBC,最后再编译C+编译器 要记住host类型(在后续工作中需要),一般会在configure执行时的第一行: “configuring for a i686-pc-linux-gnu host” 这里利用“编译本地GCC”中的源码树,2.3 编译C编译器,编译: %mkdir p /opt/bul
11、d/gcc %cd /opt/build/gcc %/opt/src/gcc-2.95.3/configure -target=arm-linux -prefix=/opt/arm -with-cpu=strongarm -disable-languages -with-headers=/opt/src/linux/include %make i ;make -i install 这里make带上-i选项,是要忽略make过程中的所有错误。如果不带这个参数,那么就不能正确编译glibcc.a文件,并在编译GLIBC时出错,2.4 编译GLIBC库,源文件 glibc-2.2.5.tar.gz
12、glibc-linuxthreads-2.2.5.tar.gz 准备源码: %cd /opt/src %tar -xzvf /opt/orig/glibc-2.2.5.tar.gz %cd glibc-2.2.5 %tar -xzvf /opt/orig/glibc-linuxthreads-2.2.5.tar.gz %mkdir p /opt/build/glibc %cd /opt/build/glibc,2.4 编译GLIBC库,编译C编译器时曾经记录host类型,在这里用作- -build类型,因为这个类型,configure不能自己识别出来。 配置编译: %CC=arm-linux-
13、gcc /opt/src/glibc-2.2.5/configure -target=arm-linux -build=i686-pc-linux-gnu -enable-add-ons -prefix=/opt/arm/arm-linux %make ; make install,2.4 编译GLIBC库,刚才是给target编译GLIBC;但是交叉编译工具也需要GLIBC库,编译C+编译器 配置编译: %CC=arm-linux-gcc /opt/src/glibc-2.2.5/configure -target=arm-linux -build=i686-pc-linux-gnu -en
14、able-add-ons -prefix=/opt/arm %make ; make install,2.4 编译GLIBC库,其实也可以直接copy: %cp arf /opt/arm/arm-linux/include/* /opt/arm/include %cp arf /opt/arm/arm-linux/lib/* /opt/arm/lib 但是这种情况下,就要手工修改文件/opt/arm/lib/libc.so: GROUP(/opt/arm/lib/libc.so.6 /opt/arm/lib/libc_nonshared.a),2.6 编译kernel和helloworld,编
15、译kernel: %cd /opt/src/linux %make dep ARCH=arm %make zImage ARCH=arm 源文件hello.c: #include int main() printf(“hello worldn“);return 0; 使用交叉编译环境工具编译hello.c %arm-linux-gcc -v -o helloarm hello.c,3 编译boot loader,boot loader选用red hat 的redboot. 详细用户:http:/pficheux.free.fr/eyrolles/linux_embarque/- docs_ex
16、ternes/redboot.pdf 现成的二进制文件:http:/kernel.pe.kr/pub/armlinux/people/nico/ redboot详细用户说明中关于assabet的部分是5.5 Intel SA1110 (Assabet) 这里详细介绍如何用源码编译boot loader。,3 编译redboot,3.1 准备主机环境 3.2 编译ecosconfig 3.3 编译arm-elf 3.4 编译redboot,3.1 准备主机环境,从ftp:/ftp.skynet.ie/cvs/ecos-latest.tar.gz获取最新Ecos 现在使用放在/opt/src下的e
17、cos.tgz: % cd /opt/src % tar zxvf /opt/orig/ecos.tgz % export ECOS_REPOSITORY=/opt/src/ecos/packages,3.2 编译ecosconfig,Ecosconfig是ecos的配置工具,编译生成的ecosconfig一般比直接下载的更不容易出问题: % mkdir p /opt/build/ecosconfig % mkdir p /opt/ecos-tools % cd /opt/build/ecosconfig % /opt/src/ecos/configure -prefix=/opt/ecos-
18、tools -with-tcl=/usr % make ; make install %export PATH=/opt/ecos-tools/bin:$PATH,3.3 编译arm-elf,Ecos使用的是arm-elf工具,前面编译的arm-linux也是可以用的,但时常也会失灵。 这里专门为ecos的redboot编译arm-elf工具,一般情况下,很难用于其它地方 所用的源码,都是前面保留在/opt/src下的: /opt/src/gcc-2.95.3 /opt/src/binutils-2.12 Arm-elf的存放目录: /opt/arm-elf,3.3 编译arm-elf,编译b
19、inutils: % mkdir /opt/build/binutils-elf % cd /opt/build/binutils-elf % /opt/src/binutils-2.12/configure -target=arm-elf -prefix=/opt/arm-elf % make ; make install %export PATH=/opt/arm-elf/bin:$PATH,3.3 编译arm-elf,编译GCC: % mkdir /opt/build/gcc-elf % cd /opt/build/gcc-elf % /opt/src/gcc-2.95.2/config
20、ure -target=arm-elf -prefix=/opt/arm-elf -with-gnu-as -with-gnu-ld % make all-gcc LANGUAGES=“C C+“ % make install-gcc LANGUAGES=“C C+“,3.4 编译redboot,% mkdir /opt/assabet-redboot % cd /opt/assabet-redboot % ecosconfig new assabet redboot % ecosconfig import /opt/ecos/packages/hal/arm/sa11x0/assabet/c
21、urrent/misc/redboot_RAM.ecm % ecosconfig tree % make,3.4 编译redboot,如果是使用arm-linux,则: % make COMMAND_PREFIX=arm-linux- 生成的redboot在 /opt/assabet-redboot/install/bin下。 一共有四种格式,选择redboot.bin: $cp install/bin/redboot.bin /opt/,4 烧录redboot,使用Jflash-linux,通过JTAG(target)+并口(host)对assabet上的flash进行烧录 选用Jflash
22、-1.2-1,并作了修改,存为Jflash-1.2-1.tgz 编译Jflash: #cd /opt/src #tar zxvf /opt/orig/Jflash-1.2-1.tgz #cd Jflash-1.2-1 #make f Makefile.linux,4 烧录redboot,将JTAG数据线的16pin的Jtag接头接到assabet上,将JTAG数据线的串并口接头接在host上 接通assabet的电源,烧录前面生成的redboot.bin: #./Jflash-linux /opt/redboot.bin # minicom 配置串口:在minicom窗口内,ctrl+z,释放
23、后,快速按下o,配置串口为(38400,8N1) 然后将assabet重启,就会在minicom串口内出现redboot的界面。,5 使用redboot,现在redboot已经在assabet的flash中 redboot能通过串口/CF网卡下载文件到assabet的内存中,并可以将内存中的内容保存在flash上 因为串口下载文件的速度太慢,这里只介绍CF网卡通过tftp下载文件,5 使用redboot,简单说明架设tftp服务器过程: 用rpm安装tftpd和tftp的rpm文件$mkdir /tftpboot 用setup工具中的system service选项,启用tftp server
24、 用xinetd工具激活: #xinetd 将前面编译好的kernel放置在/tftpboot下: $cp /opt/src/linux/arch/arm/boot/zImage /tftpboot,5 使用redboot,用ifconfig察看host pc的IP,这里记为: 192.168.0.200 将CF网卡插入assabet的CF插槽,并重启assabet,进入redboot操作界面。 redboot操作界面中,设置target上redboot的CF网卡的IP为192.168.0.201: Redboot fconfig Fconfig设置IP的详细说明,参阅redboot.pdf,
25、6 装载并执行kernel,下载kernel: RedBoot load -m TFTP h 192.168.0.200 zImage -r -b 0x100000 烧录kernel: RedBoot fis create kernel -b 0x100000 l 0xc0000 执行kernel: RedBoot exec -b 0x100000 -l 0xc0000 -c “root=/dev/ram“ -r 0x800000 这里要将ram里的文件系统作为root目录。现在没有,所以提示: Kernel panic: VFS: Unable to mount root fs on 01:
26、00,7 装载并运行文件系统,这里有个8M大小的ram系统文件ramimg.gz ,里面是有一个好用的bash/busybox和其他常用的程序。实际上是用了3.6M的空间 察看ram系统的内容: # zcat ramimg.gz ramimg # mkdir /mnt/assabet # mount -o loop ramimg/mnt/assabet 如果需要给RAM文件系统添加内容: # cp somethingForARM /mnt/assabet # umount /mnt/assabet # rm rf ramimg.gz # gzip -9 ramimg # cp ramimg.gz /tftpboot,7 装载并运行文件系统,运行文件系统: RedBootload -m TFTP h 192.168.0.200 zImage -r -b 0x100000 RedBootload -m TFTP h 192.168.0.200 ramimg.gz -r -b 0x800000 RedBoot exec -b 0x100000 -l 0xc0000 -c “root=/dev/ram“ -r 0x800000,