天天看點

移植u-boot-1.3.4到qq2440(2)

                                      移植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的資訊。