niuyi
驱动牛犊
驱动牛犊
  • 注册日期2006-06-08
  • 最后登录2010-02-24
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望34点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:3926回复:4

怎么解决S3C2440A+WINCE5.0 唤醒后容易死机?

楼主#
更多 发布于:2008-01-20 12:29
在这个坛子里也看了几天了,还没有一个贴能够详细介绍这个问题。现在我把它提出来希望有经验的工程师能够分享。
我现在具体碰到的问题是:
1、可以正常挂起、也可以正常唤醒,不接任何外设框下(开发板默认设备)这样反复试了N次都可以正常工作。打开浏览器或word等应用程序都没问题。
2、当我接入USB-H、USB-D、SD卡中任何一个设备,不论是先唤醒后再接入,还是,先接入然后在睡眠/唤醒,唤醒后,都会出现容易死机情况。死机情况是这样的:唤醒后,触摸桌面图标,可以选择,但是特别慢,而且越来越慢。最后死机。
3、情况类似2,只是发生在windows\play.exe程序上。我想应该是跟音频驱动有关。

总结,问题情况就是连接了外设,就容易出现死机。是漫漫变慢直至死机。

我查看了USB-D驱动。发现有实现XXX_PowerDown和XXX_PowerUp函数。
也看到在睡眠/唤醒时都分别执行了他们。

请有经验或有解决方案的高手指点。谢谢。


实验:
我现在在USB-H驱动中,的XXX_Powerup函数里增加了pPddObject=HcdPdd_Init(AfterAwake.dwContext_bak);其中AfterAwake.dwContext_bak是在DLL_Main里备份的系统的HANDLE。
结果:
在WINCE使用U盘时,不死机了。可是却发现不了U盘。USB-H的设备状态仍然是D0
下面是调试串口的信息:
Start kernel .
Windows CE Kernel for ARM (Thumb Enabled) Built on Jun 24 2004 at 18:25:00
ProcessorType=0920  Revision=0
sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 8022c4cc
DCache: 8 sets, 64 ways, 32 line size, 16384 size
ICache: 8 sets, 64 ways, 32 line size, 16384 size
Sp=ffffc7cc
OEMIoControl: Unsupported Code 0x10100b4 - device 0x0101 func 45
OEMIoControl: Unsupported Code 0x101008c - device 0x0101 func 35
FMD::FMD_Init
FMD::FMD_Init - pBSPArgs->nfsblk = 0x0
FMD::FMD_Init - READ_REGISTER_BYTE(pNFSBLK) = 0x0
FMD::FMD_Init IPL .....
FMD::FMD_Init Done
MID = 0xec, DID = 0x76 4th Cycle : 0xa5
NUMBLOCKS : 512(0x200), SECTORSPERBLOCK = 256(0x100), BYTESPERSECTOR = 512(0x200)
FMD_OEMIoControl: unrecognized IOCTL (0x71c24).
OEMIoControl: Unsupported Code 0x10100c4 - device 0x0101 func 49
OEMIoControl: Unsupported Code 0x10100c4 - device 0x0101 func 49
INFO: CReg2440Uart::CReg2440Uart using processor frequency reported by the OAL (66608640).
INFO: CReg2440Uart::CReg2440Uart using processor frequency reported by the OAL (66608640).
DeviceFolder::LoadDevice!Enumerate Found deprecated load instructions at (Drivers\BuiltIn\AFD). Driver cannot be unloaded.
OEMIoControl: Unsupported Code 0x10100d0 - device 0x0101 func 52
OEMIoControl: Unsupported Code 0x10100f8 - device 0x0101 func 62
DeviceFolder::LoadDevice!Enumerate Found deprecated load instructions at (Drivers\BuiltIn\PPP). Driver cannot be unloaded.

IST Ready INTMSK= ebf33fe2

Init KEY Succeed!
::: PBT_IntrThread ID = a3ca8bba
INFO: PwrButton: Mapped Irq 0x0 to SysIntr 0x19.
PWRPWR::: WaitForSingleObject
HW_USBClocks::D0
HW_USBClocks::D4
OEMIoControl: Unsupported Code 0x10100fc - device 0x0101 func 63
Lyg.p: Layout Manager successfully initialized to  2
Maximum Allowed Error 7:
MSIM: IM_ReadRegistry read KB 5
HW_USBClocks::D0                            //USB-H处于D0态
Explorer(V2.0) taskbar thread started.

HcdPdd_CheckConfigPower entry              //这里发现了U盘
PWRPWR::: Recver
::: power off
::: 2GwesPowerOffSystem()                  //这里开始挂起
OEMIoControl: Unsupported Code 0x10100f4 - device 0x0101 func 61
HW_USBClocks::D4                           //USB-H处于D4态

KEY_PowerDown::: pPWR->CLKCON= ffff70
KEY_PowerDown::: pPWR->CAMDIVN= 0
KEY_PowerDown::: pPWR->CLKDIVN= 7
KEY_PowerDown::: pPWR->CLKSLOW= 4
KEY_PowerDown::: pPWR->LOCKTIME= ffffff
KEY_PowerDown::: pPWR->MPLLCON= 6e031
KEY_PowerDown::: pPWR->UPLLCON= 3c042

HcdPdd_PowerDown return             //调用了USB-H的XXX_PowerDown

OEMPowerOff::: pPWR->CLKCON= ffff7InitClock

HcdPdd_PowerUp return               //系统被唤醒

KEY_PowerUp::: pPWR->CLKCON= fffff0
KEY_PowerUp::: pPWR->CAMDIVN= 0
KEY_PowerUp::: pPWR->CLKDIVN= 7
KEY_PowerUp::: pPWR->CLKSLOW= 4
KEY_PowerUp::: pPWR->LOCKTIME= ffffff
KEY_PowerUp::: pPWR->MPLLCON= 6e031
KEY_PowerUp::: pPWR->UPLLCON= 3c042
HW_USBClocks::D0                             //USB-H是D0态
::: Power On!
HW_USBClocks::D4                            //D4态
PWRPWR::: WaitForSingleObject
PWRPWR::: Recver
PWRPWR::: WaitForSingleObject
HW_USBClocks::D0                              //又切换到D0态
//这时插入U盘。系统没反应但没死机。就是AttachDevice()不了U盘。

其中我在KEY驱动中打印了电源管理的一些寄存器在挂起前/唤醒后的状态。


挂起前,唤醒后,我都在OEMInterruptHandler里,用下面方法查看在U盘插入时有没有产生中断:(结果是没有产生)
#if 1            //by NiuYi
    if(irq == IRQ_USBD){
        RETAILMSG(1,(_T("\n GET IRQ_USBD Interrupt!!! \n")));
    }
#endif

还请做过的高手指点。
niuyi
驱动牛犊
驱动牛犊
  • 注册日期2006-06-08
  • 最后登录2010-02-24
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望34点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-23 09:38
我做了回环测试。缩小了问题范围

在WINCE的OAL层的startup.s里的睡眠命令前跳到Awake_address处。也就是说按睡眠键,都最后要睡眠时直接又开始了唤醒。
经过这样测试。WINCE的所有设备能够正常工作。
niuyi
驱动牛犊
驱动牛犊
  • 注册日期2006-06-08
  • 最后登录2010-02-24
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望34点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-23 15:20
问题已解决。是NAND FALSH在唤醒后没有正确初始化。
swmt
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-12-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-02-27 16:24
我也遇到了上面的问题,我想知道当我按下powerbutton时系统suspend,再次按下powerbutton唤醒系统时这个时候初始化nandflash那我的应用程序怎么接着运行呢?
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-11-05 14:55
本人也是使用的2440+wince5.0的平台,遇到了一模一样的问题,也按照楼主提到的方法修改了唤醒时调用的NANDInit函数,但是没有效果,唤醒后依然死机。

不知道楼主能否把修改的具体方法贴出来?
哪位解决了此问题的高手能否指点迷津?
游客

返回顶部