关于系统自动关闭背光的问题

xwell   2009-2-4 17:56 楼主
我的平台是PXA270+Wince5.0
目前有一个小问题,请教大家。
系统启动后,如果有一段时间没有使用,则背光会自动关闭,再过一段时间则进入useridle->systemidle->suspend状态。
在控制面板-->display-->backlight页面中可以设置自动关闭背光的时间,现在的问题是,背光关闭是是进入D3模式(最小背光),而不是D4模式(背光全关),同时进入D3模式后,我不论是点击屏幕还是使用按键,都不能是背光恢复成D0(普通使用的背光亮度)。

所以,请问一下,是在哪里设置的背光关闭时是进入D3还是D4?从串口信息来看,是有一个进程给背光驱动发送了一个IOCTL_POWER_SET request to D3,这个进程应该是控制面板中的调用的,但是我怎么也找不到是在哪里使用DeviceIOControl发送的IOCTL_POWER_SET。在背光驱动中是已经实现了IOControl,外部进程只需要发送DeviceIOControl就可以了。我在我的驱动中是没有搜索到。

第二个问题是,当系统进入useridle或者systemidle模式的时候,我使用touch或者按键都可以让系统相应一个PBT_TRANSITION消息,通知系统电源管理状态变更,因此我可以在相应消息的地方加入我自己的控制代码。但是背光关闭的时候,怎样能让系统响应touch或者keyboard从而知道我想把背光打开呢?这部分应该在哪里实现呢?

请大家帮忙讲一下基本的流程,我这两天看代码已经有点晕了,实在想不通了,唉。
谢谢!

回复评论 (18)

系统会自动关闭背光
点赞  2009-2-4 18:25
所以,请问一下,是在哪里设置的背光关闭时是进入D3还是D4?

注册表里面。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\State\UserIdle]
    "Default"=dword:3           ; D3
    "wav1:"=dword:0             ; D0
    "Flags"=dword:00100000      ; POWER_STATE_IDLE
default是对所有的驱动发送的消息,但是wav驱动是特殊,它不响应。

点赞  2009-2-4 18:56
关于第二个问题。。。

你所说的背光全部关闭是什么状态,系统处于useridle,systemidle,还是suspend??如果不是suspend,PM会用PBT_TRANSITION自动通知你的。
点赞  2009-2-4 18:58
控制面板-->display-->backlight这里设置的背光关闭时间跟系统的D0,D1这些状态根本没有关系,这需要另外一个线程来管理背光
IOCTL_POWER_SET这些IOCTL的调用代码可以参考Public下面的PM的代码
正常的话如果用系统的PM来控制,只要点击Panel或按键,都会发出useractivity事件,默认的系统在userinactive和useridle的状态都会回到On
但是D3已经对应的是Suspend状态,所以点Panel或按键是无法让系统回到ON的
我们一般会在D1对应Useridle的状态把背光关暗即最小背光,D2对应的Systemidle时就把背光完全关掉,而不是D3和D4
点赞  2009-2-4 22:53
我前面可能说的不太清楚。不好意思
与背光有关的D0,D1,D2,D3,D4,和系统的D1,D2,D3,D4不一样。
与背光有关的D0,D1,D2,D3,D4,是我在背光驱动中设置的背光的不同亮度模式,外部驱动发送IOCTL_POWER_SET过来,只需要送过来一个state值即可,state=D0, or, D3, or D4
系统的D1是useridle,我在这个状态将背光设成最小(背光的D3模式),D2是systemidle,这是我设置背光关闭(即背光的D4状态),这里没什么问题。
问题出在系统自动关闭背光的时候,此时还没有进入useridle或者systemidle模式,应该还处于On的模式,但是由于在控制面板中设置了自动关闭背光的时间,比方说我设置自动关闭背光是1分钟,但是在控制面板的power选项中设定进入useridle模式的时间是2分钟,这样系统会先自动关闭背光,1分钟后在进入useridle模式,问题就出在这1分钟的时间差上,这一分钟之内,我无论怎么做都无法让背光亮起来,只有系统进入useridle模式后,才可以(因为我在这里加了控制代码)。
所以我现在想了解系统自动关闭背光的流程,以及我如何让系统响应active事件。
非常感谢。
点赞  2009-2-4 23:08
那是因为你的管理控制面板设置关背光的代码没有检测Activity事件
hEvents[3] = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("PowerManager/ActivityTimer/UserActivity"));
在那个线程里等待这个事件,如果有发生再进行相应的处理
这个线程一般会在背光的驱动中,自己去找找吧
点赞  2009-2-4 23:28
只是不关背光吗?还是所有的设备都保持供电?直接设一下SYSTEMSTATUS不也可以吗?
点赞  2009-2-5 01:13
mark.
貌似一般做成手机或者PND形式的有这样的要求。其他的感觉要不就开着要不就关掉。
自动关闭可能是为低功耗设计吧。
点赞  2009-2-5 08:08
引用: 引用 6 楼 hzdysymbol 的回复:
那是因为你的管理控制面板设置关背光的代码没有检测Activity事件
hEvents[3] = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("PowerManager/ActivityTimer/UserActivity"));
在那个线程里等待这个事件,如果有发生再进行相应的处理
这个线程一般会在背光的驱动中,自己去找找吧


我看了一下lz的最新回复,如果我理解没错的话,它的背光自动关闭不是PM来控制的,所以hzdysymbol 说的这个检测activity事件也解决不了它那个一分钟的时间差的问题。因为在它背光关闭的那个时间差内,点击屏幕这个事件肯定是已经被触发了的,这个事件是通知PM来改变系统电源状态,但是它的背光不是由PM来控制的,也就是说系统虽然处于On状态的时候,它的背光却还是灭的,只有等待系统进入useridle状态,然后你再点击屏幕,触发activity事件,这个时候屏幕才会被点亮。

要解决这个一分钟时间差的问题,lz可以利用touchpanel的中断引脚,当点击屏幕的时候会随时触发这个中断,收到这个中断后再将背光点亮,而不要一味的依赖PM。
点赞  2009-2-5 09:39
引用: 引用 6 楼 hzdysymbol 的回复:
那是因为你的管理控制面板设置关背光的代码没有检测Activity事件
hEvents[3] = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("PowerManager/ActivityTimer/UserActivity"));
在那个线程里等待这个事件,如果有发生再进行相应的处理
这个线程一般会在背光的驱动中,自己去找找吧


不好意思,我没仔细看清楚。hzdysymbol 说的对,lz可以在背光驱动中添加检测activity这个事件的线程,从而来将背光点亮。一般情况下PM中会去检测这个事件来将系统电源状态设置为on。
点赞  2009-2-5 09:43
谢谢大家,我再去研究一下背光驱动,回来报告。
点赞  2009-2-5 10:25
搞定,非常感谢。
我在背光驱动的线程中按照hzdysymbol 所说增加了响应用户activity的事件,一旦事件触发,就将背光设置为D0状态。目前没有问题了。
感谢大家的帮助。结贴给分了。
点赞  2009-2-5 11:25
Mark!
点赞  2009-2-5 12:04
提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-2-5 17:23
33333
点赞  2009-2-6 03:07
我的不会,开一天不管他也不会进入背光,所谓帮不了你,
点赞  2009-2-6 04:19
mark
点赞  2010-3-22 14:15
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复