Backlight off就是关掉背光灯,其他设备都正常运转,此时用户的所有活动(按键,点击触摸屏等)都会通知到pm.dll,使系统状态变回on,同时也由pm.dll调用ioctl的IOCTL_POWER_SET把每个设备的状态设置一次。我们可以在控制面板中设置什么时候关掉背光。
Backlight off超时,就会suspend,此时所有的设备进入D3,CPU进入等待中断的节能状态。我们可以SystemIdleTimerReset()间隔一段时间重置一下timeout时间,使系统永远都不能suspend,这就是为什么media player可以连续播放音乐,而不至于sleep。你可以注意到这种对电源的需求是由应用程序提出的,而不是驱动程序。
系统一但进入suspend,只有靠hardware中断才能唤醒CPU core,驱动程序可以调用KernelIoControl(IOCTL_HAL_ENABLE_WAKE)来宣告自己是唤醒系统的中断源。我要强调一下,这里的“唤醒”不是使系统变为on,而是系统由suspend变为resuming,resuming对应D2,作为用户或者开发者的你,在外面是看不见任何现象的(不会有背光被打开)。如果你想要如SD卡插入系统被唤醒(即系统进入on的状态),需应用程序或驱动程序监视系统进入resuming状态,此时查看唤醒源是什么中断,如果是SD,可以模拟一次application button press,发送PowerPolicyNotify(PPN_APPBUTTONPRESSED,0),即可以完全唤醒系统。
Resuming被定义为“最不稳定”的状态。因为当处于其他的任何状态,都可以通过间隔性的调用SystemIdleTimerReset()来保持住当前状态,唯独resuming不可以被保持,15秒之后系统会睡眠。
那么来假想一种需求,如果某个应用程序每隔5分钟需要做一些例如同步的事情。5分钟很长,这个程序还想为系统考虑,节约用电,那么5分钟之内系统可以suspend来节电,5分钟之后通过RTC中断将系统唤醒,做一些“后台”同步的事情,因此这个事不需要用户参与(也就是背光和屏幕可以关闭,同时声音关闭)。这个需求导致了unattended电源状态的产生。在进入resuming状态15秒以后,如果系统发现有程序提出unattended的需求,
PowerPolicyNotify( PPN_UNATTENDEDMODE,TRUE)
PowerPolicyNotify( PPN_UNATTENDEDMODE,FALSE)
那么系统进入unattended电源状态,使机器在不打扰用户的情况下运行。
没有评论:
发表评论