作为U-boot的鼻祖-ARMboot以其小巧玲珑(代码压缩包仅有400K多),但又麻雀虽小,五脏俱全,不失为研究U-boot的第一步,而且在ARMboot中处处还能看到U-boot的影子。好啦,开始我们的移植之旅吧。
移植目标: 驱动串口;驱动网络芯片dm9000;实现内核的下载(uImage);实现启动 Linux kernel(zImage),实现Nand Flash启动
移植版本: ARMboot-1.1.0
ARMboot在哪: http://www.sourceforge.net/projects/armboot
交叉编译器: arm-linux-gcc 2.95.3 (在该版本下可以一次编译成功,所以采用该版本的交叉编译器)
开发板配置: RAM:64MB,Nor:2MB,Nand:64MB,Processor:Samsung S3C2440网卡芯片:dm9000
操作系统环境: RedHat Linux 9.0
环境查看:
编译器:
[root@www.linuxidc.com root]# arm-linux-gcc -v
Reading specs from /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
源代码包:
[root@www.linuxidc.com arms]# ls -l
total 428
-rw-r--r-- 1 root root 431099 Feb 25 2007 armboot-1.1.0.tgz
解压源码包:
[root@www.linuxidc.com arms]# tar zxvf armboot-1.1.0.tgz
进入源码目录:(之后的所用工作均在该目录下完成)
[root@www.linuxidc.com arms]# cd armboot-1.1.0
[root@www.linuxidc.com armboot-1.1.0]#
armboot-1.1.0已经支持smdk2410开发板,该开发板和mini2440有一定的相似性,我们在
在SMDK2410开发板的基础上进行移植。
测试smdk2410是否能通过编译:
[root@www.linuxidc.com armboot-1.1.0]# make distclean; make smdk2410_config ; make all
通过编译,查看生成的文件如下:
[root@www.linuxidc.com armboot-1.1.0]# ls -altr
-rwxr-xr-x 1 root root 224812 May 24 08:43 armboot.srec
-rw-r--r-- 1 root root 28391 May 24 08:43 armboot.map
-rw-r--r-- 1 root root 210779 May 24 08:43 armboot.hex
-rwxr-xr-x 1 root root 74916 May 24 08:43 armboot.bin
-rwxr-xr-x 1 root root 91185 May 24 08:43 armboot
其中的armboot.bin即为最终的可以烧写到NandFlash的文件,由于代码还需修改,现在这个文件还不能适应mini2440的开发板环境,
上面的过程只是验证了smdk2410的配置即程序文件可以在arm-linux-gcc 2.95.3顺利编译通过,我们还需对代码做进一步的修改使得
其可以运行在到MINI2440上。
下面开始进行MINI2440的移植,为便于查看,将所涉及到的代码的行首都加了行号标示。
*************************************************************************************************************************************************
** 初步移植,复制关于SMDK2410的全部文件,并做相应地修改,在smdk2410的基础上构建MINI2440的代码环境
*************************************************************************************************************************************************
0) 清除上面的编译结果:
[root@www.linuxidc.com armboot-1.1.0]# make distclean
1) 复制smdk2410_config的配置文件(注:所有板子的配置文件均在include/configs下)
[root@www.linuxidc.com armboot-1.1.0]# cp include/configs/config_smdk2410.h include/configs/config_mini2440.h
复制完成后在config_mini2440.h做一个简单的修改标记-该变提示符:(建议:修改时先做做备份-即注释掉原来的代码,而后改成新的),
可用如下的sed 命令直接修改(用sed脚本修改只可执行1遍,切勿多次执行!)
[root@www.linuxidc.com armboot-1.1.0]# sed -i'~' -e "/^(#definetCFG_PROMPT..*)/ {N; s/(..*)n///1 // snallie, `date +%F_%H%M%S_%a`n1 // snallie, `date +%F_%H%M%S_%a`n/g; s/SMDK2410/ARMboot@MINI2440/2 }" include/configs/config_mini2440.h
或者用vi进行全屏幕编辑修改:
[root@www.linuxidc.com armboot-1.1.0]# vi +99 include/configs/config_mini2440.h
具体修改的位置为:
改
99 #define CFG_PROMPT "SMDK2410 # " /* Monitor Command Prompt */
为:
99 //#define CFG_PROMPT "SMDK2410 # " /* Monitor Command Prompt */ // snallie, 2011-05-24_090111_Tue
100 #define CFG_PROMPT "ARMboot@MINI2440 # " /* Monitor Command Prompt */ // snallie, 2011-05-24_090111_Tue
2) 拷贝smdk2410的板级的程序文件为mini2440
[root@www.linuxidc.com armboot-1.1.0]# cp -a board/smdk2410/ board/mini2440
3) 修改mini2440的板级的Makefile,文件位置在 board/mini2440/Makefile
改
28 OBJS := smdk2410.o flash.o env.o
为:
28 # OBJS := smdk2410.o flash.o env.o # snallie, 2011-05-24_091150_Tue
29 OBJS := mini2440.o flash.o env.o # snallie, 2011-05-24_091150_Tue
可用如下的sed 命令直接修改:(用sed脚本修改只可执行1遍,切勿多次执行!)
[root@www.linuxidc.com armboot-1.1.0]# sed -i'~' -e "/^(OBJSt:= smdk2410.o..*)/ {N; s/(..*)n/# 1 # snallie, `date +%F_%H%M%S_%a`n1 # snallie, `date +%F_%H%M%S_%a`n/g; s/smdk2410/mini2440/2 }" board/mini2440/Makefile
或者用vi进行全屏幕编辑修改:
[root@www.linuxidc.com armboot-1.1.0]# vi +28 board/mini2440/Makefile
4) 修改mini2440的板级的文件名,涉及文件为 board/mini2440/smdk2410.c
[root@www.linuxidc.com armboot-1.1.0]# mv board/mini2440/smdk2410.c board/mini2440/mini2440.c
5) 修改顶层的Makefile:找到smdk2410_config,仿照smdk2410_config,添加mini2440_config,如下:
200 smdk2410_config : unconfig
201 @echo "Configuring for $(@:_config=) Board..." ;
202 cd include ;
203 echo "ARCH = arm" > config.mk ;
204 echo "BOARD = smdk2410" >>config.mk ;
205 echo "CPU = arm920t" >>config.mk ;
206 echo "#include
207
208 # snallie, 2011-05-24_091758_Tue
209 mini2440_config : unconfig
210 @echo "Configuring for $(@:_config=) Board..." ;
211 cd include ;
212 echo "ARCH = arm" > config.mk ;
213 echo "BOARD = mini2440" >>config.mk ;
214 echo "CPU = arm920t" >>config.mk ;
215 echo "#include
216
可用如下的sed 命令直接修改:(用sed脚本修改只可执行1遍,切勿多次执行!)
[root@www.linuxidc.com armboot-1.1.0]# sed -i'~' -e "/smdk2410/,+7 {N;N;N;N;N;N;N; s/(..*)n(..*)n(..*)n(..*)n(..*)n(..*)n(..*)n/&n# snallie, `date +%F_%H%M%S_%a`n1n2n3n4n5n6n7n/g;s/smdk2410/mini2440/3;s/smdk2410/mini2440/3 } " -e "/backup/,/gtar/ {N;N;N; s/(..*)n(..*)n(..*)n/#1n#2n#3nn# snallie, `date +%F_%H%M%S_%a`n1n2n3n/g; s/"([^n]*)(.tar.gz)/"+$$F-gk-%Y%m%d_%H%M%S2/2 } " -e "/^armboot.bin/ {N;N;N; s/(..*)n(..*)n(..*)n/1n2n# snallie, `date +%F_%H%M%S_%a`n#3n/g }" Makefile
或者用vi进行全屏幕编辑修改:
[root@www.linuxidc.com armboot-1.1.0]# vi +200 Makefile
注意:用vi手工修改时候,Makefile中的新添的210~215行的行首为制表符(TAB键),而不是空格,若输入的是空格,则编译出错
6) 程序的版本号有误,修改:include/version.h
改:
28 #define ARMBOOT_VERSION "ARMboot 1.0.2"
为:
28 //#define ARMBOOT_VERSION "ARMboot 1.0.2"
29 #define ARMBOOT_VERSION "ARMboot 1.1.0" // snallie, 2011-05-24_093229_Tue
可用如下的sed 命令直接修改:(用sed脚本修改只可执行1遍,切勿多次执行!)
[root@www.linuxidc.com armboot-1.1.0]# sed -i'~' -e "/1.0.2/ {N; s/(..*)n///1n1/g; s/1.0.2"/1.1.0"t// snallie, `date +%F_%H%M%S_%a`n/2;}" include/version.h
或者用vi进行全屏幕编辑修改
[root@www.linuxidc.com armboot-1.1.0]# vi +28 include/version.h
7) 关于SMDK2410的全部文件复制完成,编译测试:
[root@www.linuxidc.com armboot-1.1.0]# make distclean; make mini2440_config; make all
通过编译!
*************************************************************************************************************************************************
** 进一步的移植,完成目标中的全部工作:驱动串口;驱动网络芯片dm9000;实现内核的下载(uImage);实现启动 Linux kernel(zImage),实现Nand Flash启动
*************************************************************************************************************************************************
mini2440板配置初步完成,下面进行具体的移植工作,由于SMDK2410 的代码和MINI2440板子略有出入,SMDK2410代码认为程序是直接在NOR或RAM中运行,
而我们的代码最终是烧写到NandFlash中的,可NandFlash不具有片上执行代码的能力,所以程序启动的第一步就是要将整个的程序从NandFlash中搬移到RAM中,
即TEXT_BASE(配置在board/mini2440/config.mk文件中)的起始地址上去。另外SAMSUNG的S3C2440的处理器在系统启动时候会自动将NandFlash的前4K的代码
移动到内部的4K大小的称为Steppingstone的SRAM中运行,所以搬移用的代码必须放到程序映像的头部的4K的范围内,否则不能正常启动。综上所述,对SMDK2410
代码的改造主要为:实现代码的搬移工作,并将搬移用的代码放到程序映像的头部的4K的范围内;而后要驱动串口,这样我们才能获取到程序的运行时的输出状态
信息,串口驱动不起来等于是瞎子一样,所以串口驱动很重要,有了串口还可通过串口下载小体积的代码;在这之后再驱动网络芯片,实现网络下载代码,启动内核等等。
查看SMDK2410的代码,知道和CPU相关的代码通过在include/configs/config_smdk2410.h的宏定义CONFIG_S3C2410进行控制,和开发板SMDK2410相关的代码通过
在include/configs/config_smdk2410.h的宏定义CONFIG_SMDK2410进行控制,如下所示:
#define CONFIG_S3C2410 1 /* in a SAMSUNG S3C2410 SoC */
#define CONFIG_SMDK2410 1 /* on an SAMSUNG SMDK2410 Board */
顺着这个线索,我们看看在原有的SMDK2410的代码有那些和CONFIG_S3C2410和CONFIG_SMDK2410的代码,以及它们分布在那些文件中:
和CONFIG_S3C2410相关的:
[root@www.linuxidc.com armboot-1.1.0]# grep -rHn CONFIG_S3C2410 *
cpu/arm920t/interrupts.c:36:#elif defined(CONFIG_S3C2410)
cpu/arm920t/serial.c:25:#elif defined(CONFIG_S3C2410)
cpu/arm920t/start.S:134:#elif defined(CONFIG_S3C2410)
cpu/arm920t/start.S:153:#if defined(CONFIG_S3C2410)
include/configs/config_smdk2410.h:43:#define CONFIG_S3C2410 1 /* in a SAMSUNG S3C2410 SoC */