21,618
社区成员
发帖
与我相关
我的任务
分享
//首先,在板的配置头文件中有如下定义:
#if !defined(CONFIG_NAND_SPL) && (CONFIG_SYS_TEXT_BASE >= 0xc0000000)
#define CONFIG_ENABLE_MMU
#endif
//其次,对start.S前部分的执行流程作简要描述:
_start: b reset
reset:
//更改CPU模式为SVC32
cpu_init_crit:
//主要行为,关MMU
bl lowleve_init
bl _main
//以前没有_main函数,而是执行一个名为board_init_f的函数,现此函数的调用位置_main函数
relocate_code:
//与主题无关
copy_loop:
//与主题无关
fixloop:
//与主题无关
fixabs:
//与主题无关
fixrel:
//与主题无关
fixnext:
//与主题无关
enable_mmu:
//开MMU
c7e0004c <_bss_end_ofs>:
c7e0004c: 0006d2a0 andeq sp, r6, r0, lsr #5
......
c7e00d88 <board_init_f>:
c7e00d88: e92d44f0 push {r4, r5, r6, r7, sl, lr}
c7e00d8c: e3a01000 mov r1, #0
c7e00d90: e3a02080 mov r2, #128 ; 0x80
c7e00d94: e1a00008 mov r0, r8
c7e00d98: eb00746f bl c7e1df5c <memset>
#下面这句把内存单元'0xc7e00e98'的内存加载到‘r0’.
c7e00d9c: e59f00f4 ldr r0, [pc, #244] ; c7e00e98 <board_init_f+0x110>
c7e00da0: e3a01010 mov r1, #16
#对照下面‘0xc7e00e98’处的内容后,可知此时'r0'的值为‘0xc7e0004c’.
#如果不出意外的话,执行完这句后,‘r3’的值应该为‘0x0006d2a0’。
c7e00da4: e5903000 ldr r3, [r0]
c7e00da8: e59f00ec ldr r0, [pc, #236] ; c7e00e9c <board_init_f+0x114>
......
c7e00e98: c7e0004c strbgt r0, [r0, ip, asr #32]!
c7e00e9c: c7e27d6d strbgt r7, [r2, sp, ror #26]!

你是nand起动和非nand起动都实验了?
没做过该芯片的nand flash启动,但根据你的描述,我理解是这样:
分nand_spl.bin部分和u_boot.bin部分。
nand_spl.bin影射到0,也就是一般启动时候的地址。然后nand_spl.bin将u_boot.bin搬移到sdram中,接着跳转到u_boot.bin的start开始正常的启动。
你所说的 CONFIG_SYS_TEXT_BASE,目前看来是对nand_spl.bin起作用了,它也包含start.
而对于u_boot.bin中的start,也许也用到这个宏,或者有其他宏控制? 这个对u_boot.bin start影响目前倒是不大,可以认为它是地址无关,还没有跳转。 但根据你的反汇编,其地址明显是在sdram中了?你贴的是u_boot.bin中的start吧?接着跳转就出了问题。
nand_spl.bin搬uboot.bin到sdram的地址是多少? 谁控制的? nand_spl.bin的start是谁控制?uboot.bin的start是谁控制? 他们一样吗?还有就是你上面帖的那个bl main, 符号main的地址是谁控制的?
弄清了这些,估计就知道问题在哪里了。可能自己的configuration没作对,可能其build tree的机制不完善,得自己手动改写地址。
接分的。。。