移植u-boot-1.3.4到qq2440(2)
作者:makethyme
以前移植過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!
[ [email protected] ]# version
U-Boot 1.3.4 (Jun 9 2010 - 20:48:00)
[ [email protected] ]#
輸出的資訊還含有調試的資訊,^_^。由于沒有啟動tftp server,出現不能load Linux uImage的資訊。