jasonshi
驱动小牛
驱动小牛
  • 注册日期2004-10-11
  • 最后登录2011-07-01
  • 粉丝2
  • 关注0
  • 积分23分
  • 威望446点
  • 贡献值3点
  • 好评度256点
  • 原创分0分
  • 专家分0分
阅读:2270回复:7

电源管理方面的问题求教大家

楼主#
更多 发布于:2007-08-09 09:19
在控制面板中的电源管理里面,可以设置3种定时模式:
1。 隔一段时间进入user idle模式;
2。 隔一段时间进入system idle模式;
3。 隔一段时间进入suspend模式;
现在我知道的是suspend模式最后调用的时OEMpoweroff(),那么我想问问大家另外两种模式最终分别调用的哪两个函数?
wince_lover
驱动中牛
驱动中牛
  • 注册日期2007-01-10
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分1103分
  • 威望735点
  • 贡献值2点
  • 好评度279点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-08-09 10:53
应该是进入OEMIdle函数吧
jasonshi
驱动小牛
驱动小牛
  • 注册日期2004-10-11
  • 最后登录2011-07-01
  • 粉丝2
  • 关注0
  • 积分23分
  • 威望446点
  • 贡献值3点
  • 好评度256点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-08-09 15:31
user idle,和system idle应该进入的不是同一个底层函数吧?我看了下代码,发现没有任务调度的时候就会进入OEMIdle,所以这两种状态最终应该不是进入OEMIdle。
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-08-09 20:58
我没听说过IDLE还有两种,好像就只有一个IDLE吧, CPU没事做时就会进入OEMIDLE.
学海无涯
simula
驱动牛犊
驱动牛犊
  • 注册日期2006-07-14
  • 最后登录2012-08-01
  • 粉丝1
  • 关注0
  • 积分18分
  • 威望127点
  • 贡献值0点
  • 好评度50点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-08-10 09:22
1。 隔一段时间进入user idle模式;
如果你的设备驱动支持电源管理,且支持D1模式,他会接收到PM发过来的广播消息,进入D1模式,这个时候就要看你的设备驱动想在D1模式进行什么操作了
2。 隔一段时间进入system idle模式;
这个如同上,就是进入D2模式!

注意:如想接受到这些消息,必须在 IOCTL_POWER_CAPABILITIES 里面有支持 D1和D2
jasonshi
驱动小牛
驱动小牛
  • 注册日期2004-10-11
  • 最后登录2011-07-01
  • 粉丝2
  • 关注0
  • 积分23分
  • 威望446点
  • 贡献值3点
  • 好评度256点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-08-10 09:48
谢谢大家,simula:那么怎么支持D1,D2这种电源状态呢?我用什么函数驱获取电源的状态呢?
simula
驱动牛犊
驱动牛犊
  • 注册日期2006-07-14
  • 最后登录2012-08-01
  • 粉丝1
  • 关注0
  • 积分18分
  • 威望127点
  • 贡献值0点
  • 好评度50点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-08-10 10:19
一:注册ICLASS,如果是流接口比较方便在,注册表设置,比如
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\BAK]
    "Index"=dword:1
    "Prefix"="BAK"
    "Dll"="backlight.dll"
    "Order"=dword:1
    "IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"   ; Power-manageable generic
若在后面加入"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"   ; Power-manageable generic,他应该就会支持电源管理,名字为BAK1

2:驱动,加入 IOCTL_POWER_CAPABILITIES
这个里面若你要支持D1,D2必须加入:
PPOWER_CAPABILITIES ppc;
                memset(ppc, 0, sizeof(POWER_CAPABILITIES));
                // support D0 、D1、D2, D4
            ppc->DeviceDx = DX_MASK(D0) | DX_MASK(D1) | DX_MASK(D2) | DX_MASK(D4);  

然后完成其他电源管理的接口函数:
IOCTL_POWER_QUERY
IOCTL_POWER_SET
IOCTL_POWER_GET

当系统转换电源状态时会调用  
IOCTL_POWER_SET 参数就是D1,D2,D3这些东西,这时你就可以根据参数来进行你的电源管理!

为了方便,你可以建立一个线程,来监视系统电源的状态!这时可以发现系统变化时,你的受管理的驱动会接受到广播信息进行电源状态设置
jasonshi
驱动小牛
驱动小牛
  • 注册日期2004-10-11
  • 最后登录2011-07-01
  • 粉丝2
  • 关注0
  • 积分23分
  • 威望446点
  • 贡献值3点
  • 好评度256点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-08-10 11:35
谢谢simula ,我试试
游客

返回顶部