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

以前移植过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的信息。

原文地址:点击打开链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值