您的位置:首页 > 编程语言

移植uboot之修改代码支持NorFlash记录续集二

2017-12-17 21:41 323 查看
先说一个事:我会在最后把移植好的uboot,内核,分别做一个补丁文件,以后如果用到相同的uboot以及内核都可以直接下载我这个补丁进行打补丁操作就可以直接用~

上一个移植uboot续集,我们解决了无法写flash的问题,现在该去测试norflash写功能的完整性!

在串口中依次输入:

md.b 30000000

md.b 80000

mw.b 30000000 12345678

erase 80000 8ffff

cp.b 30000000 80000 10000

md.b 80000

md.b 30000000

cmp.b 30000000 80000 10000 (比较内容是否一样)显示如下:



内存和flash里的内容不一样,这是怎么回事呢?再试验一下把内存另一个地址的内容拷贝到flash(80000~90000地址之间)中:

erase 80000 8ffff

cp.b 32000000 80000 10000

cmp.b 32000000 80000 10000 显示如下:



很奇怪,这里又显示两个地方的内容是一样的!!!

经过分析内存的分布以及启动的流程,发现是在uboot启动过程调用第二阶段代码没有重新设置栈(具体过程就不分析,需要了解uboot的启动流程,以后讲解),下面直接给出解决办法:

在start.s中需要重新设置栈:

在调用第二阶段代码之前重新设置栈,加上这一句:
ldr sp, base_sp             /* 重新设置栈lyy */
如下:

/* unsigned int的值存在r0里,正好给board_init_r */
ldr r1, _TEXT_BASE
ldr sp, base_sp             /* 重新设置栈lyy */

/* 调用第二阶段的代码 */
bl  board_init_r


在上面与下面代码类似的地方加上下面的代码:

/*lyy*/

.globl base_sp
base_sp:
.long 0


在board.c中的board_init_f函数里最后加上:

base_sp = addr_sp;    /*lyy*/


在board_init_f函数里最前面加上

extern ulong base_sp;  /*lyy*/


然后重新烧写编译启动测试:



成功了,完美!!!

哈哈哈!!!终于搞定了这个BUG。开心~

想获得各种学习资源以及交流学习的加我:

qq:1126137994

微信:liu1126137994

可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息