以前平台的定时关机是利用wince自带的定时休眠部分代码实现的,同事老是说定时关机时间不准确,所以花了点时间,写了个简单的驱动。
具体看下面的代码:
- #include <windows.h>
- #include "s2410.h"
- //#include <excpt.h> //try
- #define MAXACTIVITYTIMEOUT (0xFFFFFFFF / 1000) // in seconds
- static HANDLE gThread;
- void ExitWince()
- {
- //关机
- static volatile IOPreg * v_pIOPregs;
- v_pIOPregs = (volatile IOPreg *)IOP_BASE;
- v_pIOPregs->rGPBCON &= ~(3 << 4);
- v_pIOPregs->rGPBCON |= (1 << 4);
- v_pIOPregs->rGPBDAT &= ~(1 << 2);
- Sleep(15);
- v_pIOPregs->rGPBDAT |= (1 << 2);
- }
- BOOL GetAutoPowerOffTime(BYTE *Buffer)
- {
- HKEY hResult;
- LONG lRet;
- LPWSTR lpSubKey = _T("//System//CurrentControlSet//Control//Power//Timeouts");
- DWORD size = sizeof(Buffer);
- lRet =RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpSubKey,0,KEY_ALL_ACCESS,&hResult);
- if (lRet != ERROR_SUCCESS)
- {
- return FALSE;
- }
- lRet = RegQueryValueEx(hResult,_T("ACUserIdle"), NULL, NULL, (LPBYTE)Buffer, &size);
- if(lRet != ERROR_SUCCESS)
- {
- return FALSE;
- }
- RegCloseKey(hResult);
- return TRUE;
- }
- DWORD GetPowerOffTime()
- {
- DWORD ACUserIdleTimeout;
- if(GetAutoPowerOffTime((byte *)&ACUserIdleTimeout))
- {
- if(ACUserIdleTimeout == 0)
- {
- ACUserIdleTimeout = INFINITE;
- }
- else
- {
- if(ACUserIdleTimeout > MAXACTIVITYTIMEOUT)
- {
- ACUserIdleTimeout = MAXACTIVITYTIMEOUT;
- }
- }
- //转成毫秒
- if(ACUserIdleTimeout != INFINITE)
- {
- ACUserIdleTimeout *= 1000;
- }
- }
- else
- {
- ACUserIdleTimeout=INFINITE;
- }
- return ACUserIdleTimeout;
- }
- DWORD EventThread(PVOID pArg)
- {
- DWORD dwResult;
- DWORD dwTimeout=INFINITE;
- HANDLE gEvent[2];
- //创建事件
- gEvent[0] = CreateEvent(NULL, FALSE, FALSE, L"PowerOffTimeOutChange");
- gEvent[1] = CreateEvent(NULL, FALSE, FALSE, L"UserInputEvent");
- //读自动关机时间
- dwTimeout = GetPowerOffTime();
- while (1)
- {
- dwResult = WaitForMultipleObjects(2,gEvent,FALSE, dwTimeout );
- if (dwResult == WAIT_TIMEOUT)
- {
- ExitWince();
- }
- else
- {
- if (dwResult ==WAIT_OBJECT_0)
- {
- //时间修改,需要重读
- dwTimeout = GetPowerOffTime();
- }
- }
- }
- return 0;
- }
- DWORD APO_Init(DWORD dwContext)
- {
- DWORD IDThread;
- do
- {
- gThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)EventThread , 0, 0, &IDThread);
- if (gThread == 0)
- {
- break;
- }
- } while (0);
- return (TRUE);
- }
- BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
- {
- switch ( dwReason )
- {
- case DLL_PROCESS_ATTACH:
- DisableThreadLibraryCalls((HMODULE) hInstDll);
- break;
- }
- return (TRUE);
- }
- BOOL APO_Close( DWORD Handle )
- {
- return TRUE;
- }
- BOOL APO_Deinit( DWORD dwContext )
- {
- return TRUE;
- }
- DWORD APO_Open(
- DWORD dwData,
- DWORD dwAccess,
- DWORD dwShareMode
- )
- {
- return 0;
- }
- BOOL APO_IOControl(
- DWORD Handle,
- DWORD dwIoControlCode,
- PBYTE pInBuf,
- DWORD nInBufSize,
- PBYTE pOutBuf,
- DWORD nOutBufSize,
- PDWORD pBytesReturned
- )
- {
- return FALSE;
- }
- DWORD APO_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
- {
- return 0;
- }
- DWORD APO_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
- {
- return 0;
- }
- DWORD APO_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
- {
- return 0;
- }
- void APO_PowerUp(void)
- {
- return;
- }
- void APO_PowerDown(void)
- {
- return;
- }