📄 backlight.cpp
字号:
if(hUserActivityEvent)
CloseHandle(hUserActivityEvent);
DeleteCriticalSection(&cs);
// Do BSP deinitialization
BSPBacklightDeInit();
// the device manager does not check the return code
DEBUGMSG(ZONE_FUNCTION, (TEXT("-BKL_Deinit\r\n"), dwContext));
return TRUE;
}
//------------------------------------------------------------------------------
//
// FUNCTION: BKL_Init
//
// DESCRIPTION:
// PARAMETERS:
//
// RETURNS:
//
//------------------------------------------------------------------------------
extern "C" UINT32 BKL_Init(UINT32 dwContext)
{
SYSTEM_POWER_STATUS_EX status;
MSGQUEUEOPTIONS msgOptions;
HKEY hDriverKey;
DWORD dwStatus;
DWORD dwType;
DWORD dwSize;
DEBUGMSG(ZONE_FUNCTION, (TEXT("BKL_INIT() +!\r\n")) );
InitializeCriticalSection(&cs);
// get our activation information
dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)dwContext, 0, 0, &hDriverKey);
if(dwStatus != ERROR_SUCCESS)
{
DEBUGMSG(ZONE_ERROR, (TEXT("BKL_Init: OpenDeviceKey('%s') failed %u\r\n"), dwContext, dwStatus));
goto InitErrCleanup;
}
else
{
dwSize = sizeof(szName);
dwStatus = RegQueryValueEx(hDriverKey, DEVLOAD_DEVNAME_VALNAME, NULL, &dwType, (LPBYTE) szName, &dwSize);
if(dwStatus != ERROR_SUCCESS || dwType != DEVLOAD_DEVNAME_VALTYPE)
{
DEBUGMSG(ZONE_ERROR, (TEXT("BKL_Init: RegQueryValueEx('%s', '%s') failed %u\r\n"),
dwContext, DEVLOAD_DEVNAME_VALNAME, dwStatus));
RegCloseKey(hDriverKey);
goto InitErrCleanup;
}
DEBUGMSG(ZONE_INIT, (TEXT("device name is '%s'\r\n"), szName));
}
// Get current power status to determine timeout
if(GetSystemPowerStatusEx(&status, TRUE))
{
if(status.ACLineStatus == 1)
fACOnline = TRUE;
else
fACOnline = FALSE;
}
else
{
// Default to battery timeout
fACOnline = FALSE;
}
// Default settings:
// enable backlight timeout, enable backlight on user activity
bklSettings.dwACTimeout = BKL_DEFAULT_TIMEOUT;
bklSettings.dwBattTimeout = BKL_DEFAULT_TIMEOUT;
bklSettings.fBattTimeoutEnable = 1;
bklSettings.fACTimeoutEnable = 1;
bklSettings.fBattBacklightOnUser = 1;
bklSettings.fACBacklightOnUser = 1;
bklSettings.dwBattBacklightLevel = BKL_LEVEL_DEFAULT;
bklSettings.dwACBacklightLevel = BKL_LEVEL_DEFAULT;
// Get handles to desired events/msgQ etc.
// Get handle to backlight timer change Event
hWaitList[bklControlPanelEvent] = CreateEvent(NULL, FALSE, FALSE, L"BackLightChangeEvent" ) ; //event from Control Panel
if(!hWaitList[bklControlPanelEvent])
{
DEBUGMSG(ZONE_ERROR, (TEXT("Get BackLightChangeEvent failed!!\r\n")));
goto InitErrCleanup;
}
// Get handle to Power notification event
msgOptions.dwSize = sizeof(MSGQUEUEOPTIONS);
msgOptions.dwFlags = MSGQUEUE_ALLOW_BROKEN;
msgOptions.dwMaxMessages = 0;
msgOptions.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_PATH;
msgOptions.bReadAccess = TRUE;
// create message queue
hMsgQ = CreateMsgQueue(NULL, &msgOptions);
if(!hMsgQ)
{
DEBUGMSG(ZONE_ERROR, (TEXT("Create MsgQueue fail!!\n"), GetLastError()));
goto InitErrCleanup;
}
else
{
hNotifications = RequestPowerNotifications(hMsgQ, PBT_POWERSTATUSCHANGE);
if(!hNotifications)
{
DEBUGMSG(ZONE_ERROR, (TEXT("Request Power Notification fail!!\n"), GetLastError()));
goto InitErrCleanup;
}
hWaitList[bklPowerNotificationEvent] = hMsgQ;
}
// Get handle to User Activity Event
// Backup handle to user activity event.
hUserActivityEvent = CreateEvent(NULL, FALSE, FALSE, L"PowerManager/UserActivity_Active");
if(!hUserActivityEvent)
{
DEBUGMSG(ZONE_ERROR, (TEXT("Get User Activity Event failed!!\r\n")));
goto InitErrCleanup;
}
hUserInactivityEvent = CreateEvent(NULL, FALSE, FALSE, L"PowerManager/UserActivity_Inactive");
if(!hUserInactivityEvent)
{
DEBUGMSG(ZONE_ERROR, (TEXT("Get User Inactivity Event failed!!\r\n")));
goto InitErrCleanup;
}
// Create a dummy event that will never be signaled.
hevDummy = CreateEvent(NULL, FALSE, FALSE, NULL);
if(!hevDummy)
{
DEBUGMSG(ZONE_ERROR, (TEXT("Create dummy event failed!!\r\n")));
goto InitErrCleanup;
}
hWaitList[bklUserInactivityEvent] = hUserInactivityEvent;
// Get handle to backlight level change event
hWaitList[bklLevelChangeEvent] = CreateEvent(NULL, FALSE, FALSE, L"BackLightLevelChangeEvent" );
if(!hWaitList[bklLevelChangeEvent])
{
DEBUGMSG(ZONE_ERROR, (TEXT("Get BackLightLevelChangeEvent failed!!\r\n")));
goto InitErrCleanup;
}
// Do BSP initialization
BSPBacklightInit();
// Init device power state to D0
CurDx = D0;
DEBUGMSG(ZONE_INIT, (TEXT("BKL_Init: CreateThread\r\n")));
fIntrThreadLoop = TRUE;
ghInterruptServiceThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)BKL_IntrThread, NULL, 0, NULL);
if(ghInterruptServiceThread == NULL)
{
DEBUGMSG(1, (TEXT("BKL_Init: Failed to create BLD Interrupt Service Thread\r\n")));
goto InitErrCleanup;
}
DEBUGMSG(ZONE_FUNCTION, (TEXT("BKL_INIT() -!\r\n")) );
return 1;
InitErrCleanup:
if(hDriverKey)
RegCloseKey(hDriverKey);
BKL_Deinit(dwContext);
DEBUGMSG(ZONE_FUNCTION, (TEXT("BKL_INIT() -!\r\n")) );
return 0;
}
//------------------------------------------------------------------------------
//
// FUNCTION: BKL_IOControl
//
// DESCRIPTION:
// PARAMETERS:
//
// RETURNS:
//
//------------------------------------------------------------------------------
extern "C" BOOL
BKL_IOControl(
DWORD dwContext,
DWORD Ioctl,
PUCHAR pInBuf,
DWORD InBufLen,
PUCHAR pOutBuf,
DWORD OutBufLen,
PDWORD pdwBytesTransferred
)
{
DWORD dwErr = ERROR_INVALID_PARAMETER;
BOOL bRc = FALSE;
BKL_FUNCTION_ENTRY();
#ifdef DEBUG
TCHAR szBuf[128];
LPTSTR pszFname;
// format the routine name
_stprintf(szBuf, TEXT("BKL_IOControl(%08x)"), dwContext);
pszFname = szBuf;
#endif
DEBUGMSG(ZONE_INFO, (TEXT("%s: IOCTL:0x%x, InBuf:0x%x, InBufLen:%d, OutBuf:0x%x, OutBufLen:0x%x)\r\n"),
pszFname, Ioctl, pInBuf, InBufLen, pOutBuf, OutBufLen));
switch(Ioctl)
{
case IOCTL_POWER_CAPABILITIES:
// tell the power manager about ourselves.
DEBUGMSG(ZONE_INFO, (TEXT("%s: BKL_IOCTL_POWER_CAPABILITIES\r\n"), pszFname));
if( pOutBuf != NULL &&
OutBufLen >= sizeof(POWER_CAPABILITIES) &&
pdwBytesTransferred != NULL)
{
PPOWER_CAPABILITIES ppc = (PPOWER_CAPABILITIES) pOutBuf;
memset(ppc, 0, sizeof(POWER_CAPABILITIES));
ppc->DeviceDx = 0x11; // support D0, D4
ppc->WakeFromDx = 0x00; // No wake capability
ppc->InrushDx = 0x00; // No in rush requirement
ppc->Power[D0] = 600; // 0.6W
ppc->Power[D1] = PwrDeviceUnspecified;
ppc->Power[D2] = PwrDeviceUnspecified;
ppc->Power[D3] = PwrDeviceUnspecified;
ppc->Power[D4] = 0;
ppc->Latency[D0] = 0;
ppc->Latency[D1] = PwrDeviceUnspecified;
ppc->Latency[D2] = PwrDeviceUnspecified;
ppc->Latency[D3] = PwrDeviceUnspecified;
ppc->Latency[D4] = 0;
ppc->Flags = 0;
*pdwBytesTransferred = sizeof(POWER_CAPABILITIES);
dwErr = ERROR_SUCCESS;
}
break;
case IOCTL_POWER_QUERY:
DEBUGMSG(ZONE_INFO, (TEXT("%s: BKL_IOCTL_POWER_QUERY\r\n"), pszFname));
if( pOutBuf != NULL &&
OutBufLen == sizeof(CEDEVICE_POWER_STATE) &&
pdwBytesTransferred != NULL)
{
CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE)pOutBuf;
DEBUGMSG(ZONE_INFO, (TEXT("NewDx = %d\r\n"), NewDx));
if(VALID_DX(NewDx))
{
// this is a valid Dx state so return a good status
*pdwBytesTransferred = sizeof(CEDEVICE_POWER_STATE);
dwErr = ERROR_SUCCESS;
}
DEBUGMSG(ZONE_INFO, (TEXT("%s: IOCTL_POWER_QUERY %u %s\r\n"), pszFname,
NewDx, dwErr == ERROR_SUCCESS ? TEXT("succeeded") : TEXT("failed")));
}
break;
case IOCTL_POWER_SET:
DEBUGMSG(ZONE_INFO, (TEXT("%s: BKL_IOCTL_POWER_SET\r\n"), pszFname));
if( pOutBuf != NULL &&
OutBufLen == sizeof(CEDEVICE_POWER_STATE) &&
pdwBytesTransferred != NULL)
{
CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE)pOutBuf;
DEBUGMSG(ZONE_INFO, (TEXT("NewDx = %d\r\n"), NewDx));
if(NewDx != CurDx)
{
if(NewDx == D0)
{
// TURN ON BACKLIGHT
if(fACOnline)
BSPBacklightSetIntensity(bklSettings.dwACBacklightLevel);
else
BSPBacklightSetIntensity(bklSettings.dwBattBacklightLevel);
DEBUGMSG(ZONE_INFO, (TEXT("BackLight ON\r\n")));
}
else
{
// if asked for a state we don't support, go to the next lower one
// which is D4
NewDx = D4;
BSPBacklightSetIntensity(0);
DEBUGMSG(ZONE_INFO, (TEXT("BackLight Off\r\n")));
}
EnterCriticalSection(&cs) ;
CurDx = NewDx;
LeaveCriticalSection(&cs);
*(PCEDEVICE_POWER_STATE)pOutBuf = CurDx;
}
*pdwBytesTransferred = sizeof(CEDEVICE_POWER_STATE);
DEBUGMSG(ZONE_INFO, (TEXT("CurDx = %d\r\n"), CurDx));
dwErr = ERROR_SUCCESS;
}
break;
case IOCTL_POWER_GET:
DEBUGMSG(ZONE_INFO, (TEXT("%s: BKL_IOCTL_POWER_GET\r\n"), pszFname));
if( pOutBuf != NULL &&
OutBufLen == sizeof(CEDEVICE_POWER_STATE) &&
pdwBytesTransferred != NULL)
{
// just return our CurrentDx value
*(PCEDEVICE_POWER_STATE)pOutBuf = CurDx;
*pdwBytesTransferred = sizeof(CEDEVICE_POWER_STATE);
dwErr = ERROR_SUCCESS;
}
break;
default:
DEBUGMSG(ZONE_ERROR, (TEXT("%s: Unsupported IOCTL code %u\r\n"), pszFname, Ioctl));
dwErr = ERROR_NOT_SUPPORTED;
break;
}
// pass back appropriate response codes
SetLastError(dwErr);
if(dwErr != ERROR_SUCCESS)
bRc = FALSE;
else
bRc = TRUE;
BKL_FUNCTION_EXIT();
return bRc;
}
//------------------------------------------------------------------------------
//
// FUNCTION: BKL_DllEntry
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -