在大多2440开发板BSP中的SMDK2440/DRIVERS/backlite目录下一般都有背光驱动。在注册表中添加如下函数的时候,开机时确实可以打印"!!!!!!!!!!!! BACKLIGHT ON !!!!!!!!!!!!,如果没有操作大概1分钟后也可以打印!!!!!!!!!!!! BACKLIGHT OFF !!!!!!!!!!!!。但打印("!!!!!!!!!!!! BACKLIGHT OFF !!!!!!!!!!!!后,就算有触发事件(在触摸屏上点击,或者移动鼠标)也不会打印"!!!!!!!!!!!! BACKLIGHT ON !!!!!!!!!!!!。

[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/BAK]
    "Index"=dword:1
    "Prefix"="BAK"
    "Dll"="backlight.dll"
    "Order"=dword:1
    "IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"

当你好好分析驱动中的以下这3个Event时:

g_evtSignal[0] = CreateEvent(NULL, FALSE, FALSE, szevtBacklightChange); 
g_evtSignal[1] = CreateEvent(NULL, FALSE, FALSE, szevtUserInput); 
g_evtSignal[BL_POWEREVT] = CreateEvent(NULL, FALSE, FALSE, szevtPowerChanged);

尤其是第二个,好像又没有问题。

其实这个驱动大体是正确的,只是当键盘鼠标或触摸屏输入时候gwes 发送“PowerManager/ActivityTimer/UserActivity” event,而不是原驱动中的“("UserInputEvent");”修改后的源程序如下(SMDK2440/DRIVERS/backlite目录下bak_hw.cpp文件)。

  1. //
  2. // Copyright (c) Microsoft Corporation.  All rights reserved.
  3. //
  4. //
  5. // Use of this source code is subject to the terms of the Microsoft end-user
  6. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  7. // If you did not accept the terms of the EULA, you are not authorized to use
  8. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  9. // install media.
  10. //
  11. /*
  12. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  13. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  14. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  15. PARTICULAR PURPOSE.
  16. */
  17. #include <windows.h>
  18. #include <nkintr.h>
  19. #include <pm.h>
  20. #include "s2440.h"
  21. #include <nkintr.h>
  22. #include "oalintr.h"
  23. #include "drv_glob.h"
  24. #include "pmplatform.h"
  25. #include "bak_hw.h"
  26. //  Globals
  27. const TCHAR szevtBacklightChange[] = TEXT("BackLightChangeEvent");
  28. const TCHAR szevtPowerChanged[] = TEXT("PowerChangedEvent");
  29. const TCHAR szevtUserInput[] = TEXT("PowerManager/ActivityTimer/UserActivity");
  30. const TCHAR szregRootKey[] = TEXT("ControlPanel//Backlight");
  31. const TCHAR szregBatteryTimeout[] = TEXT("BatteryTimeout");
  32. const TCHAR szregACTimeout[] = TEXT("ACTimeout");
  33. const TCHAR szregBatteryAuto[] = TEXT("BacklightOnTap");
  34. const TCHAR szregACAuto[] = TEXT("ACBacklightOnTap");
  35. HANDLE   g_evtSignal[NUM_EVENTS];
  36. /* GPIO 寄存器对应的虚拟地址 */
  37. volatile IOPreg * v_pIOPregs = (IOPreg * )IOP_BASE;
  38. //  Global structure
  39. BLStruct g_BLInfo;
  40. // Perform all one-time initialization of the backlight
  41. //
  42. BOOL
  43. BacklightInitialize()
  44. {
  45. BOOL    bRet = TRUE;
  46. RETAILMSG(1, (TEXT("BacklightInitialize/r/n")));
  47. BL_PowerOn(TRUE);
  48. v_pIOPregs->rGPBCON &=0x3C03FF;
  49. v_pIOPregs->rGPBCON |=0x15400;
  50. v_pIOPregs->rGPBUP &=0x61F;
  51. return bRet;
  52. }
  53. //  Utility function to read from registry for the parameters
  54. void BL_ReadRegistry(BLStruct *pBLInfo)
  55. {
  56. HKEY    hKey;
  57. LONG    lResult;
  58. DWORD   dwType;
  59. DWORD   dwVal;
  60. DWORD   dwLen;
  61. lResult = RegOpenKeyEx(HKEY_CURRENT_USER, szregRootKey, 0, KEY_ALL_ACCESS, &hKey);
  62. if(ERROR_SUCCESS == lResult) {
  63. dwType = REG_DWORD;
  64. dwLen = sizeof(DWORD);
  65. lResult = RegQueryValueEx(hKey, szregBatteryTimeout, NULL, &dwType,
  66. (LPBYTE)&dwVal, &dwLen);
  67. if(ERROR_SUCCESS == lResult) {
  68. pBLInfo->m_dwBatteryTimeout = dwVal;
  69. }
  70. lResult = RegQueryValueEx(hKey, szregACTimeout, NULL, &dwType, (LPBYTE)&dwVal,
  71. &dwLen);
  72. if(ERROR_SUCCESS == lResult) {
  73. pBLInfo->m_dwACTimeout = dwVal;
  74. }
  75. lResult = RegQueryValueEx(hKey, szregBatteryAuto, NULL, &dwType, (LPBYTE)&dwVal,
  76. &dwLen);
  77. if(ERROR_SUCCESS == lResult) {
  78. pBLInfo->m_bBatteryAuto = (BOOL) dwVal;
  79. }
  80. lResult = RegQueryValueEx(hKey, szregACAuto, NULL, &dwType, (LPBYTE)&dwVal,
  81. &dwLen);
  82. if(ERROR_SUCCESS == lResult) {
  83. pBLInfo->m_bACAuto = (BOOL) dwVal;
  84. }
  85. RegCloseKey(hKey);
  86. }
  87. else {
  88. RETAILMSG(1, (TEXT("BAK : HKEY_CURRENT_USER//%s key doesn't exist!/r/n"), szregRootKey));
  89. }
  90. }
  91. // uninitialize the backlight
  92. void BL_Deinit()
  93. {
  94. int i;
  95. RETAILMSG(1, (TEXT("BAK : BL_Deinit!/r/n")));
  96. //  Clean up
  97. for(i=0; i<NUM_EVENTS; i++) {
  98. if(g_evtSignal[i]) {
  99. CloseHandle(g_evtSignal[i]);
  100. }
  101. }
  102. }
  103. //
  104. // initialize the backlight
  105. //
  106. BOOL BL_Init()
  107. {
  108. //  Set up all the events we need.
  109. g_evtSignal[0] = CreateEvent(NULL, FALSE, FALSE, szevtBacklightChange);
  110. g_evtSignal[1] = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
  111. g_evtSignal[BL_POWEREVT] = CreateEvent(NULL, FALSE, FALSE, szevtPowerChanged);
  112. if(!g_evtSignal[0] || !g_evtSignal[1] || !g_evtSignal[2]) {
  113. BL_Deinit();
  114. return FALSE;
  115. }
  116. DEBUGMSG (1,(TEXT("BL_Init()  and  SetGPIO/n/r")));
  117. return TRUE;
  118. }
  119. //
  120. //  find out if AC power is plugged in
  121. //
  122. BOOL IsACOn()
  123. {
  124. //    if (g_pDriverGlobals->power.ACLineStatus == AC_LINE_ONLINE)
  125. //      return TRUE;
  126. //    else
  127. return FALSE;
  128. }
  129. //
  130. // turn on/off the backlight
  131. //
  132. void BL_On(BOOL bOn)
  133. {
  134. if(bOn) {
  135. if (g_BLInfo.m_dwStatus != BL_ON)
  136. {
  137. g_BLInfo.m_dwStatus = BL_ON;
  138. v_pIOPregs->rGPBDAT&=0x6FF;//打开LED
  139. RETAILMSG(1,(TEXT("!!!!!!!!!!!! BACKLIGHT ON !!!!!!!!!!!!/r/n")));
  140. }
  141. }
  142. else {
  143. if (g_BLInfo.m_dwStatus != BL_OFF)
  144. {
  145. g_BLInfo.m_dwStatus = BL_OFF;
  146. v_pIOPregs->rGPBDAT|=0x100;//关闭LED
  147. RETAILMSG(1,(TEXT("!!!!!!!!!!!! BACKLIGHT OFF !!!!!!!!!!!!/r/n")));
  148. }
  149. }
  150. }
  151. //
  152. // restore power to the backlight
  153. //
  154. void BL_PowerOn(BOOL bInit)
  155. {
  156. //
  157. //  Add power-on GPIO register setting
  158. //
  159. BL_On(TRUE);
  160. }
  161. // The backlight handling is done by a thread, which monitors those
  162. // three event and performs some actions based on the parameters specified
  163. // in HKLM/ControlPanel/Backlight
  164. //
  165. // backlight service thread
  166. //
  167. DWORD BL_MonitorThread(PVOID pParms)
  168. {
  169. DWORD   dwResult;
  170. DWORD   dwTimeout;
  171. //  Initialization stuff is here
  172. //
  173. //  Initialize the events
  174. //  Initialize the BLInfo data structure
  175. //  Those are default values. Modify them if necessary
  176. g_BLInfo.m_bACAuto = TRUE;
  177. g_BLInfo.m_bBatteryAuto = TRUE;
  178. g_BLInfo.m_dwBatteryTimeout = 20;   // 20 Seconds
  179. g_BLInfo.m_dwACTimeout = 60;       // 1 minutes
  180. //  Now read from the registry to see what they say
  181. BL_ReadRegistry(&g_BLInfo);
  182. //  Initialize BL
  183. if(!BL_Init()) {
  184. RETAILMSG(1, (TEXT("BL_Init() Failed! Exit from BL_MonitorThread!/r/n")));
  185. return 0;
  186. }
  187. while(1) {
  188. __try {
  189. //  If we are using AC now, use m_dwACTimeout as the timeout
  190. //  otherwise, use m_dwBatteryTimeout
  191. if(IsACOn()) {
  192. dwTimeout = g_BLInfo.m_dwACTimeout * 1000;
  193. }
  194. else {
  195. dwTimeout = g_BLInfo.m_dwBatteryTimeout * 1000;
  196. }
  197. //  However, if user wants BL on all the time, we have to let him
  198. //  do that. Or if we come back here, and BL is off, we want to
  199. //  put this thread to sleep until other event happens.
  200. if(dwTimeout == 0 || g_BLInfo.m_dwStatus == BL_OFF) {
  201. dwTimeout = INFINITE;
  202. }
  203. //  Now let's wait for either there is an update on registry, or
  204. //  there is user action on the device, or there is activity on
  205. //  AC power supply.
  206. dwResult = WaitForMultipleObjects(NUM_EVENTS, &g_evtSignal[0], FALSE, dwTimeout);
  207. //  If we are signaled by registry event
  208. if(WAIT_OBJECT_0 == dwResult) {
  209. //  All we need to do is to read from registry and update the tick count
  210. BL_ReadRegistry(&g_BLInfo);
  211. RETAILMSG(1, (TEXT("BackLightChangeEvent! m_dwACTimeout=%d, m_dwBatteryTimeout=%d/r/n"),g_BLInfo.m_dwACTimeout,g_BLInfo.m_dwBatteryTimeout));
  212. //  Always turn on the Backlight after a change to registry
  213. BL_On(TRUE);
  214. }
  215. else if(dwResult == WAIT_OBJECT_0+1) {
  216. //  User activity, depending on the situation, we may / may not update
  217. //  the tick count
  218. //RETAILMSG(1, (TEXT("2...WAIT_OBJECT_0+1!/r/n")));
  219. if(IsACOn()) {
  220. if(g_BLInfo.m_bACAuto) {
  221. //  Turn on backlight
  222. BL_On(TRUE);
  223. }
  224. }
  225. else {
  226. if(g_BLInfo.m_bBatteryAuto) {
  227. BL_On(TRUE);
  228. }
  229. }
  230. }
  231. else if(dwResult == WAIT_OBJECT_0+2) {
  232. //  When AC is plugged or un-plugged, we don't really need to do anything
  233. //  We continue the loop. The correct timeout value will be assigned at
  234. //  the top of the while loop.
  235. RETAILMSG(1, (TEXT("BackLight Thread: power changed!/r/n")));
  236. }
  237. else if(dwResult == WAIT_TIMEOUT) {
  238. //  Time out, let's turn the device off
  239. RETAILMSG(1, (TEXT("Timeout, turn off the backlight!/r/n")));
  240. BL_On(FALSE);
  241. }
  242. }
  243. __except(EXCEPTION_EXECUTE_HANDLER){
  244. // do nothing
  245. RETAILMSG(1, (TEXT("an exception is raised in BL_MonitorThread... /r/n")));
  246. }
  247. }
  248. }

Win CE5.0背光驱动相关推荐

  1. 基于WINCE6.0+S3C6410的背光驱动

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  2. usb 3.0 linux 驱动下载,usb3.0驱动下载-usb3.0驱动官方驱动下载「win xp|7|8」-华军软件园...

    usb3.0驱动,一款可以驱动usb 3.0设备,能够适应于大部份主板,是目前网络上最好用的usb3.0万能驱动.USB3.0万能驱动是可以帮助我们解决USB3.0接口和电脑之间无法正常通讯的问题,适 ...

  3. WINCE基于PWM实现的背光驱动

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  4. imx6背光驱动调试

    1.内核配置pwm背光驱动 make menuconfig: Device Driver ---> Graphics support ---> [*] Backlight & LC ...

  5. lcd背光节能matlab代码,【技术分享】LCD背光驱动节电技术-LABC/CABC

    LCD背光驱动节电技术-LABC/CABC 图像永远是最直观的表现方式,而LCD正是目前应用最多的表现媒介.随着技术的增强,人类对视觉的要求不断提高,对图像的分辨率.色彩的要求也越来越高. 我们的手机 ...

  6. 高通LCD的pwm背光驱动

    发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭:测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平: 根据原理图: mpp是什么? ...

  7. Android 功耗(19)---LCD背光驱动节电技术-LABC/CABC

    LCD背光驱动节电技术-LABC/CABC LCD背光驱动节电技术-LABC/CABC 图像永远是最直观的表现方式,而LCD正是目前应用最多的表现媒介.随着技术的增强,人类对视觉的要求不断提高,对图像 ...

  8. android 9.0背光调节流程

    1.背光服务框架 如下图是背光框架层图 2.UML时序图 这里主要标出的是各个服务或者框架层之间连接的api,中间会省略一些调用流程. 如下图,PowerManagerService会监听Settin ...

  9. LCD背光驱动 --Backlight

    显示屏按其显示原理大致可分为CRT(显像管).LCD(液晶)及OLED三类,从市场应用看,手机中使用的显示屏主流是LCD,OLED只在翻盖机的小屏中占有少量份额,而CRT在手机中没有用到.       ...

最新文章

  1. 一些今天看到的好句子
  2. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 命令行中获取要调试的应用进程的 PID | 进程注入调试进程内存的 so 库 )
  3. hspice2014安装教程
  4. linux fedora35设置双系统开机启动顺序
  5. JavaScript实现使用DisjointSet 检测无向循环算法(附完整源码)
  6. 自写网站入门阶段之一:熟悉各种标签的运用
  7. 突发!HashiCorp禁止在中国使用企业版VAULT软件
  8. ECstore报表不显示解决
  9. c语言中语句作用,学习C语言的用途~
  10. anime studio的本质特性
  11. mysql建表影响效率_关于MySQL建表对DML的影响【转】
  12. 大数据治理平台有哪些价值
  13. Centos6.9如何安装vsftp
  14. python中高阶函数与装饰器(3)
  15. Vivado 使用方法
  16. 简单版,客户端和服务端使用websocket进行连接通信
  17. 零信任大风已起,网络安全理念重塑,百亿市场空间有望开启
  18. 巴比特 | 元宇宙每日必读:蒂芙尼宣布推出限量版 CryptoPunk 定制吊坠
  19. 用python写一段计算autocad多段线长度的代码
  20. MyEclipse使用教程——使用DevStyle Icon Designer(二)

热门文章

  1. 03.好客租房------初始化项目[本系列必学章节]
  2. 烟草行业IT规划现状、实施及工作重点分析
  3. xshell5不能用必须应用到最新的更新或使用新版本
  4. 【Python量化】VaR在险价值的计算
  5. jenkins安装和配置(一):ubuntu 20.04 jenkins安装
  6. 位图算法BitMap
  7. amber分子动力学模拟干货总结
  8. 执行rpm -Uvh xxxxxx.rpm, 报freely redistributed under the terms of the GNU GPL
  9. 区块链100讲:如何使用开发环境命令行注册EOS靓号及变更EOS账号的active key和owner key?
  10. th_TH是什么意思?