Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45236
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 16
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-06 21:39
文章分类

全部博文(12)

文章存档

2013年(12)

我的朋友

分类: 嵌入式

2013-08-26 23:57:22

前几天整了一块板子,开始学习。

我自己试验了转载的这篇移植步骤一。按照步骤实现之后并不能真正的看到最后的这个类似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啦~~~~~~于是就开始对这个地址开始研究了,最后更改代码如上简单的形式~~~~~~~~~~~

对于地址的分布,还是很多不是特别明白~~~~~,明天继续~~~~~~




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