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

📄 backlight.c

📁 这是背光驱动的代码 是关于平台S3C2416平台上面的
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -