bkldrvmain.cpp
来自「该BSP是基于PXA270+WINCE的BSP」· C++ 代码 · 共 621 行 · 第 1/2 页
CPP
621 行
//
// 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.
//
//
//------------------------------------------------------------------------------
//
// File: bkldrvmain.c
//
// Backlight driver source code
//
#include <windows.h>
#include <windev.h>
#include <pnp.h>
#include <pm.h>
#include <strsafe.h>
#include "BKLi.h"
#include "BKLPDD.h"
DBGPARAM dpCurSettings = {
TEXT("backlight"), {
TEXT("Backlight"), TEXT("Function"), TEXT("Misc"), TEXT(""),
TEXT(""), TEXT(""), TEXT(""), TEXT(""),
TEXT(""), TEXT(""), TEXT(""), TEXT(""),
TEXT(""), TEXT(""), TEXT("Warning"), TEXT("Error"),
},
0xC001
};
#define BACKLIGHT_REGKEY TEXT("ControlPanel\\Backlight")
#define BKL_EVENT_REG 0 // registry change
#define BKL_EVENT_POWER_MSG 1 // power status change
#define BKL_EVENT_EXIT 2 // we're exiting
#define BKL_EVENT_DISPLAY_MSG 3 // display device notification
#define BKL_NUM_EVENTS 4
#define TURNOFFIMMEDIATELY -1
// device notification queue parameters
#define PNP_QUEUE_ENTRIES 1 // assumes we have only 1 display driver interface being advertised
//"The notifications sent to hMsgQ are a sequence of DEVDETAIL structures
//with extra TCHAR types appended to account for the instance names":
#define PNP_QUEUE_SIZE (PNP_QUEUE_ENTRIES * (sizeof(DEVDETAIL) + (MAX_NAMELEN * sizeof(TCHAR))))
static const UCHAR DeviceStateMasks[5]={
DX_MASK(D0),
DX_MASK(D1),
DX_MASK(D2),
DX_MASK(D3),
DX_MASK(D4),
};
BOOL ConvertStringToGuid(LPCTSTR GuidString, GUID *Guid )
{
// ConvertStringToGuid
// this routine converts a string into a GUID and returns TRUE if the
// conversion was successful.
// Local variables.
UINT Data4[8];
int Count;
BOOL Ok = FALSE;
LPWSTR GuidFormat = L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}";
DEBUGCHK(Guid != NULL && GuidString != NULL);
__try
{
if (_stscanf(GuidString, GuidFormat, &Guid->Data1,
&Guid->Data2, &Guid->Data3, &Data4[0], &Data4[1], &Data4[2], &Data4[3],
&Data4[4], &Data4[5], &Data4[6], &Data4[7]) == 11) {
for (Count = 0; Count < (sizeof(Data4) / sizeof(Data4[0])); Count++) {
Guid->Data4[Count] = (UCHAR) Data4[Count];
}
}
Ok = TRUE;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
RETAILMSG(ZONE_ERROR, (TEXT("exception in convertstringtoguid\r\n")));
}
return Ok;
}
void UpdateACStatus(BKL_MDD_INFO *pBKLinfo)
{
SYSTEM_POWER_STATUS_EX2 SysPower;
static fFirstTime = TRUE;
// make sure that GWES APIs ready before calling:
while (TRUE)
{
if (IsAPIReady(SH_GDI))
{
break;
}
Sleep(100);
}
if (pBKLinfo->pfnGetSystemPowerStatusEx2)
{
if ((*pBKLinfo->pfnGetSystemPowerStatusEx2)(&SysPower, sizeof(SysPower), FALSE))
{
if (SysPower.ACLineStatus & AC_LINE_ONLINE)
{
pBKLinfo->fOnAC = TRUE;
}
else
{
pBKLinfo->fOnAC = FALSE;
}
}
else
{
RETAILMSG(ZONE_ERROR, (TEXT("GetSystemPowerStstusEx2 failed with error 0x%x.\r\n"), GetLastError()));
}
}
else
{
// There are no battery APIs so assume that we are always on AC power.
pBKLinfo->fOnAC = TRUE;
}
return;
}
/*
A driver that is issued a request to enter a power state not supported by its device
enters the next available power state supported.
For example, if the Power Manager requests that it enter D2 and does not support D2,
the device can enter D3 or D4 instead.
If a device is requested to enter D3 and cannot wake up the system then
it should enter D4 and power off rather than staying in standby
All drivers must support at least D0
Note: since the default PDA power manager will never ask a driver to go to a state
that the driver has reported it supports, most of this code will never be called.
The code could be made more efficient (no branching) if deemed necessary
*/
BOOL GetBestSupportedState(BKL_MDD_INFO *pBKLinfo, CEDEVICE_POWER_STATE ReqDx, CEDEVICE_POWER_STATE* SetDx)
{
BOOL fRet = TRUE; // assume there's a suitable state we can go to
switch(ReqDx)
{
case D0:
*SetDx = D0;
break;
case D1:
if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D1])
{
*SetDx = D1;
}
else if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D2])
{
*SetDx = D2;
}
else if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D3])
{
*SetDx = D3;
}
else if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D4])
{
*SetDx = D4;
}
else
{
fRet = FALSE;
}
break;
case D2:
if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D2])
{
*SetDx = D2;
}
else if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D3])
{
*SetDx = D3;
}
else if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D4])
{
*SetDx = D4;
}
else
{
fRet = FALSE;
}
break;
case D3:
if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D3])
{
*SetDx = D3;
}
else if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D4])
{
*SetDx = D4;
}
else
{
fRet = FALSE;
}
break;
case D4:
if(pBKLinfo->ucSupportedStatesMask & DeviceStateMasks[D4])
{
*SetDx = D4;
}
else
{
fRet = FALSE;
}
break;
default:
ASSERT(FALSE);
break;
}
return fRet;
}
/*
Has the user checked the 'turn on when key pressed...' option for the current power status?
*/
BOOL IsTapOn(BKL_MDD_INFO *pBKLinfo)
{
if(pBKLinfo->fOnAC)
{
return (pBKLinfo->fExternalTapOn? TRUE : FALSE);
}
else
{
return (pBKLinfo->fBatteryTapOn? TRUE : FALSE);
}
}
DWORD GetTimeout(BKL_MDD_INFO *pBKLinfo)
{
if(pBKLinfo->fOnAC)
{
return pBKLinfo->dwACTimeout;
}
else
{
return pBKLinfo->dwBattTimeout;
}
}
/*
Reads the 'turn on when key pressed...' registry settings from the registry
*/
void BacklightUpdateMDDRegSettings(BKL_MDD_INFO *pBKLinfo)
{
DWORD retCode;
BYTE ValueData[MAX_PATH];
DWORD dwType;
void *bData = ValueData;
DWORD cbData;
HKEY hKey;
DEBUGMSG(ZONE_BACKLIGHT,(TEXT("+BacklightReadMDDReg\r\n")));
retCode = RegOpenKeyEx (HKEY_CURRENT_USER, BACKLIGHT_REGKEY, 0, KEY_ALL_ACCESS, &hKey);
if (retCode == ERROR_SUCCESS)
{
//Battery Tap
dwType=REG_DWORD;
cbData = MAX_PATH;
retCode = RegQueryValueEx(hKey, TEXT("BacklightOnTap"), NULL, &dwType, (LPBYTE) bData, (LPDWORD)&cbData);
if (retCode == ERROR_SUCCESS)
{
pBKLinfo->fBatteryTapOn = (*(DWORD *)bData );
}
//External Tap
dwType=REG_DWORD;
cbData = MAX_PATH;
retCode = RegQueryValueEx(hKey, TEXT("ACBacklightOnTap"), NULL, &dwType, (LPBYTE) bData, (LPDWORD)&cbData);
if (retCode == ERROR_SUCCESS)
{
pBKLinfo->fExternalTapOn = (*(DWORD *)bData );
}
//Backlight on battery timeout (we may need to turn the backlight off)
dwType=REG_DWORD;
cbData = MAX_PATH;
retCode = RegQueryValueEx(hKey, TEXT("BatteryTimeout"), NULL, &dwType, (LPBYTE) bData, (LPDWORD)&cbData);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?