none
OEMPowerOff函数中如何同时实现挂起和睡眠? RRS feed

  • 问题

  • 在APP中调用:

    SetSystemPowerState(null,POWER_STATE_SUSPEND,POWER_FORCE)----让系统进入睡眠

    SetSystemPowerState(null,POWER_STATE_RESET,POWER_FORCE)----让系统重启

    最终内核会调用:

    OEMPwerOff() 函数。

    在这个函数中我想实现如下功能,该如何做?

    void OEMPwerOff()

    {

             if ("==重启")               ;//这个状态如何获取?

                Enter_restart()     ;//进入重启

           else if ("==睡眠")          ;//这个状态如何获取?

                Enter_sleep()     ;//进入睡眠    
    }

    可是我怎么知道,什么时候进入重启,什么时候进入睡眠?也就是说,我如何接受SetSystemPowerState传来的参数?

    请各位老师指点下?

     

    2010年8月2日 10:21

答案

全部回复

  • 有一点可能你的理解不太正确。

    void OEMPwerOff()并不是一个被叫过一次,马上返回的函数。事实上,OS call OEMPwerOff后,就在OEMPwerOff执行中,进入睡眠状态。而OEMPwerOff也被中断在某一个特定的点。

    当system wake up之后,OEMPwerOff又继续执行下去。

    所以OEMPwerOff的操作依次应该是

    1。关掉所有的电源,准备进入suspend mode

    2。通过ARM指令,让processor进入suspend mode

    3。打开所有电源,为full operation做好准备

    4。返回

    2010年8月3日 3:59
    版主
  • 有一点可能你的理解不太正确。

    void OEMPwerOff()并不是一个被叫过一次,马上返回的函数。事实上,OS call OEMPwerOff后,就在OEMPwerOff执行中,进入睡眠状态。而OEMPwerOff也被中断在某一个特定的点。

    当system wake up之后,OEMPwerOff又继续执行下去。

    所以OEMPwerOff的操作依次应该是

    1。关掉所有的电源,准备进入suspend mode

    2。通过ARM指令,让processor进入suspend mode

    3。打开所有电源,为full operation做好准备

    4。返回


    谢谢您的回复。

    但我想不管怎样,在OEMPwerOff内应该要实现这几个状态的识别吧。比如SLEEP和SUSPEND,执行状态是SUSPEND时,有时需要关掉CPU的电源,面SLEEP就不需要。另外在保存状态数据时,这两种状态也不一样。

    2010年8月3日 5:45
  • 如果我没有记错的话,Sleep没有对应的状态。

    所谓你说得Sleep,应该是指CPU Idle状态。有一个专门的函数好像叫做OEMCpuIdle()

    2010年8月3日 5:48
    版主
  • 如果我没有记错的话,Sleep没有对应的状态。

    所谓你说得Sleep,应该是指CPU Idle状态。有一个专门的函数好像叫做OEMCpuIdle()


    是这样的,我们用POWER_STATE_SUSPEND  标记为SLEEP,用POWER_STATE_RESET标记为重启或关机.

    我们目前的做法是采用在APP中调用GwesPowerOffSystem()函数,在底层驱动中已经定义好了长按关机,短按睡眠的状态。然后保存在一个全局变量中,在  OEMPwerOff()函数中作判断,该进入哪种状态。

    我现在想在APP中由用户选择是关机还是睡眠,想用SetSystemPowerState这个函数接口,所以不知道如何在OEMPwerOff函数中知道用户选择的是关机还是睡眠。

       OEMIdle    是没有线程运行时是内核调用。

    2010年8月4日 0:32
  • 这样的话,你可以通过一块固定内存空间来传递Reset还是suspend的信息。

    具体来说,在你的板上内存中定义一块地址固定的空间,在你的驱动程序中通过mmmapiospace函数对它进行访问。在你得app中,通过setevent或者deviceiocontrol通知你的驱动程序,当前的状态是reset还是suspend,由驱动程序去修改那块固定空间里的数据。然后再call SetSystemPowerState。

    OEMPwerOff()函数里,直接访问那块固定空间(物理地址固定,所以直接map到虚地址上访问),然后确定应该进入suspend还是reset

    2010年8月4日 1:41
    版主
  • 在APP程序中调用如下函数时

    SetSystemPowerState(null,POWER_STATE_SUSPEND,POWER_FORCE)----让系统进入睡眠

    SetSystemPowerState(null,POWER_STATE_RESET,POWER_FORCE)----让系统重启

    在OEMPowerOff函数中,有没有什么办法得到应用程序传来的信息呢?

    2010年8月4日 2:42
  • 有一个函数叫OALIoCtlHalReboot,应该对应于POWER_STATE_RESET

    2010年8月4日 2:52
    版主