2008年9月12日星期五

display和backlight之间不能不说的事情

我们在windows mobile5/6上写display和backlight驱动程序时候,经常可能会遇到"白屏"的现象。
Display关闭,backlight还是打开,这就是"白屏"。一般情况下,Display和backlight是两个独立的驱动程序,那么看来在关闭屏幕和背光这两个驱动程序是有一定顺序的。
我们先考虑关灯的情况,需要按如下顺序,不可颠倒,颠倒就是"白屏":
1. backlight off 2. display off
再考虑开灯的情况,需要按如下顺序,不可颠倒,颠倒就是"白屏":
1. display on 2. backlight on
从上面可以看出,开灯和关灯动作的顺序是相反的。如果从供电的角度来看,display和backlight有着父子关系,即display是backlight的父亲。display有电,backlight才可能有电。
可是Windows Mobile的power manager在睡觉和唤醒时,对设备驱动的操作是线性的。比如先开display,再开backlight,那么必然也是先关display,再关backlight。因此靠power manager来解决白屏问题是不可能了,需要我们自己处理。
而且实际上由于display和backlight的IClass不同,使得他们位于power manager的两个不同的设备管理列表里,导致backlight的流设备列表一定先被操作到,然后才是display。这样一来和上面提到的关灯的顺序是符合的。开灯的顺序相反!

解决方案一
把backlight放在display驱动中去做,这样简单很多,很多变量可以共享

解决方案二
Backlight和display仍然是两个驱动。那么我们的重点是反转开灯的顺序。可以选择在backlight驱动程序处理IOCTL_POWER_SET的D0时,给display驱动的电源状态设置一个floor(请参考 http://cpuwolf.blogspot.com/2008/09/window-mobile-power-managementdevice.html),先调用SetPowerRequirement(pszDevice, D0, POWER_NAME, NULL, 0);再开启硬件背光。这个结论Microsoft的文档也有,但是她绝对不会告诉你为什么。

2 条评论:

Unknown 说...

backlight能调节吗?WM6最烦人的问题是不能调节,太亮了

cpuwolf 说...

写个应用程序就可以了