想做一个在OBM跑之前的boot,因为以后会碰到Rom code不support初始化DDR,且OBM已经超过了sram的容量时,那obm就没法跑了。因为代码不全嘛。所以作了一个Load obm的工具。功能就是初始化ddr,然后把obm load到ddr里,之后跳转到obm去跑。
最开始功能都实现了,但是在mnh上一直跑不通,跳转应该是没问题了,已经成功在obm里跑了,但是就是不出log最开始怀疑是死在汇编里了。后来通过jtag跟,发现已经跑到了c code.只是由于c code的参数传入的不对。
void OBMBootMain(UINT_T PlatformSettings)
PlatformSettings,估计就是拷贝过程中或者load过程中把那个参数给覆盖掉了。后来在汇编代码发现了这段code。
LDR r1, = ISRAMDateSpaceBase
STR r10, [r1]
原来是Rom code会去读CPU内部的一个fuses值,之后放在r10寄存器。通过这种方式传递给obm。所以我们跳转前,把这个fuses值也存入r10寄存器就可以了。
UINT_T SaveParamsForEboot(FUSE_SET Fuses)
{
__asm("MOV r10, r0");
return (NoError);
}
obm会根据这个fuses值去得到flash的type还有uart之类的一些硬件的类型。然后初始化硬件。
阅读(1091) | 评论(0) | 转发(0) |