Chinaunix首页 | 论坛 | 博客
  • 博客访问: 142265
  • 博文数量: 24
  • 博客积分: 672
  • 博客等级: 上士
  • 技术积分: 330
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-29 09:28
文章分类

全部博文(24)

文章存档

2011年(24)

我的朋友

分类: LINUX

2011-07-01 15:51:20

实现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还没有实现网络功能时,常常需要调试,而每次都用JTAGu-boot.bin烧写到Flash是一件费时费力的事情,因此调试的时候最好让U-BootSDRAM里启动。

 

    如果不出差错,一般情况下,只要U-Boot跑起来了,它的loadb命令就是可用的。因此我们可以通过串口下载需要调试的u-boot.binSDRAM中,直接跳转到SDRAM中执行,这样就避免了反复烧写Flashloadb命令和超级终端配合使用,可以方便的下载文件到SDRAM中。并且,u-boot.bin往往不像内核那么大,一般就100K,用串口只需要花1020秒就可以下载完毕;而内核比较大,1M多的内核用串口下载要好几分钟。

   

    下面介绍一个实现U-BootSDRAM启动的方法。

 

    需要注意几个地方:

 

    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-BootRAM中的程序入口地址。U-Boot启动以后,在RAM中就运行在这个地址往上的空间。这样定义的U-Boot,将它烧写到Flash中。

     然后,在调试用的U-Boot中做如下设定:

    TEXT_BASE = 0xa3f00000

      这样,调试用的U-Boot就运行在RAM中从0xa3f00000往上的地址,两个U-Boot空间互不干扰。

      编译完调试用的U-Boot,执行如下命令:

[UP270 #]tftp 0xa3f00000 u-boot.bin
Found DM9000 ID
:90000a46 at address 8000000 !
DM9000 work
in 16 bus width
bd
->bi_entaddr: 08:00:3e:26:0a:5b
[eth_init]MAC:8:0:3e:26:a:5b:
TFTP from server 192
.168.1.132; our IP address is 192.168.1.56
Filename
''''u-boot.bin''''.
Load address
: 0xa3f00000
Loading
: T #########
done
Bytes transferred
= 127072 (1f060 hex)
[UP270 #]go 0xa3f00000
## Starting application at 0xA3F00000
...
 
 
U
-Boot 1.3.2 (Nov 19 2008 - 10:08:49)
 
U-Boot code: A3F00000 -> A3F1F060 BSS: -> A3F53E84
DRAM: 64 MB
Flash
: 16 MB
In: serial
Out: serial
Err
: serial
Found DM9000 ID
:90000a46 at address 8000000 !
DM9000 work
in 16 bus width
bd
->bi_entaddr: 08:00:3e:26:0a:5b
[eth_init]MAC:8:0:3e:26:a:5b:
Hit any key to stop autoboot
: 0
[UP270 #]

可以看到,新的U-Boot就正确地启动了,代码空间从0xa3f000000xa3f1f060BSS段从0xa3f1f0600xa3f53e84

阅读(5690) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~