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
阅读(723) | 评论(0) | 转发(0) |