实现u-boot在SDRAM中调试

实现u-boot在SDRAM中调试

首先,手头上要有的软硬件:
1、移植好的uboot(具有tftp和go功能),可选用开发板配套的,这里我使用的是自己移植的(比较有成功感)
2、tftp就要有网线,这里这调试局限,要有网络,如果没有,可以使用AXD调试,详情请看另一文章
3、串口线当然要,超级终端也是必须

开始:
1、下载移植好的uboot(不是调试的,是成功的)可下载到nor也可以nand
2、下载要调试的uboot到内存中,需要了解几个信息
(1)内存的大小:SDRAM:64M(开发板不同而不同)
了解到内存是从30000000开始的,那64M就是3000,0000~3400,0000,这里有个问题,你uboot从nor或者nand运行时,再经过一系列拷贝之类,就在内存中运行,在哪里运行?就是_TEXT_BASE=33f80000的位置后512K中运行,所以移植如果超过512就要注意,这时可以修改board\开发板文件\config.mk那时指定,当然现在不是这问题。现在是什么问题呢?现在的问题是如果我还是把uboot用tftp下载到33f80000里可不可以,解决这问题前,还有一个问题,我为什么下载到33f80000?我们先看一段代码start.S里:

***************** CHECK_CODE_POSITION ******************************************/
adr r0, _start /* r0 <- current position of code   */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1   /* don't reloc during debug         */
beq stack_setup
/***************** CHECK_CODE_POSITION ******************************************/

这段代码是检测你现在是否运行在RAM中,它怎么知道?就是看你开始的代码是不是为text_base的值,如果你移植的不是,那当然会再执行下面的nor或者flash拷贝了
解决上面这问题,重新回到为什么不下载到33f80000?我们知道,它现在运行在33f80000,如果你再tftp进去,那不是把现在的执行中的代码都清除了?有什么后果?死机!!!
所以不能下载到33f80000里,那么应该下载到哪里?我应该是要下载到TEXT_BASE指定的地址里的,所以我们要执行这样的操作:修改TEXT_BASE的值!!!
修改\board\开发板目录\config.mk
将TEXT_BASE改成33000000这个虽然顺便改,但是不能改到别的什么堆啊什么栈空间里,这样程序也执行不下去,最好的就是修改到后面,面不影响原来的就可以。
(2)还有一个问题,就是底层初始化,底层初始化会将内存清空一次的,所以不应该让它执行,所以在开发板头文件中应该定义:CONFIG_SKIP_LOWLEVEL_INIT
要解决的问题解决了,现在是下载
先打开开发板,执行移植好的uboot,然后不tftp下载uboot到指定内存中33000000,然后执行
go 33000000
就可以运行了!!!

从SDRAM启动U-Boot
    U-Boot提供了一个go命令,可以用来启动操作系统的内核或者其他应用程序。当U-Boot还没有实现网络功能时,常常需要调试,而每次都用JTAG把u-boot.bin烧写到Flash是一件费时费力的事情,因此调试的时候最好让U-Boot从SDRAM里启动。
 
    如果不出差错,一般情况下,只要U-Boot跑起来了,它的loadb命令就是可用的。因此我们可以通过串口下载需要调试的u-boot.bin到SDRAM中,直接跳转到SDRAM中执行,这样就避免了反复烧写Flash。loadb命令和超级终端配合使用,可以方便的下载文件到SDRAM中。并且,u-boot.bin往往不像内核那么大,一般就100多K,用串口只需要花1020秒就可以下载完毕;而内核比较大,1M多的内核用串口下载要好几分钟。 

    下面介绍一个实现U-Boot从SDRAM启动的方法。
    需要注意几个地方:
    1、配置头文件的修改
    添加如下两行
   #define CONFIG_SKIP_LOWLEVEL_INIT
   #define CONFIG_SKIP_RELOCATE_UBOOT

    这两行使U-Boot不执行汇编代码段的cpu_init_crit 和relocate 代码段。
    2、修改config.mk文件
    config.mk文件中定义了一个TEXT_BASE,指定程序的入口地址。在博创的经典pxa270开发板上,我做的如下的定义:
    TEXT_BASE = 0xa3f80000
     表示U-Boot在RAM中的程序入口地址。U-Boot启动以后,在RAM中就运行在这个地址往上的空间。这样定义的U-Boot,将它烧写到Flash中。
     然后,在调试用的U-Boot中做如下设定:
    TEXT_BASE = 0xa3f00000
    这样,调试用的U-Boot就运行在RAM中从0xa3f00000往上的地址,两个U-Boot空间互不干扰。
    编译完调试用的U-Boot,执行如下命令:
RTL9300# # printenv    #rtk
baudrate=115200
boardmodel=RTL9301_3x8218D_4XGE
bootcmd=boota
bootdelay=1
ethaddr=00:E0:4C:00:00:08
ipaddr=192.168.1.1
ledModeInitSkip=0
serverip=192.168.1.111
stderr=serial
stdin=serial
stdout=serial

Environment size: 224/65532 bytes
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值