免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 627 | 回复: 0
打印 上一主题 下一主题

U-Boot的移植之(四)调试篇:下载U-Boot到目标板进行调试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-19 21:21 |只看该作者 |倒序浏览

       
       
       
       
       
       
       
       
       
       
U-Boot
Practically Porting Guide
Author:
Aaron Wong
      
aaronwong@engineer.com
       
       
       
       
       
       
       
       
       
       
U-Boot的移植之()调试篇:下载U-Boot到目标板进行调试
        编译完成之后,得到的几个重要文件是:
        (1)
u-boot.bin: 116K,原始二进制文件,用于下载到启动ROM进行系统引导;
        (2)
u-boot: 384K,ELF格式映像文件,可加载到SDRAM或SRAM中进行调试;
        (3)
u-boot.srec: Motorola S-Records格式映像。
        (4)
System.map: U-Boot映像文件的符号表,各符号的链接地址。
        最有效的调试方法是下载到目标板的启动闪存,使用硬件仿真器进行跟踪调试。使用Skyeye,Qemu等软件仿真器不能达到真实的调试效果,尤其不能真实反映第一阶段的底层初始化过程,只适合作U-Boot的学习与研究之用。有人提出在没有硬件仿真器的情况下,使用“点灯大法(利用目标板的LED指示程序运行阶段)”进行跟踪调试,这实际上无异于盲人摸象,特别是在底层初始化阶段,一条指令就可能导致异常。也有人提出注释掉start.S中的lowlevel_init调用,将U-Boot映像加载到SDRAM中进行调试,这实际上只能对U-Boot进行功能调试,而无法跟踪U-Boot的底层初始化过程。当然,如果实在嫌烧写FLASH的速度较慢,又心疼其擦写寿命,也可以将U-Boot映像加载到片上SRAM中调试,因为U-Boot的开始一部分代码是位置无关的(除了后6个异常向量外,不过并不构成影响);这要求片上SRAM够大,因为U-Boot的映像大小约有300K-400K。
        笔者使用Banyan-U
ARM EMULATOR JTAG仿真器,结合AXD软件平台进行调试。
        首先将u-boot.bin下载到FLASH地址0x0,连接好串口,启动minicom或超级终端,目标板上电后,串口控制台无任何输出。这很有可能是lowlevel_init那段代码出了问题,因为它牵涉到GPIO的配置,处理器时钟频率设置,系统总线频率与存储器的时序匹配及初始化,稍有差错就会当机。当然也有可能是串口的配置不正确,但这部分比较简单,出错的可能性比较小。
        对于下载到FLASH存储器的原始二进制文件,只能进行汇编级的跟踪调试。先利用objdump工具生成U-Boot映像的反汇编代码:       
       
               
               
                       
                               
arm-iwmmxt-linux-gnueabi-objdump
                                -S u-boot > u-boot.S
                       
               
       
        反汇编代码u-boot.S和符号表System.map将是跟踪调试过程中的得力助手。
        另一个重要的调试技巧是在AXD中现场修改寄存器和存储单元的内容,这样可以帮助我们找到问题所在,而不必每次改动都重新编译u-boot,也避免了FLASH的频繁烧写。
例如,笔者在单步跟踪调试时,发现在地址0xa30804b4处,使用指令”str        r1,
[r0]”配置GPDR1(GPIO方向寄存器1)后,存储器0x0地址开始的大片内容全部被更改,导致异常终止。这时可以在该处设置一个断点,复位目标板全速运行到断点处,修改寄存器r1的值(GPDR1的初值),再执行该条指令。经试验发现,对于XSBASE270开发板,必须要先初始化GAFRx,再初始化GPDRx,才不致于发生上述异常。而在start.S中,是先完成GPDRx的初始化之后,再初始化GAFRx的,因此需要在源代码中将这两段代码的位置互换,重新编译后,再下载到FLASH中。
        U-Boot的串口控制台输出如下:
       
               
               
                       
                               
U-Boot
                                1.3.0-rc2 (Oct 16 2007 - 01:57:29)                              
                                  
                               
                               
                                       
                                                                  
                               
                               
DRAM:
                                 64 MB
                               
Flash:
                                32 MB
                               
In:
                                   serial
                               
Out:
                                  serial
                               
Err:
                                  serial
                               
Hit
                                any key to stop autoboot:  0
                               
                               
[color="#000080"]$
                       
               
       
        另一个问题是环境变量的设置与保存。将环境变量保存在FLASH中,使用setenv命令设置环境变量,再使用saveenv命令保存,这样在下次开机时,就会使用新的环境变量。如果使用的是U-Boot自带的CFI闪存驱动,在保存环境变量时可能会出现如下问题:
       
               
               
                       
                               
$
                                setenv ipaddr 192.168.1.21
                               
$
                                saveenv
                               
Saving Environment to
                                Flash...
                               
Un-Protected 1 sectors
                               
Erasing Flash...
                               
Flash erase error at
                                address 40000
                               
Block Erase Error.
                               
Block locked.
                               
done
                               
Erased 1 sectors
                       
               
       
        这是因为缺省情况下U-Boot对FLASH有软件写保护,这时在U-Boot启动完毕后即使使用jflashmm工具也无法对FLASH进行烧写:
       
               
               
                       
                               
[aaronwong@localhost
                                Jflash-XSBase270]$ sudo ./jflashmm u-boot.bin
                               
                               
                               
                               
JFLASH Version 5.01.007
                               
COPYRIGHT (C) 2000 - 2003
                                Intel Corporation
                               
                               
                               
PLATFORM SELECTION:
                               
Processor=            
                                PXA27x
                               
Development System=   
                                XSBase270
                               
Data Version=         
                                1.00.001
                               
                               
                               
PXA27x revision ??
                               
Found flash type:
                                28F128K18
                               
                               
                               
Erasing block at address
                                0   
                               
                               
Error, Block erase timed
                                out
                       
               
       
        解决办法可参考
Uboot-Users
邮件列表Erase
error on dual P30(CFI) flash
chips
主题讨论
,具体是在include/configs/xsbase270.h中定义CFG_FLASH_PROTECTION,该选项在README文件中的描述如下:       
       
               
               
                       
                               
- CFG_FLASH_PROTECTION
                               
                If defined, hardware
                                flash sectors protection is used
                               
                instead of U-Boot
                                software protection.
                       
               
       
        修改完毕重新编译U-Boot,在目标板上电后U-Boot启动完毕之前,使用jflashmm工具将新的u-boot.bin烧写到目标板启动闪存。这时可成功修改环境变量并保存到FLASH中:
       
               
               
                       
                               
$
                                setenv ipaddr 192.168.1.21
                               
$
                                saveenv
                               
Saving Environment to
                                Flash...
                               
. done
                               
Un-Protected 1 sectors
                               
Erasing Flash...
                               
. done
                               
Erased 1 sectors
                               
Writing to Flash... done
                               
. done
                               
Protected 1 sectors
                       
               
       
        一旦U-Boot的基本功能调试通过,能正常在目标板运行,剩余的工作就是根据实际情况调整TEXT_BASE以及内核引导参数,使用U-Boot来引导Linux内核。在下一节中,将给出U-Boot引导Linux内核的实例。
[Track]
       


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26710/showart_403972.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP