以前移植过u-boot-1.1.6到S3C2440的板子上,本来以为移植u-boot-1.3.4只要merge完毕就可以了。不料merge完毕之后却不能够正常运行。这段时间一直有事,直到前两天才有空下来调试一下。由于没有debug的硬件设备,只好在cpu/arm920t/start.S中添加初始化串口的程序来通过串口输出判断程序挂在那儿了。(关于在start.S中初始化串口可参考vivi)。
最后判断出来问题出在将u-boot从Nand Flash拷贝到RAM的过程中,需要调用nand/qq2440/nand_read.c中的函数nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)时出错。
首先用readelf查看一下,nand_read_ll这个函数是否连接进到最终的程序中:
arm-linux-readelf –s u-boot | grep nand_read_ll
可以发现,nand_read_ll是连接到最终的程序中的。
然后,将其反汇编:
arm-linux-objdump –S u-boot > u-boot-1.3.4.asm
查看时,发现
bl nand_read_ll
33f0031c: eb003a00 bl 33f0eb24 <nand_read_ll>
而程序开始_start处却是:
.globl _start
_start: b start_code
33f00000: ea000012 b 33f00050 <start_code>
可见0x33f0eb24 – 0x33f0000 > 4KB了。由于S3C2440为了支持能从nand flash启动,有一个叫stepingstone的SRAM buffer。启动时最初的4kb内容被装载到steppingstone中,然后在steppingstone中执行该代码。支持明白,当调用nand_read_ll完成将u-boot向RAM搬移的过程中,由于nand_read_ll不在steppingstone中,故bl nand_read_ll不能够得到执行,因此程序挂掉。
比较u-boot-1.1.6和u-boot-1.3.4的Makefile,发现对board/$(BOARDDIR)/lib$(BOARD).a的处理不同,u-boot-1.3.4的 Makefile如下:
LIBS = lib_generic/libgeneric.a
LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo /
"board/$(VENDOR)/common/lib$(VENDOR).a"; fi)
LIBS += cpu/$(CPU)/lib$(CPU).a
...
LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a
LIBBOARD := $(addprefix $(obj),$(LIBBOARD))
修改成如下:
LIBS = lib_generic/libgeneric.a
LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo /
"board/$(VENDOR)/common/lib$(VENDOR).a"; fi)
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
...
LIBBOARD =
LIBBOARD := $(addprefix $(obj),$(LIBBOARD))
这样修改后,重新编译,就能够正常运行了。
qq2440
OK Ver
Bjp
U-Boot 1.3.4 (Jun 9 2010 - 20:48:00)
U-Boot code: 33F00000 -> 33F18878 BSS: -> 33F1EDF8
RAM Configuration:
Bank #0: 30000000 64 MB
manufacture = ec deviceID = 76
flash_protect ON: from 0x00000000 to 0x00018877
protect on 0
protect on 1
protect on 2
protect on 3
protect on 4
flash_protect ON: from 0x000F0000 to 0x000FFFFF
In: serial
Out: serial
Err: serial
### main_loop entered: bootdelay=6
### main_loop: bootcmd="tftp 0x33000000 uImage; bootm 0x33000000"
Hit any key to stop autoboot: 0
Unknown command 'tftp' - try 'help'
* kernel: cmdline image address = 0x33000000
Wrong Image Format for bootm command
ERROR: can't get kernel image!
[ makethyme@localhost.com ]# version
U-Boot 1.3.4 (Jun 9 2010 - 20:48:00)
[ makethyme@localhost.com ]#
输出的信息还含有调试的信息,^_^。由于没有启动tftp server,出现不能load Linux uImage的信息。
原文地址:点击打开链接