wince + 6410 背光驱动记录

参考资料:

http://topic.csdn.net/u/20100609/15/845468df-d0a6-4938-bef3-75f086c9319d.html
http://topic.csdn.net/u/20100803/16/584eacc7-7440-4cf4-af4b-ec037cf41f36.html

http://topic.csdn.net/u/20100426/14/1f2260b7-de6e-4615-9367-79139798325f.html

///WinCE下实现唤醒屏幕背光时忽略第一次触摸和按键输入
http://hi.baidu.com/lvoids/item/f91ab9cb7752cd0c0ad93ad5

/背光驱动分析//
http://cky0612.blog.163.com/blog/static/2747891620117602421813


电源管理1/
http://blog.mcuol.com/User/iwillbeback008/Article/11150_1.htm

无论我在控制面板->显示中设置多长时间,最终PM->PDD中读取的都是ACUserIdle
 代码如下:
    dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szPath, 0, 0, &hk);
    if(dwStatus == ERROR_SUCCESS) 
{
        // read system power state timeouts
        gdwACTimeoutToUserIdle = RegReadStateTimeout(hk, _T("ACUserIdle"), DEF_TIMEOUTTOUSERIDLE);
        gdwACTimeoutToSystemIdle = RegReadStateTimeout(hk, _T("ACSystemIdle"), DEF_TIMEOUTTOSYSTEMIDLE);
        gdwACTimeoutToSuspend = RegReadStateTimeout(hk, _T("ACSuspend"), DEF_TIMEOUTTOSUSPEND);
        gdwBattTimeoutToUserIdle = RegReadStateTimeout(hk, _T("BattUserIdle"), DEF_TIMEOUTTOUSERIDLE);
        gdwBattTimeoutToSystemIdle = RegReadStateTimeout(hk, _T("BattSystemIdle"), DEF_TIMEOUTTOSYSTEMIDLE);
        gdwBattTimeoutToSuspend = RegReadStateTimeout(hk, _T("BattSuspend"), DEF_TIMEOUTTOSUSPEND);
        // release resources
        RegCloseKey(hk);
    }

请问:如果我想通过设置控制面板->显示的超时时间将背光关掉,请问我是否需要修改PM相关代码

解决办法是:在bkldrvmain.cpp监控线程函数中:
WORD fnBackLightThread(PVOID pvArgument)
我们可以找到:
while(1)    
    {
       dwResult = WaitForMultipleObjects(BKL_NUM_EVENTS, &WaitEvents[0], FALSE, INFINITE);
……..
……..
While(1)死循环,不断检测各种和背光有关的各种状态,在看到死循环里面的WaitForMultipleObjects(BKL_NUM_EVENTS,&WaitEvents[0], FALSE, INFINITE);语句,调用了WaitForMultipleObjects多事件等待函数,但是却用了无限大的时间“INFINITE”作为等待时间,这显然没有把控制版面注册表中读回来的背光时间用上,所以做了一下改动:
//add by wxm
    DWORD   dwTimeoutGet;
//add by wxm
 // add by wxm
dwTimeoutGet = GetTimeout(pBKLinfo)*1000;
          dwResult = WaitForMultipleObjects(BKL_NUM_EVENTS, &WaitEvents[0], FALSE, dwTimeoutGet);
 //add  by wxm
把控制版面注册表中读回来的背光时间用上,同时在后面的switch(dwResult)中加入了:
 case WAIT_TIMEOUT:
{
                     DEBUGMSG(1,(TEXT("WAIT_TIMEOUT \r\n"))); 
                     BackLightSetState(D4);
}
 //add by wxm 
break;
这样设置的背光时间到的时候,就可以进行背光的控制了。

 

 

在设定的时间 背光关闭后,唤醒不了?

解决办法:

、唤醒背光灯机制:(这里我是在Wince 6.0下改的)
(1) 背光控制当然要在用户有输入的时候把背光打开了,但是这个MDD中没有提到过这件事,我们只有自己加于一个进程来检测了。wince用户输入事件  ("PowerManager/ActivityTimer/UserActivity"),这个在楼上的几位都提到了;
   首先我们在bkli.h 的BKL_MDD_INFO 结构体定义中加入输入事件的定义
//add by wxm
HANDLE                  hInputEvent;      //输入触发事件
//add by wxm
在bkldrvapi.cpp 中加入:输入事件的赋值
//add by wxm
const TCHAR szevtUserInput[] = TEXT("PowerManager/ActivityTimer/UserActivity");
//add by wxm
创建事件:
//add by wxm 
    pBKLinfo->hInputEvent = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
   if(NULL == pBKLinfo->hExitEvent)
    {
        RETAILMSG(ZONE_ERROR, (TEXT("BLK_Init:hInputEvent OpenDeviceKey failed with %u\r\n"), dwStatus));
        goto error;
    }
//add by wxm
在bkldrvmian.cpp中加入:
事件检测中的位置:
//add by wxm
#define BKL_EVENT_INPUT          4     
//add by wxm
等待事件赋值:
//add by wxm
 WaitEvents[BKL_EVENT_INPUT] = pBKLinfo->hInputEvent;   
//add by wxm
输入事件的处理:
     //add by wxm
     case(WAIT_OBJECT_0 + BKL_EVENT_INPUT):
         {
               DEBUGMSG(ZONE_BACKLIGHT,(TEXT("BKL_EVENT_INPUT\r\n")));
                BackLightSetState(D0);
            }
            break;
通过以上的修改就只要有输入事件比如触摸屏输入时就可以点亮背光灯了。

 

3。按键可以唤醒背光,但要按几次或者触摸几次屏才能唤醒背光?

目前的解决方式:
PowerManager/ActivityTimer/UserActivity等待的线程的优先级设置高点,基本是每次都能够捕捉到,大家可以试验下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值