2016年(3)
分类: LINUX
2016-12-06 10:47:21
原文地址:下载u-boot到sdram中运行 作者:jdzwl
出自于:
首先,手头上要有的软硬件:
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跑起来了,它的loadb命令就是可用的。因此我们可以通过串口下载需要调试的u-boot.bin到SDRAM中,直接跳转到SDRAM中执行,这样就避免了反复烧写Flash。loadb命令和超级终端配合使用,可以方便的下载文件到SDRAM中。并且,u-boot.bin往往不像内核那么大,一般就100多K,用串口只需要花10多20秒就可以下载完毕;而内核比较大,1M多的内核用串口下载要好几分钟。
下面介绍一个实现U-Boot从SDRAM启动的方法。
需要注意几个地方:
1、配置头文件的修改
添加如下两行
#define CONFIG_SKIP_LOWLEVEL_INIT |
这两行使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,执行如下命令:
[UP270 #]tftp 0xa3f00000 u-boot.bin |
可以看到,新的U-Boot就正确地启动了,代码空间从0xa3f00000到0xa3f1f060;BSS段从0xa3f1f060到0xa3f53e84。