www.pudn.com > 2410winceCE_l80t64.rar > bak_io.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. // /* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. */ #include#include #include "pmplatform.h" #include "bak_hw.h" // Global structure extern BLStruct g_BLInfo; extern HANDLE g_evtSignal[NUM_EVENTS]; DWORD BAK_Init(DWORD dwContext) { HANDLE hThread; DWORD dwThreadID; RETAILMSG(1, (TEXT("BAK_Init: dwContext = 0x%x\r\n"), dwContext)); // Perform all one-time initialization of the backlight if (!BacklightInitialize()) { RETAILMSG(1, (TEXT("BAK_Init:couldn't initialize backlight hardware \r\n"))); return 0; } // Create the backlight service thread hThread = CreateThread(NULL, 0, BL_MonitorThread, NULL, 0, &dwThreadID); if (hThread == NULL) { RETAILMSG(1, (TEXT("BAK_Init: failed to create BL_MonitorThread\r\n"))); return 0; } return dwThreadID; } BOOL BAK_Deinit(DWORD dwContext) { BL_Deinit(); return TRUE; } DWORD BAK_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode) { return dwData; } BOOL BAK_Close(DWORD Handle) { return TRUE; } void BAK_PowerDown(void) { BL_On(FALSE); } void BAK_PowerUp(void) { BL_PowerOn(TRUE); } DWORD BAK_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes) { return 0; } DWORD BAK_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes) { return 0; } DWORD BAK_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod) { return (DWORD) -1; } BOOL BAK_IOControl( DWORD Handle, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut ) { BOOL RetVal = TRUE; DWORD dwErr = ERROR_SUCCESS; switch (dwCode) { RETAILMSG(1, (TEXT("BAK_IOControl: Handle = 0x%x, dwCode = 0x%x\r\n"), Handle, dwCode)); RETAILMSG(1, (TEXT(" pBufIn = 0x%x, dwLenIn = 0x%x\r\n"), pBufIn, dwLenIn)); RETAILMSG(1, (TEXT(" pOutBuf = 0x%x, dwLenOut = 0x%x\r\n"), pBufOut, dwLenOut)); RETAILMSG(1, (TEXT(" pdwActualOut = 0x%x\r\n"), pdwActualOut)); // // Power Management // case IOCTL_POWER_CAPABILITIES: { PPOWER_CAPABILITIES ppc; RETAILMSG(1, (TEXT("BAK: IOCTL_POWER_CAPABILITIES\r\n"))); if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(POWER_CAPABILITIES)) ) { RetVal = FALSE; dwErr = ERROR_INVALID_PARAMETER; break; } ppc = (PPOWER_CAPABILITIES)pBufOut; memset(ppc, 0, sizeof(POWER_CAPABILITIES)); // support D0, D4 ppc->DeviceDx = 0x11; // Report our power consumption in uAmps rather than mWatts. ppc->Flags = POWER_CAP_PREFIX_MICRO | POWER_CAP_UNIT_AMPS; // 25 m = 25000 uA // TODO: find out a more accurate value ppc->Power[D0] = 25000; *pdwActualOut = sizeof(POWER_CAPABILITIES); } break; case IOCTL_POWER_SET: { CEDEVICE_POWER_STATE NewDx; if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(CEDEVICE_POWER_STATE)) ) { RetVal = FALSE; dwErr = ERROR_INVALID_PARAMETER; break; } NewDx = *(PCEDEVICE_POWER_STATE)pBufOut; if ( VALID_DX(NewDx) ) { switch ( NewDx ) { case D0: // Power changed, we need to notify the monitor thread to resync // the timer SetEvent(g_evtSignal[BL_POWEREVT]); BL_On(TRUE); break; default: BL_On(FALSE); break; } RETAILMSG(1, (TEXT("BAK: IOCTL_POWER_SET: D%u \r\n"), NewDx)); *pdwActualOut = sizeof(CEDEVICE_POWER_STATE); } else { RetVal = FALSE; dwErr = ERROR_INVALID_PARAMETER; } } break; case IOCTL_POWER_GET: if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(CEDEVICE_POWER_STATE)) ) { RetVal = FALSE; dwErr = ERROR_INVALID_PARAMETER; break; } CEDEVICE_POWER_STATE Dx; if (g_BLInfo.m_dwStatus == BL_ON){ Dx = D4; } else { Dx = D0; } *(PCEDEVICE_POWER_STATE)pBufOut = Dx; RETAILMSG(1, (TEXT("USB_SER: IOCTL_POWER_GET: D%u \r\n"), Dx)); *pdwActualOut = sizeof(CEDEVICE_POWER_STATE); break; default: RetVal = FALSE; RETAILMSG(1, (TEXT(" Unsupported ioctl 0x%X\r\n"), dwCode)); break; } return(RetVal); } BOOL WINAPI DllMain( HANDLE hinstDll, DWORD dwReason, LPVOID lpReserved ) { switch(dwReason) { case DLL_PROCESS_ATTACH: // RETAILMSG(1, (TEXT("BAK_DllMain: DLL_PROCESS_ATTACH\r\n"))); break; case DLL_PROCESS_DETACH: // RETAILMSG(1, (TEXT("BAK_DllMain: DLL_PROCESS_DETACH\r\n"))); break; } return TRUE; }