?? ms2_backlight.cpp
字號:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//
//------------------------------------------------------------------------------
//
// File: ms2_backlight.c
//
// Backlight PDD driver source code, Mainstone-specific
//
#include <windows.h>
#include <ceddk.h>
#include <bulverde.h>
//#include <Xllp_serialization.h> // Added by LY in 2007/1/13
//#include <xllp_clkmgr.h> // Added by LY in 2007/1/13
/* The next is added by LY in 2007/1/13 */
#define SHOW_FUNCTION_ENTRY DEBUGMSG(1, (TEXT("<%s:%d>\r\n %s: Begin >>>\r\n"), TEXT(__FILE__), __LINE__, TEXT(__FUNCTION__)))
#define SHOW_FUNCTION_EXIT DEBUGMSG(1, (TEXT("<%s:%d>\r\n %s: End <<<\r\n"), TEXT(__FILE__), __LINE__, TEXT(__FUNCTION__)))
#define SHOW_COMPILING_INFO DEBUGMSG(1, (TEXT("\r\n[%s]\t: Compiled at %s, %s\r\n\r\n"), TEXT(__FILE__), __TIME__, TEXT(__DATE__)))
#ifdef RETAIL_DEBUG
#ifndef DEBUG
#define DEBUG 1
extern DBGPARAM dpCurSettings;
#undef DEBUGMSG
#define DEBUGMSG RETAILMSG
#endif
#endif
#ifdef DEBUG
#define ZONE_BACKLIGHT DEBUGZONE(0)
#define ZONE_FUNCTION DEBUGZONE(1)
#define ZONE_ERROR DEBUGZONE(15)
#else
#define ZONE_BACKLIGHT 1
#define ZONE_FUNCTION 1
#define ZONE_ERROR 1
#endif
/* The next is added by LY in 2007/1/11 */
#define LCD_MAX_INTENSITY 100
CRITICAL_SECTION gcs_backlight;
//
// PWMx - Generic Structure
//
typedef struct
{
unsigned long pwcr; //PWM Control Register
unsigned long pwdr; //PWM Duty Cycle Register
unsigned long pwpr; //PWM Period Control Register
} PWM_REGS;
volatile PWM_REGS * PWMReg2 = NULL;
volatile unsigned int * PCKEN = NULL;
volatile XLLP_GPIO_T * v_pGPIORegs = NULL; // used to access hardware bits for bkl on/off
void PWM2SetupGPIOs(volatile XLLP_GPIO_T *pGPIO) // Added by LY in 2007/1/13
{
// GPIO settings for LCD Controller
// Pin_name Pin Dir Alt_fn
//-------------------------------------
// PWM2 79 out 3
// XLLP_GPIO_T *pGPIO;
static XLLP_UINT32_T outpins[] =
{
1, 79
};
static XLLP_UINT32_T altpins[] =
{
1, 79
};
static XLLP_UINT32_T altfunc[] =
{
1, 3
};
SHOW_FUNCTION_ENTRY;
// pGPIO = (XLLP_GPIO_T *) pXllpLCD->GPIO;
XllpGpioSetDirectionOut((XLLP_GPIO_T *)pGPIO, (XLLP_UINT32_T *) outpins);
XllpGpioSetAlternateFn((XLLP_GPIO_T *)pGPIO, (XLLP_UINT32_T *) altpins, (XLLP_UINT32_T *) altfunc);
(void)pGPIO->GAFR0_L;
SHOW_FUNCTION_EXIT;
}
//-----------------------------------------------------------------------------
// Initialize hardware etc
// Returned DWORD will be passed to BacklightDeInit and should be used to store context if necessary
// pDeviceState should be set to the start state of the backlight (usually D0)
//
extern "C"
DWORD BacklightInit(LPCTSTR pContext, LPCVOID lpvBusContext, CEDEVICE_POWER_STATE *pDeviceState)
{
PHYSICAL_ADDRESS ioPhysicalBase = {BULVERDE_BASE_REG_PA_GPIO, 0 };
PHYSICAL_ADDRESS pwmPhysicalBase = {(BULVERDE_BASE_REG_PA_PWM0_2+0x10), 0 }; // Added by LY in 2007/1/13
PHYSICAL_ADDRESS ckenPhysicalBase = {(0x41300004), 0 }; // Added by LY in 2007/1/13
v_pGPIORegs = (volatile XLLP_GPIO_T *)MmMapIoSpace(ioPhysicalBase, sizeof(XLLP_GPIO_T),FALSE);
if (!v_pGPIORegs)
{
return FALSE;
}
PWMReg2 = (volatile PWM_REGS *)MmMapIoSpace(pwmPhysicalBase, sizeof(PWM_REGS),FALSE); // Added by LY in 2007/1/13
if (!PWMReg2)
{
return FALSE;
}
PCKEN = (volatile unsigned int *)MmMapIoSpace(ckenPhysicalBase, sizeof(unsigned int),FALSE); // Added by LY in 2007/1/13
if (!PCKEN)
{
return FALSE;
}
DEBUGMSG(ZONE_BACKLIGHT, (TEXT("BKL: Init\r\n")));
InitializeCriticalSection(&gcs_backlight);
// v_pGPIORegs->GPCR0 |= XLLP_GPIO_BIT_PWM_OUT0; // turn backlight off. Masked by LY in 2007/1/9
// v_pGPIORegs->GPSR2 |= XLLP_GPIO_BIT_PWM_OUT2; // turn backlight off. Added by LY in 2007/1/9. Masked by LY in 2007/1/15
*pDeviceState = D4;
return TRUE;
}
extern "C"
void BacklightDeInit(DWORD dwContext)
{
DEBUGMSG(ZONE_BACKLIGHT, (TEXT("BKL: De-Init\r\n")));
if (v_pGPIORegs != NULL) {
MmUnmapIoSpace((PVOID)v_pGPIORegs, sizeof(XLLP_GPIO_T));
}
if (PWMReg2 != NULL) { // Added by LY in 2007/1/13
MmUnmapIoSpace((PVOID)PWMReg2, sizeof(PWM_REGS));
}
if (PCKEN != NULL) { // Added by LY in 2007/1/13
MmUnmapIoSpace((PVOID)PCKEN, sizeof(unsigned int));
}
DeleteCriticalSection(&gcs_backlight);
return;
}
extern "C"
BOOL BackLightSetState(DWORD dwContext, CEDEVICE_POWER_STATE state)
{
// sets the backlight state (turns the backlight on and off)
DEBUGMSG(ZONE_FUNCTION, (L"+BackLightSetState(0x%08x)\r\n", (DWORD) state));
switch (state)
{
case D0:
// v_pGPIORegs->GPSR0 |= XLLP_GPIO_BIT_PWM_OUT0; // Masked by LY in 2007/1/9
v_pGPIORegs->GPCR2 |= XLLP_GPIO_BIT_PWM_OUT2; // Added by LY in 2007/1/9
// Keypad backlight
v_pGPIORegs->GPSR0 |= XLLP_GPIO_BIT(22);
DEBUGMSG(ZONE_FUNCTION, (L"+BackLightSetState - ON\r\n"));
break;
case D1:
case D2:
case D3:
case D4:
// v_pGPIORegs->GPCR0 |= XLLP_GPIO_BIT_PWM_OUT0; // Masked by LY in 2007/1/9
// v_pGPIORegs->GPSR2 |= XLLP_GPIO_BIT_PWM_OUT2; // Added by LY in 2007/1/9. Masked by LY in 2007/1/15.
// Keypad backlight
v_pGPIORegs->GPCR0 |= XLLP_GPIO_BIT(22);
DEBUGMSG(ZONE_FUNCTION, (L"+BackLightSetState - OFF\r\n"));
break;
default:
RETAILMSG(ZONE_ERROR, (L"+BackLightSetState - Unsupported power state!\r\n"));
return FALSE;
}
return TRUE;
}
extern "C"
UCHAR BacklightGetSupportedStates()
{
return DX_MASK(D0) | DX_MASK(D4); //support D0, D4 (ON, OFF)
}
extern "C"
void ChangeBacklight(unsigned int brightness) // Added by LY in 2007/1/11
{
unsigned int intensity_max = 0x64;
unsigned int intensity;
if(brightness > LCD_MAX_INTENSITY)
intensity = LCD_MAX_INTENSITY;
else
intensity = brightness;
EnterCriticalSection(&gcs_backlight);
(*PCKEN) |= XLLP_CLKEN_PWM0_2; // Enable the PWM2 CLK
PWMReg2->pwcr= 0;
PWMReg2->pwpr= intensity_max;
PWMReg2->pwdr= intensity_max * intensity / LCD_MAX_INTENSITY;
LeaveCriticalSection(&gcs_backlight);
}
extern "C"
void BacklightSetValue( ) // Added by LY in 2007/1/11
{
LONG returnvalue;
unsigned int brightness;
HKEY hkey = NULL;
DWORD dwType;
DWORD brightnesssize;
if(ERROR_SUCCESS != (returnvalue = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("\\SOFTWARE\\Microsoft\\Shell\\Extensions\\Controls Folder\\Backlight\\Shellex\\PropertySheetHandlers\\{B7120BAA-68AE-4a6c-B066-5A9E52897876}\\Backlight Brightness"), 0, 0, &hkey)))
{
DEBUGMSG(TRUE, (TEXT(" Open Registry Key of Backlight Brightness Fail!The Operation return value is %d \n"), returnvalue));
}
else
{
returnvalue = RegQueryValueEx(hkey, TEXT("Brightness"), NULL, &dwType, (LPBYTE)&brightness, &brightnesssize);
if(returnvalue != ERROR_SUCCESS)
{
if(returnvalue == ERROR_MORE_DATA) // Continue to read
{
returnvalue = RegQueryValueEx(hkey, TEXT("Brightness"), NULL, &dwType, (LPBYTE)&brightness, &brightnesssize);
if(returnvalue != ERROR_SUCCESS)
{
DEBUGMSG(TRUE, (TEXT(" Query Registry Key of Backlight Brightness Fail!The Operation return value is %d \n"), returnvalue));
goto Error;
}
else
goto Changebacklight;
}
}
Changebacklight:
PWM2SetupGPIOs(v_pGPIORegs);
ChangeBacklight( brightness);
}
Error:
RegCloseKey(hkey);
}
extern "C"
DWORD BacklightIOControl(DWORD dwOpenContext, DWORD dwIoControlCode, LPBYTE lpInBuf,
DWORD nInBufSize, LPBYTE lpOutBuf, DWORD nOutBufSize,
LPDWORD lpBytesReturned)
{
// For IOCTls that MDD doesn't know. ie non-pm IOCTLs
return ERROR_NOT_SUPPORTED;
}
extern "C"
void BacklightRegChanged()
{
// Called when the MDD gets a backlight registry changed event
// eg: read brightness settings from registry and update backlight accordingly
BacklightSetValue();
return;
}
extern "C"
void BacklightPwrSrcChanged(BOOL fOnAC)
{
// Called when the MDD gets a power source changed (AC->DC or vice-versa) event
// fOnAC will indicate whether the power source is now AC. TRUE->AC FALSE->Battery
// eg: update brightness of backlight according to user settings
BacklightSetValue();
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -