⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 步骤.txt

📁 在大多2440开发板BSP中的SMDK2440DRIVERSacklite目录下一般都有背光驱动。在注册表中添加如下函数的时候
💻 TXT
字号:
 欢迎访问我的博客http://blog.csdn.net/cy757/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 在大多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文件)。

 

 

// 
// Copyright (c) Microsoft Corporation.  All rights reserved. 
// 
// 
// Use of this source code is subject to the terms of the Microsoft end-user 
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. 
// If you did not accept the terms of the EULA, you are not authorized to use 
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your 
// install media. 
// 
/* 

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
PARTICULAR PURPOSE. 

*/ 

#include <windows.h> 
#include <nkintr.h> 

#include <pm.h> 
#include "s2440.h" 
#include <nkintr.h> 
#include "oalintr.h" 
#include "drv_glob.h" 
#include "pmplatform.h" 
#include "bak_hw.h" 


//  Globals 
const TCHAR szevtBacklightChange[] = TEXT("BackLightChangeEvent"); 
const TCHAR szevtPowerChanged[] = TEXT("PowerChangedEvent"); 
const TCHAR szevtUserInput[] = TEXT("PowerManager/ActivityTimer/UserActivity"); 


const TCHAR szregRootKey[] = TEXT("ControlPanel\\Backlight"); 
const TCHAR szregBatteryTimeout[] = TEXT("BatteryTimeout"); 
const TCHAR szregACTimeout[] = TEXT("ACTimeout"); 
const TCHAR szregBatteryAuto[] = TEXT("BacklightOnTap"); 
const TCHAR szregACAuto[] = TEXT("ACBacklightOnTap"); 

HANDLE   g_evtSignal[NUM_EVENTS]; 
/* GPIO 寄存器对应的虚拟地址 */ 
volatile IOPreg * v_pIOPregs = (IOPreg * )IOP_BASE; 
//  Global structure 
BLStruct g_BLInfo; 

// Perform all one-time initialization of the backlight 
// 
BOOL  
BacklightInitialize() 
{ 
    BOOL    bRet = TRUE; 

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

    BL_PowerOn(TRUE); 

    v_pIOPregs->rGPBCON &=0x3C03FF; 
    v_pIOPregs->rGPBCON |=0x15400; 
    v_pIOPregs->rGPBUP &=0x61F; 
    return bRet; 
} 


//  Utility function to read from registry for the parameters 
void BL_ReadRegistry(BLStruct *pBLInfo) 
{ 
    HKEY    hKey; 
    LONG    lResult; 
    DWORD   dwType; 
    DWORD   dwVal; 
    DWORD   dwLen; 

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

        lResult = RegQueryValueEx(hKey, szregBatteryTimeout, NULL, &dwType,  
                                  (LPBYTE)&dwVal, &dwLen); 
        if(ERROR_SUCCESS == lResult) { 
            pBLInfo->m_dwBatteryTimeout = dwVal; 
        } 

        lResult = RegQueryValueEx(hKey, szregACTimeout, NULL, &dwType, (LPBYTE)&dwVal, 
                                  &dwLen); 
        if(ERROR_SUCCESS == lResult) { 
            pBLInfo->m_dwACTimeout = dwVal; 
        } 

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

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

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


// uninitialize the backlight 
void BL_Deinit() 
{ 
    int i; 

    RETAILMSG(1, (TEXT("BAK : BL_Deinit!\r\n"))); 
    //  Clean up 
    for(i=0; i<NUM_EVENTS; i++) { 
        if(g_evtSignal[i]) { 
            CloseHandle(g_evtSignal[i]); 
        } 
    } 
} 


// 
// initialize the backlight 
// 
BOOL BL_Init() 
{ 
    //  Set up all the events we need.  
    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); 
    if(!g_evtSignal[0] || !g_evtSignal[1] || !g_evtSignal[2]) { 
        BL_Deinit(); 
        return FALSE; 
    } 
    DEBUGMSG (1,(TEXT("BL_Init()  and  SetGPIO\n\r")));  
    return TRUE; 
} 


// 
//  find out if AC power is plugged in 
// 
BOOL IsACOn() 
{ 
//    if (g_pDriverGlobals->power.ACLineStatus == AC_LINE_ONLINE) 
//      return TRUE; 
//    else 
        return FALSE; 
} 


// 
// turn on/off the backlight 
// 
void BL_On(BOOL bOn) 
{ 
    if(bOn) { 
        if (g_BLInfo.m_dwStatus != BL_ON) 
        { 
            g_BLInfo.m_dwStatus = BL_ON; 
            v_pIOPregs->rGPBDAT&=0x6FF;//打开LED 
            RETAILMSG(1,(TEXT("!!!!!!!!!!!! BACKLIGHT ON !!!!!!!!!!!!\r\n"))); 
        } 
    } 
    else { 
        if (g_BLInfo.m_dwStatus != BL_OFF) 
        { 
            g_BLInfo.m_dwStatus = BL_OFF; 
            v_pIOPregs->rGPBDAT|=0x100;//关闭LED 
            RETAILMSG(1,(TEXT("!!!!!!!!!!!! BACKLIGHT OFF !!!!!!!!!!!!\r\n"))); 
        } 
    } 
} 


// 
// restore power to the backlight 
// 
void BL_PowerOn(BOOL bInit) 
{ 
    // 
    //  Add power-on GPIO register setting 
    // 

    BL_On(TRUE); 
} 


// The backlight handling is done by a thread, which monitors those  
// three event and performs some actions based on the parameters specified 
// in HKLM/ControlPanel/Backlight 
// 
// backlight service thread 
// 
DWORD BL_MonitorThread(PVOID pParms) 
{ 
    DWORD   dwResult; 
    DWORD   dwTimeout; 
     
    //  Initialization stuff is here 
    // 
    //  Initialize the events 
    //  Initialize the BLInfo data structure 
    //  Those are default values. Modify them if necessary 
    g_BLInfo.m_bACAuto = TRUE; 
    g_BLInfo.m_bBatteryAuto = TRUE; 
    g_BLInfo.m_dwBatteryTimeout = 20;   // 20 Seconds 
    g_BLInfo.m_dwACTimeout = 60;       // 1 minutes 

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

    //  Initialize BL 
    if(!BL_Init()) { 
        RETAILMSG(1, (TEXT("BL_Init() Failed! Exit from BL_MonitorThread!\r\n"))); 
        return 0; 
    } 
    while(1) { 
        __try {  
            //  If we are using AC now, use m_dwACTimeout as the timeout 
            //  otherwise, use m_dwBatteryTimeout 
            if(IsACOn()) { 
                dwTimeout = g_BLInfo.m_dwACTimeout * 1000; 
            } 
            else { 
                dwTimeout = g_BLInfo.m_dwBatteryTimeout * 1000; 
            } 

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

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

            //  If we are signaled by registry event 
            if(WAIT_OBJECT_0 == dwResult) { 
                //  All we need to do is to read from registry and update the tick count 
                BL_ReadRegistry(&g_BLInfo); 
                RETAILMSG(1, (TEXT("BackLightChangeEvent! m_dwACTimeout=%d, m_dwBatteryTimeout=%d\r\n"),g_BLInfo.m_dwACTimeout,g_BLInfo.m_dwBatteryTimeout)); 
                //  Always turn on the Backlight after a change to registry 
                BL_On(TRUE); 
            } 
            else if(dwResult == WAIT_OBJECT_0+1) { 
                //  User activity, depending on the situation, we may / may not update  
                //  the tick count 
                //RETAILMSG(1, (TEXT("2...WAIT_OBJECT_0+1!\r\n"))); 
                if(IsACOn()) { 
                    if(g_BLInfo.m_bACAuto) { 
                        //  Turn on backlight 
                        BL_On(TRUE); 
                    } 
                } 
                else { 
                    if(g_BLInfo.m_bBatteryAuto) { 
                        BL_On(TRUE); 
                    } 
                }   
            } 
            else if(dwResult == WAIT_OBJECT_0+2) { 
                //  When AC is plugged or un-plugged, we don't really need to do anything 
                //  We continue the loop. The correct timeout value will be assigned at 
                //  the top of the while loop. 
                RETAILMSG(1, (TEXT("BackLight Thread: power changed!\r\n"))); 
            } 
            else if(dwResult == WAIT_TIMEOUT) { 
                //  Time out, let's turn the device off 
                RETAILMSG(1, (TEXT("Timeout, turn off the backlight!\r\n"))); 
                BL_On(FALSE); 
            } 
        } 
        __except(EXCEPTION_EXECUTE_HANDLER){ 
            // do nothing 
            RETAILMSG(1, (TEXT("an exception is raised in BL_MonitorThread... \r\n"))); 
        } 
    } 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -