移植u-boot到s3c2410开发板
扫描二维码
随时随地手机看文章
说 明:这是u-boot移植文档,移植到实验室的远峰s3c2410开发板(YF2410, 无NOR flash)。当时本来计划细化后分几部分贴在博客上,后来也没做这项工作。正好前几天转了一篇在skyeye上运行u-boot的文章,顺便贴出自己这 篇:)
1, 基本思路
==========
(1)思路
看参考资料(1),(2)对u-boot有了基本了解, 但没有把握。尝试进行修改后,感觉不理解。于是尝试u-boot在ram中运行,当时觉得使用ICE很没有把握,毕竟没怎么用过,上网查资料,在"ADS 调试经验"文章中看到了方法,尝试几次后才成功。后来阅读读u-boot和vivi相关代码,结合s3c2410文档和"ARM SOC体系结构"学习汇编语言,这样对bootloader第一阶段有了直接的了解,感觉心里有底了,这时"boot from nand flash"等文档已经找到,感觉如果第一阶段成功,第二阶段会更有把握"。最初的第一阶段移植没有遇到什么困难。
在第二阶段一直中参考了vcam9开发板和"boot from nand flash",只是在"CFG_NO_FLASH"和"ENV"遇到些问题,认真分析后随即解决。
这时反过来再修改第一阶段代码,在"move r10, lr"等语句的修改后,u-boot启动失败,第二天决定分析汇编语言,根据记忆查"skyeye"那本书,找到ojbectdump这个工具,反汇编后,问题解决。
总的来说,最大的问题就是基本工具的使用包括ICE,Makefile,binutils等。另外,高质量的文档不多。
(2)版本:arm-linux.gcc 3.3.2, u-boot 1.2.0。
(3) 与其它文档的不同点
(3)-1,更注意将来的可移植性,u-boot第一阶段从NAND flash到RAM的搬移代码移植性更好,并且没有加入mem_clear代码。
(3)-2,更注意代码是否清楚,nand_legacy_rw的cmd参数直接使用宏定义,而不是数字;
(3)-3,把内容解释清楚,不仅仅是操作文档,
(4) 编译器:3.3.2,使用3.4.1会出错。
2, 基础
=======
(1)基础知识:
bootloader: 移植前要了解bootloader基本原理,看"嵌入式系统bootloader技术内幕.pdf"
arm汇编:边移植边学习,参考s3c2410手册和ARM SOC体系结构学习,需要了解APCS(ARM过程调用标准)
(2)u-boot使用说明:仅介绍引导内核所需命令:
(2)-1打补丁:
假设你已经进入要解压缩u-boot的目录,例如"/usr/src/s3c2410/"。且补丁文件"u-boot-1.2.0_patch_20070911_1317"位于该目录。用管理员权限,因为编译u-boot也需要管理员权限。
tar jxvf u-boot-1.2.0.tar.bz2
cd u-boot-1.2.0
patch -p1 < ../u-boot-1.2.0_patch_20070911_1317
(2)-2编译u-boot
(2)-3烧写flash
(2)-4下载Linux内核。
A,用mkimage生成u-boot引导所需映像:
[root@localhost tools]# ./mkimage -A arm -O Linux -T kernel -C none -a
0x30008000 -e 0x30008000 -n Linux2.6.14 -d zImage_2054 zImage_2054_mk
Image Name: Linux2.6.14
Created: Wed Sep 5 20:47:53 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 976804 Bytes = 953.91 kB = 0.93 MB
Load Address: 0x30008000
Entry Point: 0x30008000
见"s3c2410/bootloader/u-boot/BootLinux",tftpboot是使用go启动失败的例子;tftpboot_successful是使用bootm成功的例子。zImage_2054也在同一个目录。
B, 下载Linux内核,这里只说明windows下使用tftp的方法。Linux方法见"ARM_Yuanfenglog-20070313.txt"。
windows下是使用tftpd32提供tftp服务,不需要设置,安装后即可使用。
tftpboot 31000000 zImage_2054_mk
TFTP from server 172.23.19.132; our IP address is 172.23.19.60
Filename 'zImage_2054_mk'.
Load address: 0x31000000
Loading: *^H#################################################################
#################################################################
#############################################################
done
Bytes transferred = 976868 (ee7e4 hex)
设置环境变量:
setenv gatewayip 172.23.19.254
保存环境变量:
saveenv
注:根据代码和文档,当环境变量"autostart=yes"时,tftpboot会自动引导下载的内核。这个没有试验,待做。
C, 验证内核是否正确:
YF2410 # bootm 31000000
## Booting image at 31000000 ...
Image Name: Linux2.6.14
Created: 2007-09-05 20:47:53 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 976804 Bytes = 953.9 kB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing
Linux................................................................ done,
booting the kernel.
Linux version 2.6.14 (root@localhost.localdomain) (gcc version 3.4.1) #1 Wed
Aug 22 20:56:33 GMT 2007
......
D, 内核启动正确,烧写到flash中,并且设置启动参数:
tftpboot 31000000 zImage_2054_mk
TFTP from server 172.23.19.132; our IP address is 172.23.19.60
Filename 'zImage_2054_mk'.
Load address: 0x31000000
Loading: *^H#####################################T############################
##########################################T #######################
#############################################################
done
Bytes transferred = 976868 (ee7e4 hex)
YF2410 # nand erase 40000 f0000
NAND erase: device 0 offset 262144, size 983040 ...
OK
YF2410 # nand write 31000000 40000 f0000
NAND write: device 0 offset 262144, size 983040 ...
983040 bytes written: OK
YF2410 # setenv bootcmd nand read 31000000 40000 f0000;bootm 31000000
YF2410 # saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
注意,这里的偏移设置要和Linux内核中设置的NAND flash分区一致。这里对应kernel分区。
(2)-5,重启开发板:
U-Boot 1.2.0 (Sep 5 2007 - 10:08:14)
DRAM: 64 MB
NAND: 64 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 2 ^H^H^H 1 ^H^H^H 0
NAND read: device 0 offset 262144, size 983040 ...
983040 bytes read: OK
## Booting image at 31000000 ...
Image Name: Linux2.6.14
Created: 2007-09-05 20:47:53 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 976804 Bytes = 953.9 kB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing
Linux................................................................ done,
booting the kernel.
......
3, u-boot移植过程:
=================
本 次移植使用u-boot1.2.0,还不会用git,如果进一步做移植还是使用最新版比较好。整个的u-boot移植完成了两部分:(1)u-boot第 一阶段移植,完成从flash到sdram的复制;(2)u-boot第二阶段移植,完成nand legacy操作函数,saveenv函数;
(1)u-boot在ram中运行
--------------------
目的:验证u-boot能否正常启动,为下一步工作打基础;
编译方法:
make distclean #彻底删除make产生的文件中间文件,如果开发过程中修改了目录,需要
#distclean,否则依赖关系是旧的,无法编译。一般下使用"make
# clean"删除中间文件即可。
make smdk2410_config #配置u-boot为smdk2410配置文件,待做结合此看懂
#"mkconfig"文件
make ARCH=arm #编译u-boot,执行体系结构是ARM
u- boot在ram中运行成功,日志见"s3c2410/bootloader/u-boot/in_ram",具体过程见"AXD_u- boot_ram_log",起始地址是从include/configs/smdf2410.h文件CFG_LOAD_ADDR宏看到的 (0x33000000)。
第一次做loadbinary(lb)时,System Output Monitor的Debog Log选项卡会显示Warning,>说映象有错,没管它,继续进行,可以启动u-boot。后来这个Warning也不出出现了。这样>对 flash的移植就有了基础。继续加油!
AXD运行bin文件的方法参考了"ARM ADS中的AXD 调试经验集锦",axf文件与bin文件的区别>见"ARM映象文件及执行机理001"。
运行: AXD操作日志和u-boot启动日志以及u-boot.bin见"s3c2410/bootloader/u-boot/in_ram"
注:如果链接出错,可能是编译器的问题,用3.4.1不行,3.3.2就可以,很奇怪。这和注>释里面提到的需要用3.4以上编译起矛盾(待做,查那个文档的名字),下面是当时错误的记录:
cd /usr/src/s3c2420-linux/bootloader/u-boot-1.2.0 && arm-linux-ld -Bstatic -T
/usr/src/s3c2420-linux/bootloader/u-boot-1.2.0/board/YF2410/u-boot.lds -Ttext
0x33F80000 $UNDEF_SYM cpu/arm920t/start.o
--start-group lib_generic/libgeneric.a
board/YF2410/libYF2410.a cpu/arm920t/libarm920t.a
cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a
fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a
fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a
rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a
drivers/nand_legacy/libnand_legacy.a drivers/sk98lin/libsk98lin.a
post/libpost.a post/cpu/libcpu.a common/libcommon.a --end-group -L
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1 -lgcc
-Map u-boot.map -o u-boot