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

📄 backlight.c

📁 这是背光驱动的代码 是关于平台S3C2416平台上面的
💻 C
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////
#include <windows.h>
#include <types.h>
#include <s3c2450.h>
#include <bsp_cfg.h>
#include "BackLight.h"

static HANDLE gPendownEvent = NULL;				// 触摸驱动发送
static HANDLE gBLCEvent = NULL;					// 控制面板和电池驱动发送
static HANDLE gEnableBacklightAutoChangeEvent = NULL;
static HANDLE gDisableBacklightAutoChangeEvent = NULL;

static int bltbrightness;
static PBACKLIGHTDEVICE g_pBltDev;
static DWORD g_dwPwdr;

#define SEUIC_BACKLIGHT_PWM 
#define SEUIC_AUTOSHUTDOWN
#define IS_CHARGING  TRUE
#define BLT 0

/*************************************************************************************
// 从控制面板得到已有的背光设置.正确则存入pBltDev中,返回TRUE;否则返回FALSE
**************************************************************************************/
static BOOL GetRegSettings(PBACKLIGHTDEVICE pBltDev)
{
	HKEY hKey;
	DWORD bright, interAC, interBT;	
	DWORD briSize, interSize;
	LONG briError, interError;
	BOOL ret = FALSE;
	BOOL UseBattery, UseExt;
	DWORD BacklightOri;
	LONG ubSize, ueSize;
	LONG ubError, ueError;
	
	briError = RegOpenKeyEx(HKEY_CURRENT_USER, BACKLIGHT_REG_PATH, 0, KEY_READ, &hKey);
	if (briError == ERROR_SUCCESS)
	{
		briSize = sizeof (bright);
		interSize = sizeof (interAC);
		ubSize = sizeof (UseBattery);
		ueSize = sizeof (UseExt);

		pBltDev->BacklightOri = TRUE;
		briError = RegQueryValueEx(hKey, BACKLIGHT_ORI, NULL, NULL, (LPBYTE)&BacklightOri, &briSize);
		if (briError == ERROR_SUCCESS)
		{
			if(BacklightOri == 1)
				pBltDev->BacklightOri = FALSE;	
		}
		RETAILMSG(BLT, (TEXT("pBltDev->BacklightOri = %d\r\n"), pBltDev->BacklightOri));

		briError = RegQueryValueEx(hKey, RV_BACKLIGHT_BRIGHTNESS, NULL, NULL, (LPBYTE)&bright, &briSize);
		if (briError == ERROR_SUCCESS)
		{
			pBltDev->brightness = bright;	
			ret = TRUE;
		}
		
		interError = RegQueryValueEx(hKey, BACKLIGHT_INTERVAL_AC, NULL, NULL, (LPBYTE)&interAC, &interSize);
		if (interError == ERROR_SUCCESS)
		{
			pBltDev->intervalAC = interAC;
			ret = TRUE;
		}
		
		interError = RegQueryValueEx(hKey, BACKLIGHT_INTERVAL_BT, NULL, NULL, (LPBYTE)&interBT, &interSize);
		if (interError == ERROR_SUCCESS)
		{
			pBltDev->intervalBT = interBT;
			ret = TRUE;
		}	
		
		ubError = RegQueryValueEx(hKey, RV_USEBATTERY, NULL, NULL, (LPBYTE)&UseBattery, &ubSize);
		if (ubError == ERROR_SUCCESS)
		{
			pBltDev->UseBattery = UseBattery;
			ret = TRUE;
		}
		else
		{
			pBltDev->UseBattery = TRUE;
		}
		
		ueError = RegQueryValueEx(hKey, RV_USEAC, NULL, NULL, (LPBYTE)&UseExt, &ueSize);
		if (ueError == ERROR_SUCCESS)
		{
			pBltDev->UseExt = UseExt;
			ret = TRUE;
		}
		else
		{
			pBltDev->UseExt = TRUE;
		}
		
		RegCloseKey(hKey);
	} 
	return ret;
}

/*************************************************************************************
// ResetBacklightState
**************************************************************************************/
static void ResetBacklightState( PBACKLIGHTDEVICE pBltDev, BACKLIGHTSTATE newState )
{
	long pwdr = pBltDev->brightness * MAX_PWM / MAX_SHORT ;
	int	duration = DEFDUTYON - DEFDUTYOFF;
	
	RETAILMSG(BLT, (TEXT("ResetBacklightState !!!\r\n")));

	g_pBltDev = (PBACKLIGHTDEVICE)LocalAlloc(LPTR, sizeof (BACKLIGHTDEVICE));

	if (duration > 0)
	{
		if (pBltDev->BacklightOri)
		{	pwdr = DEFDUTYOFF + pBltDev->brightness * duration / MAX_SHORT;	}
		else
		{	pwdr = DEFDUTYOFF + (MAX_SHORT - pBltDev->brightness) * duration / MAX_SHORT;	}
	}
	else if (duration < 0)
	{
		if (pBltDev->BacklightOri)
		{	pwdr = DEFDUTYOFF - (MAX_SHORT - pBltDev->brightness) * (-duration) / MAX_SHORT; }
		else
		{	pwdr = DEFDUTYOFF - (pBltDev->brightness) * (-duration) / MAX_SHORT;	}
	}

	if (pBltDev)
	{
		EnterCriticalSection(&(pBltDev->cs));

		if (newState == LIGHT_ON)
		{
			RETAILMSG(BLT, (TEXT("Reset backlight state: TURN ON\r\n")));
			
			pBltDev->v_pPWMRegs->TCNTB0 = MAX_PWM;  //周期配置
			pBltDev->v_pPWMRegs->TCMPB0 = DEFDUTYON;  //亮
			pBltDev->v_pPWMRegs->TCON |= 0x0A;
			pBltDev->v_pPWMRegs->TCON &=(~0x2);
			pBltDev->v_pPWMRegs->TCON |=0x1;
		
			pBltDev->state = LIGHT_ON;
		} 
		else if (newState == LIGHT_OFF)
		{
			RETAILMSG(BLT, (TEXT("Reset backlight state: TURN OFF\r\n")));
			
			pBltDev->v_pPWMRegs->TCNTB0 = MAX_PWM;
			pBltDev->v_pPWMRegs->TCMPB0 = DEFDUTYOFF;
       		pBltDev->v_pPWMRegs->TCON |= 0x0A;
			pBltDev->v_pPWMRegs->TCON &=(~0x2);
			pBltDev->v_pPWMRegs->TCON |=0x1;

			pBltDev->state = LIGHT_OFF;
		}
		LeaveCriticalSection(&(pBltDev->cs));
	}

	RETAILMSG(BLT, (TEXT("ResetBacklightState over!!\r\n")));
}

/*************************************************************************************
// BacklightMonitorThreadProc线程
**************************************************************************************/
DWORD WINAPI BacklightMonitorThreadProc(LPVOID lpvParam)    
{	
	PBACKLIGHTDEVICE pBltDev = NULL;
	BOOL	bEnableBacklightAutoChange;
	UINT	uelapse, oldelapse;//ms
	HANDLE  Handles[4];
	DWORD	ret;

	pBltDev = (PBACKLIGHTDEVICE)lpvParam;
	if (!pBltDev)	return 0;

	RETAILMSG(BLT, (TEXT("BacklightMonitorThreadProc Running \r\n")));

	// 根据msdn,在其他驱动中使用“PenDownInBackLightOffEvent”创建的event将和这里的gPendownEvent
	// 享有同一个event句柄,因此其他驱动可以set本event句柄,下面的gBLCEvent也一样
	gPendownEvent = CreateEvent(NULL, FALSE, TRUE, TEXT("PenDownInBackLightOffEvent"));
	Handles[0] = gPendownEvent;

	gBLCEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("BackLightChangeEvent"));
	Handles[1] = gBLCEvent;

	gEnableBacklightAutoChangeEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("EnableBacklightAutoChangeEvent"));
	Handles[2] = gEnableBacklightAutoChangeEvent;

	gDisableBacklightAutoChangeEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("DisableBacklightAutoChangeEvent"));
	Handles[3] = gDisableBacklightAutoChangeEvent;

	if(IS_CHARGING)
	{
		if(pBltDev->UseExt)
		{
			uelapse = oldelapse = pBltDev->intervalAC * 1000;		// 秒 -> 毫秒
		}
		else
		{	uelapse = oldelapse = -1;	}
	}
	else
	{
		if(pBltDev->UseBattery)
		{
			uelapse = oldelapse = pBltDev->intervalBT * 1000;		// 秒 -> 毫秒
		}
		else
		{	uelapse = oldelapse = -1;	}
	}
	bEnableBacklightAutoChange = TRUE;

	for( ; ; )
	{
		ret = WaitForMultipleObjects(4, (CONST HANDLE*)Handles, FALSE, uelapse);
		
		switch (ret)
		{
			case (WAIT_OBJECT_0):
				// 收到笔点击通知消息
				RETAILMSG(BLT, (TEXT("Pen down, we have to reset backlight status\r\n")));
				if (bEnableBacklightAutoChange == TRUE)
				{
					RETAILMSG(BLT, (TEXT("bEnableBacklightAutoChange enabled\r\n")));
					if (pBltDev->state == LIGHT_OFF)
					{
						RETAILMSG(BLT, (TEXT("pBltDev->state == LIGHT_OFF\r\n")));
						ResetBacklightState(pBltDev, LIGHT_ON);	
					}
					// 重新开始计时
					uelapse = oldelapse;
				}
				break;		
			case (WAIT_OBJECT_0 + 1):
				RETAILMSG(BLT, (TEXT("there is a BackLightChangeEvent\r\n")));
				// 注册表背光设置改变,重新读取
				if (GetRegSettings(pBltDev))
				{
					if(IS_CHARGING)
					{
						if(pBltDev->UseExt)
						{
							uelapse = oldelapse = pBltDev->intervalAC * 1000;		// 秒 -> 毫秒
						}
						else
						{	uelapse = oldelapse = -1;	}
					}
					else
					{
						if(pBltDev->UseBattery)
						{
							uelapse = oldelapse = pBltDev->intervalBT * 1000;		// 秒 -> 毫秒
						}
						else
						{	uelapse = oldelapse = -1;	}
					}
					ResetBacklightState(pBltDev, LIGHT_ON);
				}

⌨️ 快捷键说明

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