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

📄 backlight.cpp

📁 Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	if(hUserActivityEvent)
        CloseHandle(hUserActivityEvent);

    DeleteCriticalSection(&cs);
    
    // Do BSP deinitialization
    BSPBacklightDeInit();
    // the device manager does not check the return code
    DEBUGMSG(ZONE_FUNCTION, (TEXT("-BKL_Deinit\r\n"), dwContext));
    
    return TRUE;
}

//------------------------------------------------------------------------------
//
//  FUNCTION:       BKL_Init 
//
//  DESCRIPTION:     
//  PARAMETERS:     
//
//  RETURNS:        
//
//------------------------------------------------------------------------------
extern "C" UINT32 BKL_Init(UINT32 dwContext)
{
    SYSTEM_POWER_STATUS_EX status; 
    MSGQUEUEOPTIONS msgOptions;   
    HKEY  hDriverKey;
    DWORD dwStatus;
    DWORD dwType;
    DWORD dwSize;


    DEBUGMSG(ZONE_FUNCTION, (TEXT("BKL_INIT() +!\r\n")) );
    
    InitializeCriticalSection(&cs);
    
    // get our activation information
    dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)dwContext, 0, 0, &hDriverKey);
    if(dwStatus != ERROR_SUCCESS)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("BKL_Init: OpenDeviceKey('%s') failed %u\r\n"), dwContext, dwStatus));
        goto InitErrCleanup;
    }
    else
    {
        dwSize = sizeof(szName);
        dwStatus = RegQueryValueEx(hDriverKey, DEVLOAD_DEVNAME_VALNAME, NULL, &dwType, (LPBYTE) szName, &dwSize);
        if(dwStatus != ERROR_SUCCESS || dwType != DEVLOAD_DEVNAME_VALTYPE)
        {
            DEBUGMSG(ZONE_ERROR, (TEXT("BKL_Init: RegQueryValueEx('%s', '%s') failed %u\r\n"),
                dwContext, DEVLOAD_DEVNAME_VALNAME, dwStatus));
            RegCloseKey(hDriverKey);
            goto InitErrCleanup;
        }
        DEBUGMSG(ZONE_INIT, (TEXT("device name is '%s'\r\n"), szName));
    }
    
    // Get current power status to determine timeout
    if(GetSystemPowerStatusEx(&status, TRUE))
    {
        if(status.ACLineStatus == 1)
            fACOnline = TRUE;
        else
            fACOnline = FALSE;
    }
    else
    {
        // Default to battery timeout
        fACOnline = FALSE;
    }
    // Default settings:
    //  enable backlight timeout, enable backlight on user activity
    bklSettings.dwACTimeout = BKL_DEFAULT_TIMEOUT;
    bklSettings.dwBattTimeout = BKL_DEFAULT_TIMEOUT;
    bklSettings.fBattTimeoutEnable = 1;
    bklSettings.fACTimeoutEnable = 1;
    bklSettings.fBattBacklightOnUser = 1;
    bklSettings.fACBacklightOnUser = 1;
    bklSettings.dwBattBacklightLevel = BKL_LEVEL_DEFAULT;
    bklSettings.dwACBacklightLevel = BKL_LEVEL_DEFAULT;

    // Get handles to desired events/msgQ etc.
    // Get handle to backlight timer change Event
    hWaitList[bklControlPanelEvent] = CreateEvent(NULL, FALSE, FALSE, L"BackLightChangeEvent" ) ; //event from Control Panel 
    if(!hWaitList[bklControlPanelEvent])
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("Get BackLightChangeEvent failed!!\r\n")));
        goto InitErrCleanup;
    }

    // Get handle to Power notification event
    msgOptions.dwSize = sizeof(MSGQUEUEOPTIONS);
    msgOptions.dwFlags = MSGQUEUE_ALLOW_BROKEN;
    msgOptions.dwMaxMessages = 0;
    msgOptions.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_PATH;
    msgOptions.bReadAccess = TRUE;
        
    // create message queue
    hMsgQ = CreateMsgQueue(NULL, &msgOptions);
    if(!hMsgQ)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("Create MsgQueue fail!!\n"), GetLastError()));
        goto InitErrCleanup;
    }
    else
    {
        hNotifications = RequestPowerNotifications(hMsgQ, PBT_POWERSTATUSCHANGE);
        if(!hNotifications)
        {
            DEBUGMSG(ZONE_ERROR, (TEXT("Request Power Notification fail!!\n"), GetLastError()));
            goto InitErrCleanup;
        }
        hWaitList[bklPowerNotificationEvent] = hMsgQ;
    }


    // Get handle to User Activity Event
        // Backup handle to user activity event.
    hUserActivityEvent = CreateEvent(NULL, FALSE, FALSE, L"PowerManager/UserActivity_Active");
    if(!hUserActivityEvent)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("Get User Activity Event failed!!\r\n")));
        goto InitErrCleanup;
    }
    
    hUserInactivityEvent = CreateEvent(NULL, FALSE, FALSE, L"PowerManager/UserActivity_Inactive");
    if(!hUserInactivityEvent)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("Get User Inactivity Event failed!!\r\n")));
        goto InitErrCleanup;
    }
        
    // Create a dummy event that will never be signaled.
    hevDummy = CreateEvent(NULL, FALSE, FALSE, NULL);
    if(!hevDummy)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("Create dummy event failed!!\r\n")));
        goto InitErrCleanup;
    }
    hWaitList[bklUserInactivityEvent] = hUserInactivityEvent;

    // Get handle to backlight level change event
    hWaitList[bklLevelChangeEvent] = CreateEvent(NULL, FALSE, FALSE, L"BackLightLevelChangeEvent" );
    if(!hWaitList[bklLevelChangeEvent])
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("Get BackLightLevelChangeEvent failed!!\r\n")));
        goto InitErrCleanup;
    }
    // Do BSP initialization
    BSPBacklightInit();
    // Init device power state to D0
    CurDx = D0;

    DEBUGMSG(ZONE_INIT, (TEXT("BKL_Init: CreateThread\r\n")));
    fIntrThreadLoop = TRUE;
    ghInterruptServiceThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)BKL_IntrThread, NULL, 0, NULL);
    if(ghInterruptServiceThread == NULL)
    {
        DEBUGMSG(1, (TEXT("BKL_Init: Failed to create BLD Interrupt Service Thread\r\n")));
        goto InitErrCleanup;
    }
    
    DEBUGMSG(ZONE_FUNCTION, (TEXT("BKL_INIT() -!\r\n")) );
    return 1;   

InitErrCleanup:
    if(hDriverKey)
        RegCloseKey(hDriverKey);

    BKL_Deinit(dwContext);
    DEBUGMSG(ZONE_FUNCTION, (TEXT("BKL_INIT() -!\r\n")) );
    return 0; 
}

//------------------------------------------------------------------------------
//
//  FUNCTION:       BKL_IOControl
//
//  DESCRIPTION:      
//  PARAMETERS:     
//
//  RETURNS:        
//
//------------------------------------------------------------------------------
extern "C" BOOL
BKL_IOControl(
    DWORD  dwContext,
    DWORD  Ioctl,
    PUCHAR pInBuf,
    DWORD  InBufLen, 
    PUCHAR pOutBuf,
    DWORD  OutBufLen,
    PDWORD pdwBytesTransferred
   )
{
    DWORD  dwErr = ERROR_INVALID_PARAMETER;
    BOOL   bRc = FALSE;

    BKL_FUNCTION_ENTRY();
#ifdef DEBUG
    TCHAR  szBuf[128];
    LPTSTR pszFname;
    
    // format the routine name
    _stprintf(szBuf, TEXT("BKL_IOControl(%08x)"), dwContext);
    pszFname = szBuf;
#endif  
    
    DEBUGMSG(ZONE_INFO, (TEXT("%s: IOCTL:0x%x, InBuf:0x%x, InBufLen:%d, OutBuf:0x%x, OutBufLen:0x%x)\r\n"),
        pszFname, Ioctl, pInBuf, InBufLen, pOutBuf, OutBufLen));
    switch(Ioctl)
    {
        case IOCTL_POWER_CAPABILITIES:
            // tell the power manager about ourselves.
            DEBUGMSG(ZONE_INFO, (TEXT("%s: BKL_IOCTL_POWER_CAPABILITIES\r\n"), pszFname));
            if( pOutBuf != NULL && 
                OutBufLen >= sizeof(POWER_CAPABILITIES) && 
                pdwBytesTransferred != NULL)
            {
                PPOWER_CAPABILITIES ppc = (PPOWER_CAPABILITIES) pOutBuf;
                memset(ppc, 0, sizeof(POWER_CAPABILITIES));
                ppc->DeviceDx = 0x11;   // support D0, D4
                ppc->WakeFromDx = 0x00; // No wake capability
                ppc->InrushDx = 0x00;       // No in rush requirement
                ppc->Power[D0] = 600;                   // 0.6W
                ppc->Power[D1] = PwrDeviceUnspecified;
                ppc->Power[D2] = PwrDeviceUnspecified;
                ppc->Power[D3] = PwrDeviceUnspecified;
                ppc->Power[D4] = 0;
                ppc->Latency[D0] = 0;
                ppc->Latency[D1] = PwrDeviceUnspecified;
                ppc->Latency[D2] = PwrDeviceUnspecified;
                ppc->Latency[D3] = PwrDeviceUnspecified;
                ppc->Latency[D4] = 0;
                ppc->Flags = 0;
                *pdwBytesTransferred = sizeof(POWER_CAPABILITIES);
                dwErr = ERROR_SUCCESS;
            }
            break;
        
        case IOCTL_POWER_QUERY: 
            DEBUGMSG(ZONE_INFO, (TEXT("%s: BKL_IOCTL_POWER_QUERY\r\n"), pszFname));
            if( pOutBuf != NULL && 
                OutBufLen == sizeof(CEDEVICE_POWER_STATE) && 
                pdwBytesTransferred != NULL)
            {
                CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE)pOutBuf;
                DEBUGMSG(ZONE_INFO, (TEXT("NewDx = %d\r\n"), NewDx));

                if(VALID_DX(NewDx))
                {
                    // this is a valid Dx state so return a good status
                    *pdwBytesTransferred = sizeof(CEDEVICE_POWER_STATE);
                    dwErr = ERROR_SUCCESS;
                }
                DEBUGMSG(ZONE_INFO, (TEXT("%s: IOCTL_POWER_QUERY %u %s\r\n"), pszFname, 
                        NewDx, dwErr == ERROR_SUCCESS ? TEXT("succeeded") : TEXT("failed")));
            }
            break;
        
        case IOCTL_POWER_SET: 
            DEBUGMSG(ZONE_INFO, (TEXT("%s: BKL_IOCTL_POWER_SET\r\n"), pszFname));
            if( pOutBuf != NULL && 
                OutBufLen == sizeof(CEDEVICE_POWER_STATE) && 
                pdwBytesTransferred != NULL)
            {
                CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE)pOutBuf;
                DEBUGMSG(ZONE_INFO, (TEXT("NewDx = %d\r\n"), NewDx));
                if(NewDx != CurDx)
                {
                    if(NewDx == D0)
                    {
                        // TURN ON BACKLIGHT
                        if(fACOnline)
                            BSPBacklightSetIntensity(bklSettings.dwACBacklightLevel);
                        else
                            BSPBacklightSetIntensity(bklSettings.dwBattBacklightLevel);
                       DEBUGMSG(ZONE_INFO, (TEXT("BackLight ON\r\n"))); 
                    
                   
                    }
                    else
                    {
                        // if asked for a state we don't support, go to the next lower one
                        // which is D4
                        NewDx = D4;
                        BSPBacklightSetIntensity(0);
                        DEBUGMSG(ZONE_INFO, (TEXT("BackLight Off\r\n")));
                    }
                    EnterCriticalSection(&cs) ;
                    CurDx = NewDx;
                    LeaveCriticalSection(&cs);
                    *(PCEDEVICE_POWER_STATE)pOutBuf = CurDx;
                }
                *pdwBytesTransferred = sizeof(CEDEVICE_POWER_STATE);
                DEBUGMSG(ZONE_INFO, (TEXT("CurDx = %d\r\n"), CurDx));
                dwErr = ERROR_SUCCESS;
            }
            break;
        
        case IOCTL_POWER_GET: 
            DEBUGMSG(ZONE_INFO, (TEXT("%s: BKL_IOCTL_POWER_GET\r\n"), pszFname));
            if( pOutBuf != NULL && 
                OutBufLen == sizeof(CEDEVICE_POWER_STATE) && 
                pdwBytesTransferred != NULL)
            {
                // just return our CurrentDx value
                *(PCEDEVICE_POWER_STATE)pOutBuf = CurDx;
                *pdwBytesTransferred = sizeof(CEDEVICE_POWER_STATE);
                dwErr = ERROR_SUCCESS;
            }
            break;
            
        default:
            DEBUGMSG(ZONE_ERROR, (TEXT("%s: Unsupported IOCTL code %u\r\n"), pszFname, Ioctl));
            dwErr = ERROR_NOT_SUPPORTED;
            break;
    }
    
    // pass back appropriate response codes
    SetLastError(dwErr);
    if(dwErr != ERROR_SUCCESS)
        bRc = FALSE;
    else
        bRc = TRUE;
    BKL_FUNCTION_EXIT();    
    return bRc;
}

//------------------------------------------------------------------------------
//
//  FUNCTION:       BKL_DllEntry

⌨️ 快捷键说明

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