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

📄 backlight_wince.c

📁 WINCE下,背光驱动源码.
💻 C
📖 第 1 页 / 共 2 页
字号:
//
BOOL BKL_Close(DWORD context)
{
    BOOL rc = FALSE;
    BKL_DEVICE *pDevice;
    BKL_INSTANCE *pInstance = (BKL_INSTANCE*)context;

    DEBUGMSG(ZONE_FUNCTION, (L"+BKL_Close(0x%08x)\r\n", context));

    // Check if we get correct context
    if (pInstance == NULL || pInstance->cookie != BKL_INSTANCE_COOKIE) {
        DEBUGMSG (ZONE_ERROR, (L"ERROR: BKL_Read: "
            L"Incorrect context paramer\r\n"
        ));
        goto cleanUp;
    }

    // Get device context
    pDevice = pInstance->pDevice;

    // sanity check number of instances
    ASSERT(pDevice->instances > 0);

    // Decrement number of open instances
    InterlockedDecrement(&pDevice->instances);

    // Free instance structure
    LocalFree(pInstance);

    // Done...
    rc = TRUE;
    
cleanUp:
    DEBUGMSG(ZONE_FUNCTION, (L"-BKL_Close(rc = %d)\r\n", rc));
    return rc;
}

//------------------------------------------------------------------------------
//
//  Function:  BKL_IOControl
//
//  This function sends a command to a device.
//
BOOL BKL_IOControl(
    DWORD context, DWORD code, BYTE *pInBuffer, DWORD inSize, BYTE *pOutBuffer,
    DWORD outSize, DWORD *pOutSize
) {
    BOOL rc = FALSE;
    BKL_INSTANCE *pInstance = (BKL_INSTANCE*)context;
    BKL_DEVICE *pDevice;
    POWER_CAPABILITIES powerCap;
    CEDEVICE_POWER_STATE powerState;

    // Check if we get correct context
    if (pInstance == NULL || pInstance->cookie != BKL_INSTANCE_COOKIE) {
        DEBUGMSG(ZONE_ERROR, (L"ERROR: BKL_IOControl: "
            L"Incorrect context paramer\r\n"
        ));
        goto cleanUp;
    }

    // Device structure
    pDevice = pInstance->pDevice;

    switch (code) {
    // Return device specific power capabilities.
    case IOCTL_POWER_CAPABILITIES :  
        // Check input parameters
        if (pOutSize != NULL) *pOutSize = sizeof(POWER_CAPABILITIES);
        if (pOutBuffer == NULL || outSize < sizeof(POWER_CAPABILITIES)) {
            SetLastError(ERROR_INVALID_PARAMETER);
            break;
        }
        memset(&powerCap, 0, sizeof(powerCap));
        powerCap.DeviceDx = DX_MASK(D0) | DX_MASK(D3) |DX_MASK(D4);
        if (!CeSafeCopyMemory(pOutBuffer, &powerCap, sizeof(powerCap))) {
            SetLastError(ERROR_INVALID_PARAMETER);
            break;
        }
        rc = TRUE;
        break;

    // Request a change from one device power state to another.
    case IOCTL_POWER_SET:
        // Check input parameters
        if (pOutSize != NULL) *pOutSize = sizeof(CEDEVICE_POWER_STATE);
        if (
            pOutBuffer == NULL || outSize < sizeof(CEDEVICE_POWER_STATE) ||
            !CeSafeCopyMemory(&powerState, pOutBuffer, sizeof(powerState))
        ) {
            SetLastError(ERROR_INVALID_PARAMETER);
            break;
        }

        // Check for any valid power state.
        if (!VALID_DX(powerState)) {
            DEBUGMSG(ZONE_ERROR, (L"ERROR: BKL_IOControl: "
                L"Invalid power state 0x%08x\r\n", powerState
            ));
            break;
        }
        pDevice->ps = powerState;
        RefreshBKL(pDevice);
        if (!CeSafeCopyMemory(pOutBuffer, &pDevice->ps, sizeof(pDevice->ps))) {
            SetLastError(ERROR_INVALID_PARAMETER);
            break;
        }
        rc = TRUE;
        break;

    // Return the current device power state.
    case IOCTL_POWER_GET:
        // Check input parameters
        if (pOutSize != NULL) *pOutSize = sizeof(CEDEVICE_POWER_STATE);
        if (
            pOutBuffer == NULL || outSize < sizeof(CEDEVICE_POWER_STATE) ||
            !CeSafeCopyMemory(pOutBuffer, &pDevice->ps, sizeof(pDevice->ps))
        ) {
            SetLastError(ERROR_INVALID_PARAMETER);
            break;
        }
        rc = TRUE;
        break;
    case IOCTL_FORCEBKL_OFF:
    	pDevice->fForceOFF = *(BOOL *)pInBuffer;
    	RefreshBKL(pDevice);
        break;
    }

cleanUp:
    DEBUGMSG(ZONE_FUNCTION, (L"-BKL_IOControl(rc = %d)\r\n", rc));
    return rc;
}

//------------------------------------------------------------------------------
//
//  Function:  DllMain
//
//  Standard Windows DLL entry point.
//
BOOL __stdcall DllMain(HANDLE hDLL, DWORD reason, VOID *pReserved)
{
    switch (reason) {
    case DLL_PROCESS_ATTACH:
        DEBUGREGISTER(hDLL);
        DisableThreadLibraryCalls((HMODULE)hDLL);
        break;
    }
    return TRUE;
}

#ifndef BUILD_ULDR
void RefreshBKL(BKL_DEVICE *pDevice)
{
    CEDEVICE_POWER_STATE ps = pDevice->ps;
    BOOL TurnOn = FALSE;
    RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] Function Called: RefreshBKL\r\n"))); 
    if(pDevice->fForceOFF)
    {
        ps = D4;
    }


    switch(ps)
    {
    case D0:
        RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D0\r\n"))); 
        if(pDevice->Lastps != D0)
        {
            TurnOn = TRUE;
        }
        if(pDevice->JustChanged) 
        {
            RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D0 TURN ON\r\n"))); 
            OUTREG8(&g_pPWLMAPAddress->PWL_CTRL_REG, 0x01);
            OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, pDevice->dwBrightness);
            pDevice->Lastps = D0;
        }
        if(!TurnOn)
        {
            break;
        }
		if(pDevice->ACLineStatus == AC_LINE_ONLINE && pDevice->Lastps!=D4)
		{
			  if(pDevice->fACOnTap || pDevice->ACTimeout==0 )
           {
            RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D0 TURN ON\r\n"))); 
            OUTREG8(&g_pPWLMAPAddress->PWL_CTRL_REG, 0x01);
            OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, pDevice->dwBrightness);
            pDevice->Lastps = D0;
           }
			  else
           {
            RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D0 KEEP DIM\r\n"))); 
            OUTREG8(&g_pPWLMAPAddress->PWL_CTRL_REG, 0x01);
            OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, BACKLIGHTDIMLEVEL);
            pDevice->Lastps = D3;
           }
		}
		else if(pDevice->ACLineStatus != AC_LINE_ONLINE && pDevice->Lastps!=D4)
		{
			if(pDevice->fBattOnTap || pDevice->BatteryTimeout==0)
           {
            RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D0 TURN ON\r\n"))); 
            OUTREG8(&g_pPWLMAPAddress->PWL_CTRL_REG, 0x01);
            OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, pDevice->dwBrightness);
            pDevice->Lastps = D0;
           }
			  else
           {
            RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D0 KEEP DIM\r\n"))); 
            OUTREG8(&g_pPWLMAPAddress->PWL_CTRL_REG, 0x01);
            OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, BACKLIGHTDIMLEVEL);
            pDevice->Lastps = D3;
           }
		}
		else
		{
			RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D0 TURN ON\r\n"))); 
            OUTREG8(&g_pPWLMAPAddress->PWL_CTRL_REG, 0x01);
            OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, pDevice->dwBrightness);
            pDevice->Lastps = D0;
		}
        break;
    case D1:
    case D2:
    case D3:
        OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, BACKLIGHTDIMLEVEL);
        pDevice->Lastps = D3;
        break;
    case D4:
        RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D4\r\n"))); 
        OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, 0x00);
        pDevice->Lastps = D4;
        break;
    default:
        break;
    }
    pDevice->JustChanged = FALSE;
}
#endif
#ifdef BUILD_ULDR
void RefreshBKL(BKL_DEVICE *pDevice)
{
    CEDEVICE_POWER_STATE ps = pDevice->ps;
    switch(ps)
    {
    case D0:
        RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D0 KEEP DIM\r\n"))); 
        OUTREG8(&g_pPWLMAPAddress->PWL_CTRL_REG, 0x01);
        OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, pDevice->dwBrightness);
        break;
    case D1:
    case D2:
    case D3:
        OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, BACKLIGHTDIMLEVEL);
        break;
    case D4:
        RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] RefreshBKL: D4\r\n"))); 
        OUTREG8(&g_pPWLMAPAddress->PWL_LEVEL_REG, 0x00);
        break;
    default:
        break;
    }
}
#endif

#ifndef BUILD_ULDR
void BrightCallback(HREGNOTIFY hNotify, DWORD dwUserData, const PBYTE pData, const UINT cbData)
{
    BKL_DEVICE *pDevice = (BKL_DEVICE *)dwUserData;
    if(pData == 0)
    {
        return;
    }
    if(hNotify == pDevice->hACLineStatus)
    {
        pDevice->JustChanged = TRUE;
        pDevice->ACLineStatus = (*(DWORD*)pData);
    }
    else if(hNotify == pDevice->hBrightNotify)
    {
        pDevice->JustChanged = TRUE;
        pDevice->dwBrightness = (*(DWORD*)pData);
        RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] Brightness level changed to 0x%x \r\n"),pDevice->dwBrightness)); 
    }
    else if(hNotify == pDevice->hBattOnTapNotify)
    {
        RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] BattOnTap changed to 0x%x \r\n"),*(DWORD *)pData));
        pDevice->fBattOnTap = *(BOOL *)pData;
    }
    else if(hNotify == pDevice->hACOnTapNotify)
    {
        RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] ACOnTap changed to 0x%x \r\n"),*(DWORD *)pData));
        pDevice->fACOnTap = *(BOOL *)pData;
    }
	else if(hNotify == pDevice->hBatteryTimeoutNotify)
    {
        RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] BatteryTimeoutNotify changed to 0x%x \r\n"),*(DWORD *)pData));
		pDevice->BatteryTimeout= (*(DWORD*)pData);
    }
    else if(hNotify == pDevice->hACTimeoutNotify)
    {
        RETAILMSG(RETAILMSGZONE, (TEXT("[BKL] ACTimeoutNotify changed to 0x%x \r\n"),*(DWORD *)pData));
		pDevice->ACTimeout= (*(DWORD*)pData);
    }
    RefreshBKL(pDevice);
}

void CheckBacklightTimeout()
{
    DWORD val = 0;
    
    if(S_OK == RegistryGetDWORD(HKEY_CURRENT_USER, BACKLIGHT_SET_PATH,
                                BACKLIGHT_SET_BACKKEY, &val))
    {
        RegistrySetDWORD(HKEY_CURRENT_USER, BACKLIGHT_SET_PATH,
                         BACKLIGHT_SET_KEY, val);
    }
}
#endif

⌨️ 快捷键说明

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