📄 backlight.c
字号:
break;
case (WAIT_OBJECT_0 + 2):
bEnableBacklightAutoChange = TRUE;
break;
case (WAIT_OBJECT_0 + 3):
bEnableBacklightAutoChange = FALSE;
break;
case WAIT_TIMEOUT:
RETAILMSG(BLT, (TEXT("wait for PenDownInBackLightOffEvent and BackLightChangeEvent timeout\r\n")));
if (bEnableBacklightAutoChange == TRUE)
{
// 背光到时,关闭
oldelapse = uelapse;
uelapse = INFINITE;
ResetBacklightState(pBltDev, LIGHT_OFF);
}
break;
default:
break;
}
}
// It will never reach here!
return 0;
}
/*************************************************************************************
// RegAlloc
**************************************************************************************/
PVOID RegAlloc(PVOID addr, INT sz)
{
PVOID reg;
reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);
if (reg)
{
if (!VirtualCopy(reg, (PVOID)((UINT32)addr >> 8), sz, PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE ))
{
VirtualFree(reg, 0, MEM_RELEASE);
reg = NULL;
}
}
return reg;
}
/*************************************************************************************
// BLT_Init
**************************************************************************************/
DWORD BLT_Init(LPCTSTR pContext, LPCVOID lpvBusContext)
{
RETAILMSG(BLT,(TEXT("backlight:BLT_Init\r\n")));
g_pBltDev = (PBACKLIGHTDEVICE)LocalAlloc(LPTR, sizeof (BACKLIGHTDEVICE));
if (!g_pBltDev) return 0;
memset((void *)g_pBltDev, 0, sizeof (BACKLIGHTDEVICE));
g_pBltDev->state = LIGHT_OFF;
g_pBltDev->s2450PWR = (volatile S3C2450_CLKPWR_REG *)RegAlloc((PVOID)S3C2450_BASE_REG_PA_CLOCK_POWER, sizeof(S3C2450_CLKPWR_REG));
g_pBltDev->v_pPWMRegs = (volatile S3C2450_PWM_REG *)RegAlloc((PVOID)S3C2450_BASE_REG_PA_PWM, sizeof(S3C2450_PWM_REG));
g_pBltDev->v_pGPIOReg = (volatile S3C2450_IOPORT_REG *)RegAlloc((PVOID)S3C2450_BASE_REG_PA_IOPORT, sizeof(S3C2450_IOPORT_REG));
if (!g_pBltDev->v_pPWMRegs || !g_pBltDev->v_pGPIOReg) {
return 0;
}
InitializeCriticalSection(&(g_pBltDev->cs));
// 从注册表读入设置
if (!GetRegSettings(g_pBltDev)) {
g_pBltDev->brightness = MAX_SHORT;
g_pBltDev->intervalAC = DEFAULT_BACKLIGHT_INTERVAL_AC;
g_pBltDev->intervalBT = DEFAULT_BACKLIGHT_INTERVAL_BT;
}
// 启动背光线程
g_pBltDev->blt_thread = CreateThread(NULL, 0, BacklightMonitorThreadProc, (LPVOID)g_pBltDev, 0, NULL);
if (!g_pBltDev->blt_thread)
{ return 0; }
RETAILMSG(BLT,(TEXT("backlight:register.......\r\n")));
// 设置背光控制的专用口
g_pBltDev->s2450PWR ->PCLKCON |= (1<<10);
g_pBltDev->v_pGPIOReg->GPBUDP |= 0x3; //Pull Disable
g_pBltDev->v_pGPIOReg->GPBCON = (g_pBltDev->v_pGPIOReg->GPBCON & ~(3<<0)) | (1<<1); // Backlight Pwm control
g_pBltDev->v_pPWMRegs->TCFG0 &= (~0x3); //Prescale =0
g_pBltDev->v_pPWMRegs->TCFG1 &= (~0x0F); //MUX0 = 1/2,
g_pBltDev->v_pPWMRegs->TCNTB0 = MAX_PWM;
g_pBltDev->v_pPWMRegs->TCMPB0 = DEFDUTYON; //亮
g_pBltDev->v_pPWMRegs->TCON |= 0x0A;
g_pBltDev->v_pPWMRegs->TCON &=(~0x2);
g_pBltDev->v_pPWMRegs->TCON |=0x1;
RETAILMSG (BLT, (TEXT("TCON: %x\r\n"), g_pBltDev->v_pPWMRegs->TCON ));
RETAILMSG(BLT,(TEXT("Backlight Device init OK \r\n")));
return (DWORD)g_pBltDev;
}
BOOL BLT_Deinit(DWORD pDevInfo)
{
PBACKLIGHTDEVICE pBltDev;
RETAILMSG(BLT,(TEXT("BLT_Deinit \r\n")));
pBltDev = (PBACKLIGHTDEVICE)pDevInfo;
if (pBltDev)
{
if(pBltDev->v_pPWMRegs)
{ VirtualFree((PVOID)pBltDev->v_pPWMRegs, 0, MEM_RELEASE); }
if(pBltDev->v_pGPIOReg)
{ VirtualFree((PVOID)pBltDev->v_pGPIOReg, 0, MEM_RELEASE); }
DeleteCriticalSection(&(pBltDev->cs));
LocalFree(pBltDev);
}
return TRUE;
}
/*************************************************************************************
// BLT_Open...BLT_Close
**************************************************************************************/
DWORD BLT_Open(DWORD pDevInfo, DWORD AccessCode, DWORD ShareMode)
{
PBACKLIGHTDEVICE pBltDev = NULL;
pBltDev = (PBACKLIGHTDEVICE)pDevInfo;
if (!pBltDev)
{return 0;}
if (pBltDev->count != 0)
{return 0;}
// 阻止背光线程控制背光,防止背光线程和应用程序动作冲突
if (pBltDev->blt_thread)
{ SetEvent(gDisableBacklightAutoChangeEvent); }
pBltDev->count++;
return (DWORD)pBltDev;
}
BOOL BLT_Close(DWORD pDevInfo)
{
PBACKLIGHTDEVICE pBltDev = (PBACKLIGHTDEVICE)pDevInfo;
if (!pBltDev) return 0;
// 允许背光线程控制背光
if (pBltDev->blt_thread)
{ SetEvent(gEnableBacklightAutoChangeEvent); }
pBltDev->count--;
return TRUE;
}
/*************************************************************************************
// BLT_IOControl
**************************************************************************************/
BOOL BLT_IOControl(DWORD pDevInfo, DWORD dwCode, PBYTE pBufIn,
DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
PBACKLIGHTDEVICE pBltDev;
RETAILMSG(BLT, (TEXT("backlight ioctl \r\n")));
pBltDev = (PBACKLIGHTDEVICE)pDevInfo;
if (!pBltDev) return FALSE;
switch (dwCode)
{
case IOCTL_BACKLIGHT_ON:
RETAILMSG(BLT, (TEXT("backlight ioctl: IOCTL_BACKLIGHT_ON\r\n")));
ResetBacklightState(pBltDev, LIGHT_ON);
break;
case IOCTL_BACKLIGHT_OFF:
RETAILMSG(BLT, (TEXT("backlight ioctl: IOCTL_BACKLIGHT_OFF\r\n")));
ResetBacklightState(pBltDev, LIGHT_OFF);
break;
default:
return FALSE;
}
return TRUE;
}
/*************************************************************************************
// BLT_PowerUp...BLT_PowerDown
**************************************************************************************/
BOOL BLT_PowerUp(BACKLIGHTDEVICE *pDevInfo)
{
RETAILMSG(BLT, (TEXT("backlight : PowerUp \r\n")));
// 设置背光控制的专用口
g_pBltDev->v_pGPIOReg->GPBUDP |= 0x3; //Pull Disable
g_pBltDev->v_pGPIOReg->GPBCON = (g_pBltDev->v_pGPIOReg->GPBCON & ~(3<<0)) | (2<<0); // Backlight Pwm control
g_pBltDev->v_pPWMRegs->TCFG0 &= (~0x3); //Prescale =0
g_pBltDev->v_pPWMRegs->TCFG1 &= (~0x0F); //MUX0 = 1/2,
g_pBltDev->v_pPWMRegs->TCNTB0 = MAX_PWM;
g_pBltDev->v_pPWMRegs->TCMPB0 = g_dwPwdr;
g_pBltDev->v_pPWMRegs->TCON |= 0x0A;
g_pBltDev->v_pPWMRegs->TCON &=(~0x2);
//g_pBltDev->v_pPWMRegs->TCON |=0x1;
g_pBltDev->v_pGPIOReg->GPBDAT &= ~(1<<0); //BL on // 2008.10.22
RETAILMSG(BLT, (TEXT("BLT_PowerUp\r\n")));
return TRUE;
}
BOOL BLT_PowerDown(BACKLIGHTDEVICE *pDevInfo)
{
PBACKLIGHTDEVICE pBltDev;
pBltDev = (PBACKLIGHTDEVICE)pDevInfo;
RETAILMSG(BLT, (TEXT("BLT_PowerDown start\r\n")));
ResetBacklightState(pBltDev, LIGHT_OFF);
/*
g_pBltDev->s2450PWR = (volatile S3C2450_CLKPWR_REG *)RegAlloc((PVOID)S3C2450_BASE_REG_PA_CLOCK_POWER, sizeof(S3C2450_CLKPWR_REG));
g_pBltDev->v_pGPIOReg = (volatile S3C2450_IOPORT_REG *)RegAlloc((PVOID)S3C2450_BASE_REG_PA_IOPORT, sizeof(S3C2450_IOPORT_REG));
g_pBltDev = (PBACKLIGHTDEVICE)LocalAlloc(LPTR, sizeof (BACKLIGHTDEVICE));
if (!g_pBltDev)
return 0;
g_pBltDev->s2450PWR ->PCLKCON &= ~(1<<10);
g_pBltDev->v_pGPIOReg->GPBUDP |= 0x3; //Pull Disable
g_pBltDev->v_pGPIOReg->GPBCON = (g_pBltDev->v_pGPIOReg->GPBCON & ~(3<<0)) | (1<<0); // Set Pin Output
g_pBltDev->v_pGPIOReg->GPBDAT |= (1<<0); //BL Off
*/
RETAILMSG(BLT, (TEXT("BLT_PowerDown over!!!!!\r\n")));
return TRUE;
}
/*************************************************************************************
// BackLight_DllEntry
**************************************************************************************/
BOOL BackLight_DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
RETAILMSG(BLT, (TEXT("DLL_PROCESS_ATTACH !!!!!\r\n")));
break;
case DLL_PROCESS_DETACH:
RETAILMSG(BLT, (TEXT("DLL_PROCESS_DETACH !!!!!\r\n")));
break;
default:
break;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -