首先,手头上要有的软硬件:
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
就可以运行了!!!