Chinaunix首页 | 论坛 | 博客
  • 博客访问: 271585
  • 博文数量: 95
  • 博客积分: 2047
  • 博客等级: 大尉
  • 技术积分: 1022
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 16:18
文章分类

全部博文(95)

文章存档

2013年(1)

2011年(94)

我的朋友

分类: 嵌入式

2011-08-14 19:18:35

SEP0718 u-boot进展(1)

目前状况:可以进入stage2,执行c语言的start_armboot函数

1)sep0718easic开发板上没有norflash芯片,但是可用SD卡启动引导程序。

早上将上次编译的ram版u-boot考入SD卡,没有更好的调试工具,只能用串口输出信息,发现可以运行到:
ldr pc, _start_armboot
这是u-boot第一阶段的终点,下一步将从board.c的start_armboot开始执行。
但是为什么没有运行到c代码呢?

首先我考虑的是SD启动,可能无法读取所有内容,手里没有SD启动资料,推测只能执行u-boot部分代码。

于是打开u-boot的copy_loop:宏,期望u-boot能够从SD卡中自动搬运到SDRAM中执行。

结果是:代码卡死在SD搬运至SDRAM的代码处。
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0]    */
stmia r1!, {r3-r10} /* copy to   target address [r1]    */
cmp r0, r2 /* until source end addreee [r2]    */
ble copy_loop

经过仔细考虑,u-boot毕竟有近100K,SD启动可不是norflash,应该没法通过这么简单的方式读取SD到SDRAM中,遂放弃做SD-uboot的打算。

2)换一种思路,开发板自带了一个bootloader(stepldr),作用是将WinCE从SD卡中搬运到SDRAM中处,为何不借用这个bootloader将u-boot搬运至SDRAM呢?

将最开始的u-boot烧入SD卡偏移266240处,果然可以用stepldr加载!此时我没有使用代码搬运,所以卡在_start_armboot处。

由于手里的源码显示stepldr将代码搬运至0x30200000处,于是我将u-boot的TEXT_BASE也修改为0x30200000,期望可以直接引导,但为何还是卡住呢?

于是我借用u-boot的判断地址代码(如下),发现_start和_TEXT_BASE并不相等,说明stedldr没有将代码搬运至0x30200000
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    end

本来有点失望,想找找源码,看看stepldr究竟搬运到何处,突然灵机一动:
就算处于SDRAM中的地址不对,也可以继续用copy_loop的代码嘛。

果然,打开copy_loop:宏定义,程序就可以顺序执行到start_armboot这个C函数了。

不过现在还是乱码,串口驱动应该还有很多问题。


I am Stepldr !!!!!! 
init SD card.........
Read NK.nb0 From SD .........
NK start .........

123蓨+
      夐?嫧,)

123是我插的桩,3表示start_armboot函数开始,后面应该是版本信息了。
目前的启动情况 stepldr从SD启动——将u-boot搬运至SD某处执行stage1——u-boot将代码搬运至TEXT_BASE出,执行stage2

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