硬件平台介绍:三星S5PV210芯片,wince6.0系统。
这几天遇到了郁闷的问题:系统从UART启动,通过dragin工具也加载成功BL1_UART.NB0文件,通过串口打印消息可以看出,BL1也运行起来了,初始化OTG口也成功了,传输EBOOT.NB0文件也成功了,跳转到EBOOT去执行时停止了。停在了如下消息处:
OEMInitLIb is Success
+++InitializeInterrupt()
---InitializeInterrupt()
+++OTGDEV_InitOtg
OTGDEV_SetSoftDisconnect
---OTGDEV_InitOtg
TSR START ADDRESS : 0x47700000
TSR IMAGE SIZE : 0x00080000
DOWNLOADING IS COMPLETED
我对比了我的BL1_UART目录下的代码,和原来开发板提供的代码一致,也对比了EBOOT下的代码,我有在BSP_ARGS这个结构体里增加了2个DWORD的变量。然后就是修改了LOGO显示部分的代码,LOGO图片也比之前的小很多。系统编译能通过,但是不管我怎么恢复,就是跳转运行EBOOT.NB0不成功。也测试了PMIC的POWERHOLD脚的电平也没有变化,从上电到运行EBOOT.NB0始终是高电平。这点应该可以排除电源跌落造成停止运行的情况。难道是DDR2 RAM初始化代码方面的问题?
分析EBOOT代码,正常启动应该是:从BootloaderMain函数里的KernelRelocate执行完后就执行OEMDebugInit函数,然后就是打印出:
Microsoft Windows CE Bootloader Common Library Version 1.4 Built May 17 2012 11:40:09
+OEMPlatformInit.
Microsoft Windows CE Bootloader for the Samsung SMDKV210 Version 2.5 Built May 17 2012
这一串东西。我现在的情况就是打印不出上面的那串消息。如何判断有没有执行到BootloaderMain函数里面呢?决定点灯试试。还有个疑问:有什么工具可以断点调试BL1或者eboot代码?VS2005可以吗?
现在测到的最新进展是:当一执行:BL1代码里的main函数的最后:
CallTSR = (TSR_RUN)dwImgAddr;
CallTSR();
就系统复位。(原来我设定的某个管脚置高的脚变低了。),地址是没错的:0x47700000,为什么跳到这个地址去就复位了呢?
CallTSR 是这样定义的: TSR_RUN CallTSR;
现在测到的最新进展是:BL1文件用我自己的BL1_UART.NB0,EBOOT用以前能正常启动的开发板的EBOOT.NB0,就能正常跳到eboot去执行。因此断定:肯定是我的EBOOT代码问题,造成跳到eboot去后系统复位。后面重点检查eboot代码问题。
问题搞定:在BL1或EBOOT目录下的startup.s中复位后增加如下代码:
ldr r1, =0x02 ;GPH1DAT[1] =1
ldr r0, =GPH1DAT
str r1, [r0]
ldr r1, =0x00000010 ;GPH1[1] : Output PMIC_PWRHOLD_OUTPUT=1
ldr r0, =GPH1CON
str r1, [r0]
ldr r1, =0x02 ;GPH1DAT[1] =1
ldr r0, =GPH1DAT
str r1, [r0]
若是增加如下代码:
ldr r1, =0x00000010 ;GPH1[1] : Output PMIC_PWRHOLD_OUTPUT=1
ldr r0, =GPH1CON
str r1, [r0]
ldr r1, =0x5551 ;GPH1PUD[1] ENables Pull-up
ldr r0, =GPH1PUD
str r1, [r0]
ldr r1, =0x02 ;GPH1DAT[1] =1
ldr r0, =GPH1DAT
str r1, [r0]
则始终不行。这点细节折腾我好久!!