ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:1781回复:6

关于电源管理调用OemPowerOff的问题,(pxa255)

楼主#
更多 发布于:2004-05-25 13:28
各位兄弟有谁研究过pxa255的OEMPowerOff代码啊,我的系统在睡眠时调用了他,然后在唤醒的时候有执行到重新初始化串口,然后就没反映了,,各位能不能指点指点,或者告诉我这段代码该如何调试,谢谢!

最新喜欢:

clevorclevor
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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();


}

 
www.cnemb.com
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-27 08:27
是调用OEMPowerOff,,这个文件在%bsp%\\kernel\\hal\\arm\\pmgrxsc1.s
中,我测试了一下,基本上是保存各个寄存器状态直接resume可以启动,就是执行到了shut down后,就不能resume了
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-27 09:42
?
你上面说是RESUME回来后初始化串口才死的? 到底是哪一个现象.

如果是SHUT DOWN,也就是CPU进SLEEP后,就回不来了,那你要查一下你的BOOTLOADER,因为CPU重新上电后,和第一次启动一样,都是从BOOTLOADER开始执行的,然后再BOOTLOADER里判断是RESUME还是COLD BOOT,是RESUME的话再执行一个跳转,回到OEMPOWEROFF()里,把寄存器的值Restore回来.然后会调用InitClock()重新初始化一遍频率.
www.cnemb.com
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-28 11:15
是这样的,OEMPowerOff醒来的时候是跳到了PmgrResume,,而在PmgrResume中bl OsSpecificDebugCommsResume,用来重新初始化串口.我可以确定的确执行到了bl OsSpecificDebugCommsResume这一步(从超级终端中可以看出),这是否说明我的系统cpu在上电以后跳进了OEMPowerOff并执行了PmgrResume?? 但是在kwin32.c中调用的OEMPowerOff的后面紧跟着有一个输出语句\"back form OEMPowerOff\",我没有看到这一句,说明OEMPowerOff并没有调回睡眠前的状态,这是怎么回事??
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-31 11:06
wince420\\private底下的CODE只是给你参考的,它里面的RETAILMSG不一定会输出.而且,一般RETAILMSG是靠ETHERNET来输出的,只有等ETHERNET重新初始化后,消息才能被输出.

既然你已经确定OsSpecificDebugCommsResume已经被执行,那说明上电后,程序确实回来了,你就继续从OsSpecificDebugCommsResume往后查吧.

在你的串口还无法打出消息的时候,你可以用板子上的LED来打出一些信号,看看程序执行到哪里了.

我不是用XSCALE的平台,所以只能和你讨论大致的流程,无法追踪具体的问题.
www.cnemb.com
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
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,怎么办啊
游客

返回顶部