📄 blc_io.c
字号:
/****************************************************************
Module Name: BLC_IO.c
Abstract: IOControl interface to the backlight driver.
*******************************************************************/
#include <windows.h>
#include <types.h>
#include "BLC_IO.h"
#include "BLC_cmn.h"
#include "BLC_hw.h"
#include "blc_glob.h"
#include "drv_glob.h"
#include "xsc1.h"
#ifdef DEBUG
DBGPARAM dpCurSettings = {TEXT("Backlight"), {TEXT("Undefined"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"),
TEXT("Undefined"), TEXT("Undefined") }, 0x00000000 };
#endif
#define BLMSG_TRACE 1
extern BOOL gBLAutoOn;
extern BOOL gBLState;
extern ULONG regBLTimeout;
extern ULONG gPWMValue;
CRITICAL_SECTION gBacklightCriticalSection;
// variables in the global area
volatile CLKMAN_REGS *v_pCLKReg=NULL;
volatile GPIO_REGS *v_pGPIOReg=NULL;
volatile PWM_REGS *v_pPWM1Reg=NULL;
volatile DRIVER_GLOBALS *v_pDrvGlob=NULL;
//
DWORD BLC_Init(DWORD dwContext)
{
// Perform all one-time initialization of the backlight hardware
if (InitializeBacklight())
{
// initialize the critical section
InitializeCriticalSection(&gBacklightCriticalSection);
// if successful, return an ID
return kBLCDriverID;
}
RETAILMSG(BLMSG_TRACE, (TEXT("BLC_Init: backlight initialization failed\r\n")));
return 0;
}
BOOL BLC_Deinit(DWORD dwContext)
{
RETAILMSG(BLMSG_TRACE, (TEXT("BLC_Deinit: dwContext = 0x%x\r\n"), dwContext));
// close the device
BLC_Close(dwContext);
// delete the critical section
DeleteCriticalSection(&gBacklightCriticalSection);
// the device manager does not check the return code
return TRUE;
}
DWORD BLC_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
RETAILMSG(BLMSG_TRACE, (TEXT("BLC_Open: dwData = 0x%x, dwAccess = 0x%x, dwShareMode = 0x%x\r\n"), dwData, dwAccess, dwShareMode));
// attempt to open the device
//
// if successful, return a handle for use in all subsequent calls to the driver
return dwData;
// else return 0
//return 0;
}
BOOL BLC_Close(DWORD Handle)
{
RETAILMSG(BLMSG_TRACE, (TEXT("BLC_Close: Handle = 0x%x\r\n"), Handle));
// close the device
//
// the device manager does not check the return code
return TRUE;
}
void BLC_PowerDown(void)
{
}
void
BLC_PowerUp(void)
{
//RETAILMSG(0, (TEXT("+ backlight BLC_PowerUp\r\n")));
gBLState = BLSTATE_ON;
}
DWORD
BLC_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
RETAILMSG(BLMSG_TRACE, (TEXT("BLC_Read: Handle = 0x%x, pBuffer = 0x%x, dwNumBytes = 0x%x\r\n"), Handle, pBuffer, dwNumBytes));
// read dwNumBytes from the device into pBuffer
// return -1 if error, or number of bytes read
return 0;
}
DWORD
BLC_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
RETAILMSG(BLMSG_TRACE, (TEXT("BLC_Write: Handle = 0x%x, pBuffer = 0x%x, dwNumBytes = 0x%x\r\n"), Handle, pBuffer, dwNumBytes));
// read dwNumBytes from pBuffer into the device
// return -1 if error, or number of bytes written
return 0;
}
DWORD
BLC_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
RETAILMSG(BLMSG_TRACE, (TEXT("BLC_Seek: Handle = 0x%x, lDistance = 0x%x, dwMoveMethod = 0x%x\r\n"), Handle, lDistance, dwMoveMethod));
// typically unsupported
return (DWORD) -1;
}
BOOL
BLC_IOControl(DWORD Handle, DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize,
PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)
{
DWORD returnCode = ERROR_SUCCESS;
EnterCriticalSection(&gBacklightCriticalSection);
{
switch (dwIoControlCode)
{
case kBLCNoticeUserAction:
if ((gBLAutoOn) && (!GetHardwareBacklightState()) )//&& !(v_pDrvGlob->KeySw.bToggleScreen))
//jiang modified 2003-9-12 21:01 end
{
SetBacklightState(TRUE, FALSE);
RETAILMSG(0, (TEXT("BLC_IOControl: kBLCNoticeUserAction111\r\n")));
}
else // ...otherwise just reset the timer
{
RETAILMSG(0, (TEXT("BLC_IOControl: kBLCNoticeUserAction222\r\n")));
ResetBacklightTimeout();
}
break;
case kBLCSetState:
gBLState = nInBufSize;
SetBacklightState(gBLState, FALSE);
break;
case kBLCGetState:
*pBytesReturned = gBLState;
break;
case kBLCToggleBacklight:
SetBacklightState(TRUE, TRUE);
break;
case kBLCReadUserSettings:
ReadBacklightSettingsFromRegistry();
break;
default :
// handle unknown selector
returnCode = -1;
break;
}
}
LeaveCriticalSection(&gBacklightCriticalSection);
// return TRUE for success, FALSE for failure
return returnCode == ERROR_SUCCESS;
}
BOOL WINAPI
BLC_DllEntry(HANDLE hinstDll, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
RETAILMSG(BLMSG_TRACE, (TEXT("BLC_DllEntry: DLL_PROCESS_ATTACH. Built: %s %s \r\n"),_T(__DATE__),_T(__TIME__) ));
DEBUGREGISTER(hinstDll);
// load external DLL if necessary
// virtual memory allocation of variables in the global area
#ifdef NOUSEVIRTUALMEM // kernel mode
v_pCLKReg = (PCLKMAN_REGS)CLK_BASE_U_VIRTUAL;
v_pGPIOReg = (PGPIO_REGS)GPIO_BASE_U_VIRTUAL;
v_pPWM1Reg = (PPWM1_REGS)PWM1_BASE_U_VIRTUAL;
v_pDrvGlob = (PDRIVER_GLOBALS)DRIVER_GLOBALS_PHYSICAL_MEMORY_START;
#else
v_pCLKReg = (PCLKMAN_REGS)VirtualAlloc(0, 0x400, MEM_RESERVE, PAGE_NOACCESS);
VirtualCopy((PVOID)v_pCLKReg, (PVOID)CLK_BASE_U_VIRTUAL, 0x400, PAGE_READWRITE|PAGE_NOCACHE);
v_pGPIOReg = (PGPIO_REGS)VirtualAlloc(0, 0x400, MEM_RESERVE, PAGE_NOACCESS);
VirtualCopy((PVOID)v_pGPIOReg, (PVOID)GPIO_BASE_U_VIRTUAL, 0x400, PAGE_READWRITE|PAGE_NOCACHE);
v_pPWM1Reg = (PPWM1_REGS)VirtualAlloc(0, 0x400, MEM_RESERVE, PAGE_NOACCESS);
VirtualCopy((PVOID)v_pPWM1Reg, (PVOID)PWM1_BASE_U_VIRTUAL, 0x400, PAGE_READWRITE|PAGE_NOCACHE);
v_pDrvGlob = (PDRIVER_GLOBALS)VirtualAlloc(0, 0x400, MEM_RESERVE, PAGE_NOACCESS);
VirtualCopy((PVOID)v_pDrvGlob, (PVOID)DRIVER_GLOBALS_PHYSICAL_MEMORY_START, 0x400, PAGE_READWRITE|PAGE_NOCACHE);
#endif
break;
case DLL_PROCESS_DETACH:
RETAILMSG(BLMSG_TRACE, (TEXT("BLC_DllEntry: DLL_PROCESS_DETACH\r\n")));
// free stuff here
#ifdef NOUSEVIRTUALMEM // kernel mode
#else
VirtualFree((void *)v_pCLKReg, 0x400, MEM_RELEASE);
VirtualFree((void *)v_pGPIOReg, 0x400, MEM_RELEASE);
VirtualFree((void *)v_pPWM1Reg, 0x400, MEM_RELEASE);
VirtualFree((void *)v_pDrvGlob, 0x400, MEM_RELEASE);
#endif
break;
}
// return TRUE for success, FALSE for failure
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -