前几天整了一块板子,开始学习。
我自己试验了转载的这篇移植步骤一。按照步骤实现之后并不能真正的看到最后的这个类似shell的命令行。
研究了一个晚上,尝试这找到问题:
我的实现版本是在u-boot-1.6.6。基本是没有变化的。
开始怎么试验都得不到原文作者的类似shell的命令行。
刚开始学,无从下手,找不到到底哪里出了问题,看到试验中的点亮LED,于是将点亮LED的代码做了一点更改,修改参数点亮四个LED,点亮完成之后,写一个死循环,然后就开始了一段一段的添加代码 bl led_test 点亮四个led。终于发现问题出在了bl lowlevel_init这个函数的调用。
在对应board目录下的lowlevel_init.S中:
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4
这段代码是针对初始化将代码下载到NORflash 0地址上实现的,那么sub r0, r0, r1是可以得到对应的地址,在基址为0的情况下,基址+偏移量=偏移量。然而在试验中,是将代码下载到0x30000000中去实现的,这个时候基址是0x3000 0000。那么必须要加上一个偏移地址才能真正的得到SMRDATA的数据。
代码更改为:
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
ldr r2, =0x30000000 /*基址*/
sub r0, r0, r1
add r0, r0, r2 /*偏移地址+基址*/
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4
到这里基本就OK 了~~~~~刚刚开始学,好多不是特别明白,都是个人理解,有不对的地方请大牛指正~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
其实真正到达最后一步还经历了一个过程
开始始终没有看明白 这个便宜地址怎么就能取到 SMRDATA 的数值,只知道这段代码的意思是个对应的寄存器赋值,无耐之下,将代码更改为
ldr r0, =BWSCON
ldr r1, =.........(SMRDATA) 中的表达式
str r1, [r0]
这样连续写了13个吧~~~~~发现OK啦~~~~~~于是就开始对这个地址开始研究了,最后更改代码如上简单的形式~~~~~~~~~~~
对于地址的分布,还是很多不是特别明白~~~~~,明天继续~~~~~~
阅读(1936) | 评论(0) | 转发(0) |