由于暑假期间没按计划弄我的ARM嵌入式系统编程,最近趁毕业论文还没开题,赶紧把U-Boot和Linux移植到我的开发板QQ2440V3,总是遇到各种问题,在这公布出来给后来者一些有价值的参考吧。
问题一:“软浮点”问题
用arm-linux-gcc-3.4.1编译U-Boot出现:
/home/peng/toolchain/3.4.1/bin/arm-linux-ld: ERROR: /home/peng/toolchain/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/libgcc.a(_udivdi3.oS) uses hardware FP, whereas u-boot uses software FP
/home/peng/toolchain/3.4.1/bin/arm-linux-ld: failed to merge target specific data of file /home/peng/toolchain/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/libgcc.a(_udivdi3.oS)
/home/peng/toolchain/3.4.1/bin/arm-linux-ld: ERROR: /home/peng/toolchain/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/libgcc.a(_clz.oS) uses hardware FP, whereas u-boot uses software FP
/home/peng/toolchain/3.4.1/bin/arm-linux-ld: failed to merge target specific data of file /home/peng/toolchain/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/libgcc.a(_clz.oS)
听说编译U-Boot用低版本的3.3.2以下的交叉编译器,在3.3.2下还是出现FP问题:
/home/peng/toolchain/3.3.2/bin/arm-linux-ld: 错误:/home/peng/toolchain/3.3.2/bin/../lib/gcc-lib/arm-linux/3.3.2/libgcc.a(_udivdi3.oS) 使用硬件 FP,而 u-boot 使用软件 FP
文件格式错误: failed to merge target specific data of file /home/peng/toolchain/3.3.2/bin/../lib/gcc-lib/arm-linux/3.3.2/libgcc.a(_udivdi3.oS)
/home/peng/toolchain/3.3.2/bin/arm-linux-ld: 错误:/home/peng/toolchain/3.3.2/bin/../lib/gcc-lib/arm-linux/3.3.2/libgcc.a(_clz.oS) 使用硬件 FP,而 u-boot 使用软件 FP
文件格式错误: failed to merge target specific data of file /home/peng/toolchain/3.3.2/bin/../lib/gcc-lib/arm-linux/3.3.2/libgcc.a(_clz.oS)
make: *** [u-boot] 错误 1
查了好多资料,发现用arm-softfloat-linux-gnu和arm-linux-gcc-3.4.5-glibc-2.3.6编译能解决上述的“软浮点”问题。
问题二:错误CRC问题
把编译好的U-Boot映像文件通过H-Jtag烧写进NOR Flash之后,给开发板上电之后总是出现这样的错误提示:Warning - bad CRC, using default environment
起先以为是因为:开发板使用的NOR Flash是29lv160DB,而模板使用的是29lv800BB和29lv400BB,是我的移植问题。在反复阅读分析对应的flash.c文件和对应的board头文件之后,发现移植没问题。之后在网上查了,发现是因为没有在首次运行U-Boot的时候手动设置新的环境参数,但是我在移植过程中已经在源文件里设置好了环境参数。不管是否在移植过程中设置了环境参数,第一次运行时需要设置一次参数,否则U-Boot都会使用移植过程中设置的参数(这参数就是默认参数,即default environment)并提示Warning - bad CRC, using default environment。
问题三:装载内核到内存时**Read Error和Bad Magic Number问题
把内核烧写到Nand Flash之后,启动开发板,老是出现等提示信息:
Loading from NAND 64MiB 3,3V 8-bit, offset 0x0
** Read error
## Booting image at 31000000 ...
Bad Magic Number
用交叉编译器make uImage生成的uImage和使用U-Boot下的mkimage工具把zImage做成的uImage都出现这问题。我还以为是U-Boot移植过程中的NAND Flash驱动以及相关的读函数的问题,后来发现修改源文件中的默认参数“nboot 0x31000000 0 0;bootm 0x31000000”为“NAND read.jffs2 0x31000000 0x0 0x1E0000;bootm 0x31000000”之后就能启动内核,不再出现**Read Error和Bad Magic Number等提示信息,但是多了很多读入信息。我还是想通过“nboot 0x31000000 0 0;bootm 0x31000000”来启动装载和启动内核,为这问题折腾了两天,还是没结果。后面在网上把我的问题发给《嵌入式Linux应用开发完全手册》这本书的作者,得知是因为NAND Flash的内核存储区有坏块, nboot不能跳过坏块,而read.jffs2可以跳过NAND Flash的坏块。看来我的瞎蒙也能解决上述**Read Error和Bad Magic Number问题。
上述三个问题消耗了我超过一个星期的时间,代价太大了。
作者:梁福鹏
本文出处:http://blog.sina.com.cn/s/blog_548d39f90100ar06.html
guohuimao 于 2008-09-08 10:59:29发表:
做技术开发就是这样,大多数时候会一马平川,但有时往往会在不起眼的小沟小坎上拌上一脚,阻碍进程!