阅读:1822回复:6
关于电源管理调用OemPowerOff的问题,(pxa255)
各位兄弟有谁研究过pxa255的OEMPowerOff代码啊,我的系统在睡眠时调用了他,然后在唤醒的时候有执行到重新初始化串口,然后就没反映了,,各位能不能指点指点,或者告诉我这段代码该如何调试,谢谢!
|
|
最新喜欢:clevor |
沙发#
发布于:2004-05-26 14:31
\\WINCE420\\PRIVATE\\WINCEOS\\COREOS\\NK\\KERNEL\\kwin32.c
DoPowerOff(void) { extern DWORD bLastIdle; /* Tell GWES and FileSys that we are turning power off */ bLastIdle = 0; RETAILMSG(1, (TEXT(\"Powering Off system:\\r\\n\"))); CallPowerProc(pCurThread, GwesPowerKey, GwesPowerProc, GwesPowerFunc, TRUE, TEXT(\" Calling GWES power proc.\\r\\n\")); CallPowerProc(pCurThread, WDevicePowerKey, WDevicePowerProc, WDevicePowerFunc, TRUE, TEXT(\" Calling WDevice power proc.\\r\\n\")); CallPowerProc(pCurThread, PowerKey, PowerProc, PowerFunc, TRUE, TEXT(\" Calling device manager power proc.\\r\\n\")); RETAILMSG(1, (TEXT(\" Calling OEMPowerOff...\\r\\n\"))); #if SHx FlushCache(); #endif OEMPowerOff(); RETAILMSG(1, (TEXT(\"Back from OEMPowerOff\\r\\n\"))); #if SHx FlushCache(); #endif InitClock(); /* reinitialize timer h/w */ /* Tell GWES and Device manager that we are turning power back on */ CallPowerProc(pCurThread, PowerKey, PowerProc, PowerFunc, FALSE, TEXT(\" Calling device manager power proc.\\r\\n\")); CallPowerProc(pCurThread, WDevicePowerKey, WDevicePowerProc, WDevicePowerFunc, FALSE, TEXT(\" Calling WDevice power proc.\\r\\n\")); CallPowerProc(pCurThread, GwesPowerKey, GwesPowerProc, GwesPowerFunc, FALSE, TEXT(\" Calling GWES power proc.\\r\\n\")); RETAILMSG(1, (TEXT(\" Returning to normally scheduled programming.\\r\\n\"))); // if there is any non-interrupt events to be set, set it here PowerOnSetEvents (); DEBUGMSG(1, (TEXT(\" Returning from PowerOnSetEvents.\\r\\n\"))); // If platform supports debug Ethernet, turn interrupts back on if (pKITLInitializeInterrupt) pKITLInitializeInterrupt(); } |
|
|
板凳#
发布于:2004-05-27 08:27
是调用OEMPowerOff,,这个文件在%bsp%\\kernel\\hal\\arm\\pmgrxsc1.s
中,我测试了一下,基本上是保存各个寄存器状态直接resume可以启动,就是执行到了shut down后,就不能resume了 |
|
地板#
发布于:2004-05-27 09:42
?
你上面说是RESUME回来后初始化串口才死的? 到底是哪一个现象. 如果是SHUT DOWN,也就是CPU进SLEEP后,就回不来了,那你要查一下你的BOOTLOADER,因为CPU重新上电后,和第一次启动一样,都是从BOOTLOADER开始执行的,然后再BOOTLOADER里判断是RESUME还是COLD BOOT,是RESUME的话再执行一个跳转,回到OEMPOWEROFF()里,把寄存器的值Restore回来.然后会调用InitClock()重新初始化一遍频率. |
|
|
地下室#
发布于:2004-05-28 11:15
是这样的,OEMPowerOff醒来的时候是跳到了PmgrResume,,而在PmgrResume中bl OsSpecificDebugCommsResume,用来重新初始化串口.我可以确定的确执行到了bl OsSpecificDebugCommsResume这一步(从超级终端中可以看出),这是否说明我的系统cpu在上电以后跳进了OEMPowerOff并执行了PmgrResume?? 但是在kwin32.c中调用的OEMPowerOff的后面紧跟着有一个输出语句\"back form OEMPowerOff\",我没有看到这一句,说明OEMPowerOff并没有调回睡眠前的状态,这是怎么回事??
|
|
5楼#
发布于:2004-05-31 11:06
wince420\\private底下的CODE只是给你参考的,它里面的RETAILMSG不一定会输出.而且,一般RETAILMSG是靠ETHERNET来输出的,只有等ETHERNET重新初始化后,消息才能被输出.
既然你已经确定OsSpecificDebugCommsResume已经被执行,那说明上电后,程序确实回来了,你就继续从OsSpecificDebugCommsResume往后查吧. 在你的串口还无法打出消息的时候,你可以用板子上的LED来打出一些信号,看看程序执行到哪里了. 我不是用XSCALE的平台,所以只能和你讨论大致的流程,无法追踪具体的问题. |
|
|
6楼#
发布于:2004-06-01 13:42
还是搞不了,,在OsSpecificDebugCommsResume后面只有
; About to go back into normal operations, and the save data will be invalid ; within a few microseconds. Dirty the checksum. ldr r7, =(SLEEPDATA_BASE_VIRTUAL+SleepState_CHKSUM) ldr r0, [r7] ; Get from sleep data area add r0, r0, #1 ; Invalidate value str r0, [r7] ; Write dirty value back ldmia sp!, {r0-r12,lr} 这些语句了,,我能确认的确是cpu掉电后才不能唤醒,,而且也确实执行到了OsSpecificDebugCommsResume,怎么办啊 |
|