4479|6

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

win ce5.0如何实现一个简单的背光驱动,假设一个GPIO的高低电平控制为LCD的背光控制。 [复制链接]

暂且不说I2C方式对LCD背光的控制。我发现开发板的串口在空闲的状态下(没有任何操作)每隔1分钟(根据系统的设定)就打印“SetDevicePower: Wrong Return Value from 'dsk1:', returning ERROR_GEN_FAILURE”感觉内核是通过SetDevicePower控制LCD的背光的。但我不是很明白SetDevicePower函数是连接驱动的哪一个函数控制的。
好像SMDK2440\DRIVERS\backlite目录下是背光的驱动程序,但我找不到相关的控制函数。
请高手指点,假设一个GPIO的高低电平控制为LCD的背光控制。如何实现一个简单的背光驱动。

附SMDK2440\DRIVERS\backlite目录下驱动,
bak_hw.cpp文件:

  1. #include
  2. #include

  3. #include
  4. #include "s2440.h"
  5. #include
  6. #include "oalintr.h"
  7. #include "drv_glob.h"
  8. #include "pmplatform.h"
  9. #include "bak_hw.h"


  10. //  Globals
  11. const TCHAR szevtBacklightChange[] = TEXT("BackLightChangeEvent");
  12. const TCHAR szevtPowerChanged[] = TEXT("PowerChangedEvent");
  13. const TCHAR szevtUserInput[] = TEXT("UserInputEvent");


  14. const TCHAR szregRootKey[] = TEXT("ControlPanel\\Backlight");
  15. const TCHAR szregBatteryTimeout[] = TEXT("BatteryTimeout");
  16. const TCHAR szregACTimeout[] = TEXT("ACTimeout");
  17. const TCHAR szregBatteryAuto[] = TEXT("BacklightOnTap");
  18. const TCHAR szregACAuto[] = TEXT("ACBacklightOnTap");

  19. HANDLE   g_evtSignal[NUM_EVENTS];


  20. //  Global structure
  21. BLStruct g_BLInfo;

  22. //
  23. // Perform all one-time initialization of the backlight
  24. //
  25. BOOL
  26. BacklightInitialize()
  27. {
  28.     BOOL    bRet = TRUE;

  29.     RETAILMSG(1, (TEXT("BacklightInitialize\r\n")));

  30.         BL_PowerOn(TRUE);

  31.     return bRet;
  32. }


  33. //  Utility function to read from registry for the parameters
  34. void BL_ReadRegistry(BLStruct *pBLInfo)
  35. {
  36.     HKEY    hKey;
  37.     LONG    lResult;
  38.     DWORD   dwType;
  39.     DWORD   dwVal;
  40.     DWORD   dwLen;

  41.     lResult = RegOpenKeyEx(HKEY_CURRENT_USER, szregRootKey, 0, KEY_ALL_ACCESS, &hKey);
  42.     if(ERROR_SUCCESS == lResult) {
  43.         dwType = REG_DWORD;
  44.         dwLen = sizeof(DWORD);

  45.         lResult = RegQueryValueEx(hKey, szregBatteryTimeout, NULL, &dwType,
  46.                                   (LPBYTE)&dwVal, &dwLen);
  47.         if(ERROR_SUCCESS == lResult) {
  48.             pBLInfo->m_dwBatteryTimeout = dwVal;
  49.         }

  50.         lResult = RegQueryValueEx(hKey, szregACTimeout, NULL, &dwType, (LPBYTE)&dwVal,
  51.                                   &dwLen);
  52.         if(ERROR_SUCCESS == lResult) {
  53.             pBLInfo->m_dwACTimeout = dwVal;
  54.         }

  55.         lResult = RegQueryValueEx(hKey, szregBatteryAuto, NULL, &dwType, (LPBYTE)&dwVal,
  56.                                   &dwLen);
  57.         if(ERROR_SUCCESS == lResult) {
  58.             pBLInfo->m_bBatteryAuto = (BOOL) dwVal;
  59.         }

  60.         lResult = RegQueryValueEx(hKey, szregACAuto, NULL, &dwType, (LPBYTE)&dwVal,
  61.                                   &dwLen);
  62.         if(ERROR_SUCCESS == lResult) {
  63.             pBLInfo->m_bACAuto = (BOOL) dwVal;
  64.         }

  65.         RegCloseKey(hKey);
  66.     }
  67.     else {
  68.         RETAILMSG(1, (TEXT("BAK : HKEY_CURRENT_USER\\%s key doesn't exist!\r\n"), szregRootKey));
  69.     }
  70. }


  71. // uninitialize the backlight
  72. void BL_Deinit()
  73. {
  74.     int i;

  75.         RETAILMSG(1, (TEXT("BAK : BL_Deinit!\r\n")));
  76.     //  Clean up
  77.     for(i=0; i
  78.         if(g_evtSignal[i]) {
  79.             CloseHandle(g_evtSignal[i]);
  80.         }
  81.     }
  82. }


  83. //
  84. // initialize the backlight
  85. //
  86. BOOL BL_Init()
  87. {
  88.     //  Set up all the events we need.
  89.     g_evtSignal[0] = CreateEvent(NULL, FALSE, FALSE, szevtBacklightChange);
  90.     g_evtSignal[1] = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
  91.     g_evtSignal[BL_POWEREVT] = CreateEvent(NULL, FALSE, FALSE, szevtPowerChanged);

  92.     if(!g_evtSignal[0] || !g_evtSignal[1] || !g_evtSignal[2]) {
  93.         BL_Deinit();
  94.         return FALSE;
  95.     }
  96.     return TRUE;
  97. }


  98. //
  99. //  find out if AC power is plugged in
  100. //
  101. BOOL IsACOn()
  102. {
  103. //    if (g_pDriverGlobals->power.ACLineStatus == AC_LINE_ONLINE)
  104. //                return TRUE;
  105. //    else
  106.                 return FALSE;
  107. }


  108. //
  109. // turn on/off the backlight
  110. //
  111. void BL_On(BOOL bOn)
  112. {
  113.     if(bOn) {
  114.                 if (g_BLInfo.m_dwStatus != BL_ON)
  115.                 {
  116.                         g_BLInfo.m_dwStatus = BL_ON;
  117.                         RETAILMSG(1,(TEXT("!!!!!!!!!!!! BACKLIGHT ON !!!!!!!!!!!!\r\n")));
  118.                 }
  119.     }
  120.     else {
  121.                 if (g_BLInfo.m_dwStatus != BL_OFF)
  122.                 {
  123.                         g_BLInfo.m_dwStatus = BL_OFF;
  124.                         RETAILMSG(1,(TEXT("!!!!!!!!!!!! BACKLIGHT OFF !!!!!!!!!!!!\r\n")));
  125.                 }
  126.     }
  127. }


  128. //
  129. // restore power to the backlight
  130. //
  131. void BL_PowerOn(BOOL bInit)
  132. {
  133.     //
  134.     //  Add power-on GPIO register setting
  135.     //

  136.     BL_On(TRUE);
  137. }


  138. // The backlight handling is done by a thread, which monitors those
  139. // three event and performs some actions based on the parameters specified
  140. // in HKLM/ControlPanel/Backlight
  141. //
  142. // backlight service thread
  143. //
  144. DWORD BL_MonitorThread(PVOID pParms)
  145. {
  146.     DWORD   dwResult;
  147.     DWORD   dwTimeout;
  148.    
  149.     //  Initialization stuff is here
  150.     //
  151.     //  Initialize the events
  152.     //  Initialize the BLInfo data structure
  153.     //  Those are default values. Modify them if necessary
  154.     g_BLInfo.m_bACAuto = TRUE;
  155.     g_BLInfo.m_bBatteryAuto = TRUE;
  156.     g_BLInfo.m_dwBatteryTimeout = 20;   // 20 Seconds
  157.     g_BLInfo.m_dwACTimeout = 60;       // 1 minutes

  158.     //  Now read from the registry to see what they say
  159.     BL_ReadRegistry(&g_BLInfo);

  160.     //  Initialize BL
  161.     if(!BL_Init()) {
  162.         RETAILMSG(1, (TEXT("BL_Init() Failed! Exit from BL_MonitorThread!\r\n")));
  163.         return 0;
  164.     }
  165.     while(1) {
  166.                 __try {
  167.                         //  If we are using AC now, use m_dwACTimeout as the timeout
  168.                         //  otherwise, use m_dwBatteryTimeout
  169.                         if(IsACOn()) {
  170.                                 dwTimeout = g_BLInfo.m_dwACTimeout * 1000;
  171.                         }
  172.                         else {
  173.                                 dwTimeout = g_BLInfo.m_dwBatteryTimeout * 1000;
  174.                         }

  175.                         //  However, if user wants BL on all the time, we have to let him
  176.                         //  do that. Or if we come back here, and BL is off, we want to
  177.                         //  put this thread to sleep until other event happens.
  178.                         if(dwTimeout == 0 || g_BLInfo.m_dwStatus == BL_OFF) {
  179.                                 dwTimeout = INFINITE;
  180.                         }

  181.                         //  Now let's wait for either there is an update on registry, or
  182.                         //  there is user action on the device, or there is activity on
  183.                         //  AC power supply.
  184.                         dwResult = WaitForMultipleObjects(NUM_EVENTS, &g_evtSignal[0], FALSE, dwTimeout);

  185.                         //  If we are signaled by registry event
  186.                         if(WAIT_OBJECT_0 == dwResult) {
  187.                                 //  All we need to do is to read from registry and update the tick count
  188.                                 BL_ReadRegistry(&g_BLInfo);

  189.                                 //  Always turn on the Backlight after a change to registry
  190.                                 BL_On(TRUE);
  191.                         }
  192.                         else if(dwResult == WAIT_OBJECT_0+1) {
  193.                                 //  User activity, depending on the situation, we may / may not update
  194.                                 //  the tick count

  195.                                 if(IsACOn()) {
  196.                                         if(g_BLInfo.m_bACAuto) {
  197.                                                 //  Turn on backlight
  198.                                                 BL_On(TRUE);
  199.                                         }
  200.                                 }
  201.                                 else {
  202.                                         if(g_BLInfo.m_bBatteryAuto) {
  203.                                                 BL_On(TRUE);
  204.                                         }
  205.                                 }  
  206.                         }
  207.                         else if(dwResult == WAIT_OBJECT_0+2) {
  208.                                 //  When AC is plugged or un-plugged, we don't really need to do anything
  209.                                 //  We continue the loop. The correct timeout value will be assigned at
  210.                                 //  the top of the while loop.
  211.                                 RETAILMSG(1, (TEXT("BackLight Thread: power changed!\r\n")));
  212.                         }
  213.                         else if(dwResult == WAIT_TIMEOUT) {
  214.                                 //  Time out, let's turn the device off
  215.                                 RETAILMSG(1, (TEXT("Timeout, turn off the backlight!\r\n")));
  216.                                 BL_On(FALSE);
  217.                         }
  218.                 }
  219.                 __except(EXCEPTION_EXECUTE_HANDLER){
  220.                         // do nothing
  221.                         RETAILMSG(1, (TEXT("an exception is raised in BL_MonitorThread... \r\n")));
  222.                 }
  223.         }
  224. }
复制代码


最新回复

谢谢各位的回答,我找到原因了。有键盘鼠标或触摸屏输入时候gwes 发送“PowerManager/ActivityTimer/UserActivity” event而不是上面的“("UserInputEvent");”  详情 回复 发表于 2008-7-22 21:47
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
bak_io.cpp文件。
  1. #include
  2. #include
  3. #include "pmplatform.h"
  4. #include "bak_hw.h"



  5. //  Global structure
  6. extern BLStruct g_BLInfo;
  7. extern HANDLE   g_evtSignal[NUM_EVENTS];

  8. DWORD
  9. BAK_Init(DWORD dwContext)
  10. {
  11.         HANDLE  hThread;
  12.         DWORD   dwThreadID;
  13.        
  14.         RETAILMSG(1, (TEXT("BAK_Init: dwContext = 0x%x\r\n"), dwContext));

  15.         // Perform all one-time initialization of the backlight
  16.         if (!BacklightInitialize())
  17.         {
  18.                 RETAILMSG(1, (TEXT("BAK_Init:couldn't initialize backlight hardware \r\n")));
  19.                 return 0;
  20.         }

  21.         // Create the backlight service thread
  22.         hThread = CreateThread(NULL, 0, BL_MonitorThread, NULL, 0, &dwThreadID);
  23.         if (hThread == NULL)
  24.         {
  25.                 RETAILMSG(1, (TEXT("BAK_Init: failed to create BL_MonitorThread\r\n")));
  26.                 return 0;
  27.         }

  28.         return dwThreadID;
  29. }



  30. BOOL
  31. BAK_Deinit(DWORD dwContext)
  32. {
  33.         BL_Deinit();
  34.     return TRUE;
  35. }



  36. DWORD
  37. BAK_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
  38. {
  39.         return dwData;
  40. }



  41. BOOL
  42. BAK_Close(DWORD Handle)
  43. {
  44.     return TRUE;
  45. }



  46. void
  47. BAK_PowerDown(void)
  48. {
  49.     BL_On(FALSE);
  50. }



  51. void
  52. BAK_PowerUp(void)
  53. {
  54.         BL_PowerOn(TRUE);
  55. }



  56. DWORD
  57. BAK_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
  58. {
  59.         return 0;
  60. }



  61. DWORD
  62. BAK_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
  63. {
  64.         return 0;
  65. }



  66. DWORD
  67. BAK_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
  68. {
  69.         return (DWORD) -1;
  70. }



  71. BOOL
  72. BAK_IOControl(
  73.                           DWORD Handle,
  74.                           DWORD dwCode,
  75.                           PBYTE pBufIn,
  76.                           DWORD dwLenIn,
  77.                           PBYTE pBufOut,
  78.                           DWORD dwLenOut,
  79.                           PDWORD pdwActualOut
  80.                           )
  81. {
  82.     BOOL RetVal = TRUE;
  83.     DWORD dwErr = ERROR_SUCCESS;   

  84.     switch (dwCode)
  85.         {
  86.                 RETAILMSG(1, (TEXT("BAK_IOControl: Handle = 0x%x, dwCode = 0x%x\r\n"), Handle, dwCode));
  87.                 RETAILMSG(1, (TEXT("               pBufIn = 0x%x, dwLenIn = 0x%x\r\n"), pBufIn, dwLenIn));
  88.                 RETAILMSG(1, (TEXT("               pOutBuf = 0x%x, dwLenOut = 0x%x\r\n"), pBufOut, dwLenOut));
  89.                 RETAILMSG(1, (TEXT("               pdwActualOut = 0x%x\r\n"), pdwActualOut));
  90.         //
  91.         // Power Management
  92.         //
  93.                 case IOCTL_POWER_CAPABILITIES:
  94.         {
  95.             PPOWER_CAPABILITIES ppc;
  96.                         RETAILMSG(1, (TEXT("BAK: IOCTL_POWER_CAPABILITIES\r\n")));   
  97.             
  98.                         if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(POWER_CAPABILITIES)) ) {
  99.                 RetVal = FALSE;
  100.                 dwErr = ERROR_INVALID_PARAMETER;
  101.                 break;
  102.             }
  103.                        
  104.             ppc = (PPOWER_CAPABILITIES)pBufOut;
  105.             
  106.             memset(ppc, 0, sizeof(POWER_CAPABILITIES));

  107.             // support D0, D4
  108.             ppc->DeviceDx = 0x11;

  109.             // Report our power consumption in uAmps rather than mWatts.
  110.             ppc->Flags = POWER_CAP_PREFIX_MICRO | POWER_CAP_UNIT_AMPS;
  111.             
  112.                         // 25 m = 25000 uA
  113.             // TODO: find out a more accurate value
  114.                         ppc->Power[D0] = 25000;
  115.             
  116.             *pdwActualOut = sizeof(POWER_CAPABILITIES);
  117.         } break;

  118.                 case IOCTL_POWER_SET:
  119.         {
  120.             CEDEVICE_POWER_STATE NewDx;

  121.             if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(CEDEVICE_POWER_STATE)) ) {
  122.                 RetVal = FALSE;
  123.                 dwErr = ERROR_INVALID_PARAMETER;
  124.                 break;
  125.             }
  126.             
  127.             NewDx = *(PCEDEVICE_POWER_STATE)pBufOut;

  128.             if ( VALID_DX(NewDx) ) {
  129.                 switch ( NewDx ) {
  130.                 case D0:
  131.                     //  Power changed, we need to notify the monitor thread to resync
  132.                     //  the timer
  133.                     SetEvent(g_evtSignal[BL_POWEREVT]);
  134.                     BL_On(TRUE);
  135.                     break;

  136.                 default:
  137.                     BL_On(FALSE);
  138.                     break;
  139.                 }

  140.                 RETAILMSG(1, (TEXT("BAK: IOCTL_POWER_SET: D%u \r\n"), NewDx));

  141.                 *pdwActualOut = sizeof(CEDEVICE_POWER_STATE);
  142.             } else {
  143.                 RetVal = FALSE;
  144.                 dwErr = ERROR_INVALID_PARAMETER;
  145.             }
  146.             
  147.         } break;

  148.         case IOCTL_POWER_GET:
  149.             if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(CEDEVICE_POWER_STATE)) ) {
  150.                 RetVal = FALSE;
  151.                 dwErr = ERROR_INVALID_PARAMETER;
  152.                 break;
  153.             }

  154.                         CEDEVICE_POWER_STATE Dx;


  155.                         if (g_BLInfo.m_dwStatus == BL_ON){
  156.                                 Dx = D4;
  157.                         }
  158.                         else {
  159.                                 Dx = D0;
  160.                         }

  161.                         *(PCEDEVICE_POWER_STATE)pBufOut = Dx;
  162.             RETAILMSG(1, (TEXT("USB_SER: IOCTL_POWER_GET: D%u \r\n"), Dx));

  163.             *pdwActualOut = sizeof(CEDEVICE_POWER_STATE);
  164.                 break;

  165.                 default:
  166.             RetVal = FALSE;
  167.             RETAILMSG(1, (TEXT(" Unsupported ioctl 0x%X\r\n"), dwCode));
  168.             break;
  169.         }
  170.        
  171.         return(RetVal);
  172. }



  173. BOOL
  174. WINAPI
  175. DllMain(
  176.     HANDLE  hinstDll,
  177.     DWORD   dwReason,
  178.     LPVOID  lpReserved
  179.     )
  180. {
  181.         switch(dwReason)
  182.         {
  183.                 case DLL_PROCESS_ATTACH:
  184.                         // RETAILMSG(1, (TEXT("BAK_DllMain: DLL_PROCESS_ATTACH\r\n")));
  185.                         break;

  186.                 case DLL_PROCESS_DETACH:
  187.                         // RETAILMSG(1, (TEXT("BAK_DllMain: DLL_PROCESS_DETACH\r\n")));
  188.                         break;
  189.     }
  190.     return TRUE;
  191. }
复制代码
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你好好读一下代码吧,BL_MonitorThread函数里面已经实现了这个功能,只需要你把BL_ON等这些和硬件有关的函数补充完整就可以了。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
我在注册表中添加如下函数的时候,开机时确实可以打印"!!!!!!!!!!!! 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}"  
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
待机甚至睡眠情况下,点击触摸屏或者移动鼠标无法响应,是电源管理里面的“唤醒设置”,而不是背光相关的设置。
就是说必须允许你希望的动作能唤醒机器。就好像在Windows下,屏保了,你晃鼠标或者按键盘都能停了屏保,但是如果Windows配置不让这两个动作停止屏保,那你就没辙了。
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

6
 
你好好分析以下这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);

尤其是第二个。

其实很简单了,点击触摸屏或者按键的时候,你让这个Event为有信号状态,不就可以了。具体怎么做,不用我说了吧。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢各位的回答,我找到原因了。有键盘鼠标或触摸屏输入时候gwes 发送“PowerManager/ActivityTimer/UserActivity” event而不是上面的“("UserInputEvent");”
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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