wince的定时关机驱动

以前平台的定时关机是利用wince自带的定时休眠部分代码实现的,同事老是说定时关机时间不准确,所以花了点时间,写了个简单的驱动。

 

具体看下面的代码:

  1. #include <windows.h>
  2. #include "s2410.h"
  3. //#include <excpt.h> //try 
  4. #define MAXACTIVITYTIMEOUT              (0xFFFFFFFF / 1000)  // in seconds
  5. static HANDLE gThread;
  6. void ExitWince()
  7. {
  8.     //关机
  9.     static volatile IOPreg * v_pIOPregs;
  10.     v_pIOPregs = (volatile IOPreg *)IOP_BASE;
  11.     v_pIOPregs->rGPBCON &= ~(3 << 4);
  12.     v_pIOPregs->rGPBCON |= (1 << 4);
  13.     v_pIOPregs->rGPBDAT &= ~(1 << 2); 
  14.     Sleep(15);
  15.     v_pIOPregs->rGPBDAT |= (1 << 2); 
  16. }
  17. BOOL GetAutoPowerOffTime(BYTE *Buffer)
  18. {
  19.     HKEY  hResult;
  20.     LONG  lRet;
  21.     LPWSTR lpSubKey = _T("//System//CurrentControlSet//Control//Power//Timeouts");
  22.     DWORD size = sizeof(Buffer);
  23.     lRet =RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpSubKey,0,KEY_ALL_ACCESS,&hResult); 
  24.     if (lRet != ERROR_SUCCESS)
  25.     {
  26.         return FALSE;
  27.     }
  28.     lRet = RegQueryValueEx(hResult,_T("ACUserIdle"), NULL, NULL, (LPBYTE)Buffer, &size);
  29.     if(lRet != ERROR_SUCCESS)
  30.     {   
  31.         return FALSE;
  32.     }
  33.     RegCloseKey(hResult);
  34.     return TRUE;
  35. }
  36. DWORD GetPowerOffTime()
  37. {
  38.     DWORD ACUserIdleTimeout;
  39.         if(GetAutoPowerOffTime((byte *)&ACUserIdleTimeout))
  40.     {
  41.         if(ACUserIdleTimeout == 0) 
  42.         {
  43.             ACUserIdleTimeout = INFINITE;
  44.         } 
  45.         else 
  46.         {
  47.             if(ACUserIdleTimeout > MAXACTIVITYTIMEOUT) 
  48.             {
  49.                 ACUserIdleTimeout = MAXACTIVITYTIMEOUT;
  50.             }
  51.         }
  52.         //转成毫秒
  53.         if(ACUserIdleTimeout != INFINITE) 
  54.         {
  55.             ACUserIdleTimeout *= 1000;
  56.         }
  57.     }
  58.     else
  59.     {
  60.         ACUserIdleTimeout=INFINITE;
  61.     }
  62.     return ACUserIdleTimeout;
  63. }
  64. DWORD EventThread(PVOID pArg)
  65. {
  66.     DWORD   dwResult;
  67.     DWORD   dwTimeout=INFINITE;
  68.     HANDLE  gEvent[2];
  69.     
  70.     //创建事件
  71.     gEvent[0] = CreateEvent(NULL, FALSE, FALSE, L"PowerOffTimeOutChange");
  72.     gEvent[1] = CreateEvent(NULL, FALSE, FALSE, L"UserInputEvent");
  73.         //读自动关机时间
  74.     dwTimeout = GetPowerOffTime(); 
  75.     while (1) 
  76.     {
  77.         dwResult = WaitForMultipleObjects(2,gEvent,FALSE, dwTimeout );
  78.         if (dwResult == WAIT_TIMEOUT) 
  79.         {
  80.             ExitWince();
  81.         }
  82.         else
  83.         {
  84.             if (dwResult ==WAIT_OBJECT_0)
  85.             {
  86.                 //时间修改,需要重读
  87.                 dwTimeout = GetPowerOffTime(); 
  88.             }
  89.         }
  90.     } 
  91.     return 0;           
  92. }
  93. DWORD APO_Init(DWORD dwContext)
  94. {
  95.     DWORD   IDThread;
  96.     do 
  97.     {
  98.         gThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)EventThread , 0, 0, &IDThread);
  99.         if (gThread == 0) 
  100.         {
  101.             break;
  102.         }
  103.     } while (0);
  104.     return (TRUE);
  105. }
  106. BOOL WINAPI  DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
  107. {
  108.     switch ( dwReason ) 
  109.     {
  110.     case DLL_PROCESS_ATTACH:
  111.         DisableThreadLibraryCalls((HMODULE) hInstDll);
  112.         break;
  113.     }
  114.     return (TRUE);
  115. }
  116. BOOL APO_Close( DWORD Handle )
  117. {
  118.     return TRUE;
  119. }   
  120. BOOL  APO_Deinit( DWORD dwContext )
  121. {
  122.     return TRUE;
  123. }   
  124. DWORD  APO_Open(
  125.          DWORD dwData,
  126.          DWORD dwAccess,
  127.          DWORD dwShareMode
  128.          )
  129. {
  130.     return 0;
  131. }    
  132. BOOL  APO_IOControl(
  133.               DWORD Handle,
  134.               DWORD dwIoControlCode,
  135.               PBYTE pInBuf,
  136.               DWORD nInBufSize,
  137.               PBYTE pOutBuf,
  138.               DWORD nOutBufSize,
  139.               PDWORD pBytesReturned
  140.               )
  141. {
  142.     return FALSE;
  143. }    
  144. DWORD APO_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
  145. {
  146.     return 0;
  147. }
  148. DWORD APO_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
  149. {
  150.     return 0;
  151. }
  152. DWORD APO_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
  153. {
  154.     return 0;
  155. }
  156. void APO_PowerUp(void)
  157. {
  158.     return;
  159. }
  160. void APO_PowerDown(void)
  161. {
  162.     return;
  163. }

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SPI(Serial Peripheral Interface)是一种用于设备间通信的串行总线协议。在Windows CE(Wince)操作系统中,SPI驱动是一种控制和管理SPI接口设备的软件模块。下面是关于Wince下SPI驱动的回答: Spi驱动Wince操作系统中用于控制和管理SPI设备的驱动程序。SPI总线是一种串行通信协议,常用于嵌入式系统中,通过该驱动程序可以实现与其他设备的高速通信。 Wince下的SPI驱动提供了对SPI接口的底层控制和管理功能。它允许操作系统与连接在SPI总线上的外设进行数据交换。SPI驱动负责配置和初始化SPI总线、传输数据、进行中断处理等操作。 Wince下的SPI驱动由操作系统提供,并且可以通过SPI函数库进行调用。应用程序可以通过调用特定的API函数与SPI驱动进行交互,并实现与SPI设备的通信。SPI驱动提供了一组API函数,用于设置SPI总线的工作模式、传输数据、控制引脚等。应用程序可以通过这些函数来完成对SPI设备的操作。 SPI驱动Wince中的使用具有很高的灵活性和可扩展性。可以通过配置SPI驱动参数来适配不同的SPI设备。同时,SPI驱动还支持中断处理,可以实现实时响应和高效的数据传输。 总之,Wince下的SPI驱动是一种用于控制和管理SPI接口设备的软件模块,它提供了与SPI设备进行高速通信的功能,并具有灵活性和可扩展性,可以满足各种不同的应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值