nullnullAKA嵌入式兴趣小组系列专
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
AKA嵌入式兴趣小组系列专题Assabet/Sa1110开发板
嵌入式Linux 移植简介姚文龙
2003/09/07
Alan_Yao@163.net0 目录0 目录 简要说明
准备交叉编译工具
编译redboot
烧录redboot
使用redboot
装载并执行kernel
装载并运行文件系统 1 简要说明1 简要说明1.1 版权说明
1.2 体例说明
1.3 assabet / sa1110
1.4 ecos / redboot
1.5 常用术语1.1 版权说明1.1 版权说明源码都来自opensource社区,用google可以搜索到。所以,不再详细标明出处。版权属于原作者。
本文档由Alan Yao为AKA嵌入式小组编写,不得用于商业用途。
具体的Assabet开发板来自于中基教育软件产品SPC。转载本文档时,不得损害该公司的商业利益。1.2 体例说明1.2 体例说明本文中提到的源码都放在本文档的同一目录下。
所提到的版本,基本上只能保证该版本可用,并不代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
更新或更旧的版本可用。
本文档的说明均以同一目录下的资料为依据,并且此存放目录是:/opt/orig
所有源码解压后,都放在/opt/src
#代表root用户的操作;%代表普通用户的操作1.3 assabet / sa11101.3 assabet / sa1110Intel公司的StrongARM 1110( SA-1110 )是一款通用RISC微处理器, arm体系结构。
16KB的指令Cache、8KB的数据Cache、一个512B小型Cache、一个write buffer 、一个read buffer、一个内存管理单元(MMU)集成在一个芯片中。功耗是206M Hz/400mW
Assabet开发板是基于sa1110的,有PCMCIA/CF插槽和JTAG接口,可以用来调试
32M的内存和32M的flash
详细说明参见sa1110的datasheet: sa1100-278240.pdf1.4 ecos / redboot1.4 ecos / redbootecos的源代码和相关工具可以从eCOS主页获得: http://sources.redhat.com/ecos
eCos支持很多种平台,包括ARM/Hitachi /SH/NEC/PPC/MIPS/SPARC等
Redboot是ecos的bootloader,相当于PC上的bios
Redboot支持JTAG和网卡调试,能够支持assabet上的flash, PCMCIA/CF网卡,串口/并口1.5 常用术语1.5 常用术语Host:一般指用来开发的PC机,这里是:PIII 1G 256M+redhat 7.3,即i686-pc-linux-gnu
Target:指的是assabet开发板,即arm-linux
Build:是指当前工作的编译工具所在的主机
构建:一般不提倡在源码目录下直接编译,而是新建一个build目录,通过configure脚本程序生成build代码,然后编译。这里,所有的build目录,都在/opt/build下
cross-compile:交叉编译工具,就是在host上编译能在target上运行的程序,这里放在/opt/arm下
target根目录:target上运行的程序和系统存放在host上的根目录,这里是/opt/arm/arm-linux2 编译交叉编译工具2 编译交叉编译工具2 准备
2.0 更新本地gcc编译器
2.1 建立Kernel的头文件
2.2 编译Binutils工具
2.3 编译C编译器
2.4 编译GLIBC库
2.5 编译C++编译器
2.6 编译kernel和hello world2 准备2 准备建立相关目录
%mkdir –p /opt/orig
%mkdir –p /opt/src
%mkdir –p /opt/build
%mkdir –p /opt/arm
将所有文件拷贝到/opt/orig下2.0 更新本地gcc编译器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
#gcc --version2.1 建立Kernel的头文件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/linux
%mkdir –p /opt/arm/arm-linux/includee
2.1 建立Kernel的头文件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/linux2.2 编译Binutils工具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 install2.2 编译Binutils工具2.2 编译Binutils工具这里生成的Bin工具是用于ELF执行格式的,前缀使用arm-linux
将Bin工具添加的执行路径中:
%export PATH=/opt/arm/bin:$PATH
别忘了在$HOME/.bashrc_profile中添加上述语句,使路径修改长期有效
2.3 编译C编译器2.3 编译C编译器编译C++编译器,必须在编译GLIBC之后,才能进行。
在这里,要先编译C编译器,然后用C编译器编译GLIBC,最后再编译C++编译器
要记住host类型(在后续工作中需要),一般会在configure执行时的第一行:
“configuring for a i686-pc-linux-gnu host”
这里利用“编译本地GCC”中的源码树2.3 编译C编译器2.3 编译C编译器编译:
%mkdir –p /opt/buld/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库2.4 编译GLIBC库源文件
glibc-2.2.5.tar.gz
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/glibc2.4 编译GLIBC库2.4 编译GLIBC库编译C编译器时曾经记录host类型,在这里用作- -build类型,因为这个类型,configure不能自己识别出来。
配置编译:
%CC=arm-linux-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 install2.4 编译GLIBC库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 --enable-add-ons --prefix=/opt/arm
%make ; make install2.4 编译GLIBC库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和helloworld2.6 编译kernel和helloworld编译kernel:
%cd /opt/src/linux
%make dep ARCH=arm
%make zImage ARCH=arm
源文件hello.c:
#include
int main(){
printf("hello world\n");
return 0;
}
使用交叉编译环境工具编译hello.c
%arm-linux-gcc -v -o helloarm hello.c3 编译boot loader3 编译boot loaderboot loader选用red hat 的redboot.
详细用户:http://pficheux.free.fr/eyrolles/linux_embarque/- docs_externes/redboot.pdf
现成的二进制文件:http://kernel.pe.kr/pub/armlinux/people/nico/
redboot详细用户说明中关于assabet的部分是5.5 Intel SA1110 (Assabet)
这里详细介绍如何用源码编译boot loader。3 编译redboot3 编译redboot3.1 准备主机环境
3.2 编译ecosconfig
3.3 编译arm-elf
3.4 编译redboot3.1 准备主机环境3.1 准备主机环境从ftp://ftp.skynet.ie/cvs/ecos-latest.tar.gz获取最新Ecos
现在使用放在/opt/src下的ecos.tgz:
% cd /opt/src
% tar zxvf /opt/orig/ecos.tgz
% export ECOS_REPOSITORY=/opt/src/ecos/packages3.2 编译ecosconfig3.2 编译ecosconfigEcosconfig是ecos的配置工具,编译生成的ecosconfig一般比直接下载的更不容易出问题:
% mkdir –p /opt/build/ecosconfig
% mkdir –p /opt/ecos-tools
% cd /opt/build/ecosconfig
% /opt/src/ecos/configure --prefix=/opt/ecos-tools --with-tcl=/usr
% make ; make install
%export PATH=/opt/ecos-tools/bin:$PATH3.3 编译arm-elf3.3 编译arm-elfEcos使用的是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-elf3.3 编译arm-elf编译binutils:
% 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:$PATH3.3 编译arm-elf3.3 编译arm-elf编译GCC:
% mkdir /opt/build/gcc-elf
% cd /opt/build/gcc-elf
% /opt/src/gcc-2.95.2/configure --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 编译redboot3.4 编译redboot% mkdir /opt/assabet-redboot
% cd /opt/assabet-redboot
% ecosconfig new assabet redboot
% ecosconfig import /opt/ecos/packages/hal/arm/sa11x0/assabet/current/misc/redboot_RAM.ecm
% ecosconfig tree
% make3.4 编译redboot3.4 编译redboot如果是使用arm-linux,则:
% make COMMAND_PREFIX=arm-linux-
生成的redboot在 /opt/assabet-redboot/install/bin下。
一共有四种格式,选择redboot.bin:
$cp install/bin/redboot.bin /opt/
4 烧录redboot4 烧录redboot使用Jflash-linux,通过JTAG(target)+并口(host)对assabet上的flash进行烧录
选用Jflash-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.linux4 烧录redboot4 烧录redboot将JTAG数据线的16pin的Jtag接头接到assabet上,将JTAG数据线的串并口接头接在host上
接通assabet的电源,烧录前面生成的redboot.bin: #./Jflash-linux /opt/redboot.bin # minicom
配置串口:在minicom窗口内,ctrl+z,释放后,快速按下o,配置串口为(38400,8N1)
然后将assabet重启,就会在minicom串口内出现redboot的界面。 5 使用redboot 5 使用redboot 现在redboot已经在assabet的flash中
redboot能通过串口/CF网卡下载文件到assabet的内存中,并可以将内存中的内容保存在flash上
因为串口下载文件的速度太慢,这里只介绍CF网卡通过tftp下载文件
5 使用redboot 5 使用redboot 简单说明架设tftp服务器过程:
用rpm安装tftpd和tftp的rpm文件
$mkdir /tftpboot
用setup工具中的system service选项,启用tftp server
用xinetd工具激活: #xinetd
将前面编译好的kernel放置在/tftpboot下: $cp /opt/src/linux/arch/arm/boot/zImage /tftpboot 5 使用redboot 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.pdf6 装载并执行kernel 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:00 7 装载并运行文件系统 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 /tftpboot7 装载并运行文件系统7 装载并运行文件系统运行文件系统: RedBoot>load -m TFTP –h 192.168.0.200 zImage -r -b 0x100000 RedBoot>load -m TFTP –h 192.168.0.200 ramimg.gz -r -b 0x800000 RedBoot> exec -b 0x100000 -l 0xc0000 -c "root=/dev/ram" -r 0x800000