2970|13

112

帖子

0

资源

一粒金砂(初级)

定时关LCD背光的问题?请高手指点. [复制链接]

使用的是winCE5.0   ARM9核,  应用程序用EVC4.0开发;
我通过应用程序(set.exe)设置一个时间值(例如5S),设定完后马上关掉这个set.exe程序.当5S内没有任何的操作就关掉LCD的背光电源,然后我点击下触摸屏能马上打开LCD背光电源.请问用怎样的方法实现比较好?
方法一:在应用程序里定时,将应用程序隐藏在后台运行,驱动只负责开关的动作;
方法二:应用程序发送一个时间值给驱动,让驱动定时,当时间到了后执行开关的动作.


回复

98

帖子

0

资源

一粒金砂(初级)

方法一我用过。

放在驱动里定时是不好的做法,你需要考虑驱动是否block系统和影响电源管理,但是你仍然需要注意的是,睡眠和唤醒时的临界情况。

回复

113

帖子

0

资源

一粒金砂(初级)

建议你找一份smdk2410的BSP看一下它的背光驱动,里面实现了这个功能,不是你上面说的那2种方法。

回复

114

帖子

0

资源

一粒金砂(初级)

老斩:我在PB5.0软件的wince500\platform\smdk2410\src\下没找到你说的背光驱动这一部分的代码呢?
麻烦告诉我具体在哪个文件里面?
谢谢!

回复

102

帖子

0

资源

一粒金砂(初级)

嗯,wince自带的2410的BSP下确实没有,你需要samsumg提供的2410或者2440的BSP,如果你没有的话,可以留一个邮箱,我发给你---当然是背光驱动部分,整个BSP太大了。

回复

80

帖子

0

资源

一粒金砂(初级)

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include

  6. static const TCHAR g_szRegKey[]                = TEXT("ControlPanel\\BackLight");
  7. static const TCHAR g_szBatTimeout[]        = TEXT("BatteryTimeout");
  8. static const TCHAR g_szExtTimeout[]        = TEXT("ACTimeout");
  9. static const TCHAR g_szUseBattery[]        = TEXT("UseBattery");
  10. static const TCHAR g_szUseExt[]                = TEXT("UseExt");

  11. UINT ThreadProc(LPVOID ptr)
  12. {
  13.         HANDLE hUserActive;
  14.         HANDLE hUserInactive;
  15.         HANDLE hRegEvent;
  16.         HKEY   hKey;

  17.         DWORD  dwBatTimeout = 0;
  18.         DWORD  dwExtTimeout = 0;
  19.         DWORD  dwUseBattery = 0;
  20.         DWORD  dwUseExt     = 0;
  21.         hKey = NULL;

  22.         Sleep(2000);

  23.         hUserActive = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("PowerManager/UserActivity_Active"));
  24.         hUserInactive = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("PowerManager/UserActivity_Inactive"));
  25.         RETAILMSG(0, (L"## hUserActive=0x%x hUserInactive=0x%x\r\n", hUserActive, hUserInactive) );

  26.         if(hUserActive && hUserInactive && (RegOpenKeyEx(HKEY_CURRENT_USER, g_szRegKey, 0, 0, &hKey) == ERROR_SUCCESS) )
  27.         {
  28.                 HANDLE hEvs[1];
  29.                 DWORD dwTimeout;
  30.                 HINSTANCE hInst;

  31.                 hEvs[0] = hUserActive;
  32.                 dwTimeout = INFINITE;

  33.                 while(hKey)
  34.                 {
  35.                         switch(WaitForMultipleObjects(1, hEvs, FALSE, dwTimeout))
  36.                         {
  37.                         case WAIT_OBJECT_0:
  38.                                 RETAILMSG(0, (L"## WAIT_OBJECT_0 hEvs[0]=0x%x\r\n", hEvs[0]) );
  39.                                 if(hEvs[0] == hUserActive)
  40.                                 {
  41.                                         dwTimeout = INFINITE;
  42.                                         hEvs[0] = hUserInactive;
  43.                                         //lcd on
  44.                                         LCDON();
  45.                                         RETAILMSG(0, (L"## hUserActive dwTimeout=%d\r\n", dwTimeout) );
  46.                                 }
  47.                                 else
  48.                                 {
  49.                                         DWORD dwType, dwSize;
  50.                                         dwSize = sizeof(DWORD);
  51.                                         RegQueryValueEx(hKey, g_szBatTimeout, NULL, &dwType, (LPBYTE)&dwBatTimeout, &dwSize);
  52.                                         RegQueryValueEx(hKey, g_szExtTimeout, NULL, &dwType, (LPBYTE)&dwExtTimeout, &dwSize);
  53.                                         RegQueryValueEx(hKey, g_szUseBattery, NULL, &dwType, (LPBYTE)&dwUseBattery, &dwSize);
  54.                                         RegQueryValueEx(hKey, g_szUseExt    , NULL, &dwType, (LPBYTE)&dwUseExt    , &dwSize);
  55.                                         RETAILMSG(0, (L"## dwBatTimeout=%d dwExtTimeout=%d dwUseBattery=%d dwUseExt=%d\r\n",
  56.                                                 dwBatTimeout, dwExtTimeout, dwUseBattery, dwUseExt) );

  57.                                         if(dwUseExt && dwExtTimeout)
  58.                                                 dwTimeout = dwExtTimeout * 1000;
  59.                                         else if(dwUseBattery && dwBatTimeout)
  60.                                                 dwTimeout = dwBatTimeout * 1000;
  61.                                         else
  62.                                                 dwTimeout = INFINITE;
  63.                                         hEvs[0] = hUserActive;
  64.                                         RETAILMSG(0, (L"## hUserInactive dwTimeout=%d\r\n", dwTimeout) );
  65.                                 }
  66.                                 break;

  67.                         case WAIT_TIMEOUT:
  68.                                 RETAILMSG(0, (L"## WAIT_TIMEOUT hEvs[0]=0x%x\r\n", hEvs[0]) );
  69.                                 if(hEvs[0] == hUserActive)
  70.                                 {
  71.                                         //lcd off
  72.                                         LCDOFF();
  73.                                         dwTimeout = INFINITE;
  74.                                 }
  75.                                 break;

  76.                         case WAIT_FAILED:
  77.                                 RETAILMSG(0, (L"## WAIT_FAILED\r\n"));
  78.                                 RegCloseKey(hKey);
  79.                                 hKey = NULL;
  80.                                 break;
  81.                         }
  82.                 }
  83.         }
  84.         CloseHandle(hUserActive);
  85.         CloseHandle(hUserInactive);
  86.         CloseHandle(hRegEvent);
  87.         return 0;
  88. }

  89. BOOL StartBacklightThread(void)
  90. {
  91.         //SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
  92.         if( CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, NULL, 0, NULL))
  93.         {
  94.                 RETAILMSG(1, (TEXT("Display: StartBacklightThread OK\r\n")));
  95.                 return TRUE;
  96.         }
  97.         return FALSE;
  98. }
复制代码

回复

114

帖子

0

资源

一粒金砂(初级)

在触摸的驱动里加一个触发事件,点亮LCD

回复

99

帖子

0

资源

一粒金砂(初级)

老斩:我邮箱是lim1130@126.com    谢谢!
感谢各位的建议,我现在是在应用程序里做定时,发现很麻烦,好几个应用都要加这部分代码.

回复

101

帖子

0

资源

一粒金砂(初级)

楼主的问题解决了么?论坛里有这个文章:
"win ce5.0如何实现一个简单的背光驱动,假设一个GPIO的高低电平控制为LCD的背光控制。"
你可以去看看。

我现在刚忙完从三星官方2440的CE5.0 BSP移植CE到mini2440的工作,准备也想做做你们说的LCD背光控制。

回复

107

帖子

0

资源

一粒金砂(初级)

如果你的系统支持电源管理比较好的话,你的事情只是简单的做一个注册表键值的修改,然后更新一下系统的定时器
MS的PM已经完全支持这样的操作,详细请查看电源管理相关部分代码或文档
现在我们都已经把背光驱动中的定时线程拿掉了

回复

126

帖子

0

资源

一粒金砂(初级)

用GPIO直接关闭LCD背光,不管是驱动还是应用层都可以实现,但是前提是GPIO已经接到LCD背光控制的硬件接口上

回复

107

帖子

0

资源

一粒金砂(初级)

应用层加一个定时器,定时器到,调用LCD的IOCTL就OK了。

回复

101

帖子

0

资源

一粒金砂(初级)

在触摸屏驱动加打开背光的控制。

回复

128

帖子

0

资源

一粒金砂(初级)

引用 9 楼 hzdysymbol 的回复:
如果你的系统支持电源管理比较好的话,你的事情只是简单的做一个注册表键值的修改,然后更新一下系统的定时器
MS的PM已经完全支持这样的操作,详细请查看电源管理相关部分代码或文档
现在我们都已经把背光驱动中的定时线程拿掉了


支持hzdysymbol的这种做法,把这个事情交给系统的电源管理来做是最简单和安全的。当然,前提是你的系统支持电源管理。这样的话,你只需要实现一个写注册表的接口就行了,把要设定的值写到电源管理中系统状态对应的键值下面即可。比如,
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts]
    "ACUserIdle"=dword:3c        ; in seconds
    "BattUserIdle"=dword:3c        ; in seconds
你可以设定这个时间,然后当背光驱动收到系统进入useridle模式的消息的时候,你在驱动里面把背光关掉就OK了。

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表