6410平台下的wince6系統,在應用程式層中使用SetSystemPowerState api函數關機發現無效。
應用程式層調用如下:
[cpp] view
plaincopy
- SetSystemPowerState(NULL, POWER_STATE_OFF, POWER_FORCE);
註:該調用需要引用pm.h標頭檔,該標頭檔在wince600目錄下可找到,同時需要使用#pragma comment(lib, "coredll.lib")來引用靜態庫
跟蹤pm電源管理驅動發現,傳進來的POWER_STATE_OFF的參數在某個地方被屏蔽掉了,沒有接著往下走。由於跳轉調用的太多了,無法準確定位到哪裡屏蔽掉了。而且就算是定位到了要修改PM驅動也會很麻煩。所以就找到了PlatformSendSystemPowerState()這個位置。只要在這下面,針對POWER_STATE_OFF的情況進行處理即可。我的處理方法是,直接在這個地方調用到PowerButton的驅動,去進行關機處理。因為在這個PM驅動下無法控制到GPIO,所以就打算直接調用驅動介面來控制。
具體修改如下:
1、修改C:\WINCE600\public\common\oak\drivers\pm\pdd\default\platform.cpp檔案中的DWORD WINAPI PlatformSendSystemPowerState(LPCWSTR pwsState, DWORD dwStateHint, DWORD dwOptions)函數。
在return之前加上這麼一段:
[cpp] view
plaincopy
- if(dwStateHint == POWER_STATE_OFF){
- HANDLE h = CreateFile(L"PWR1:",GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,0 );
- if(h != INVALID_HANDLE_VALUE){
- DeviceIoControl(h, 0x0, NULL, 0, NULL, 0, NULL, NULL);
- CloseHandle(h);
- }
- }
2、在PowerButton驅動中添加相應的關機控制處理:
修改C:\WINCE600\PLATFORM\SMDK6410\src\drivers\PowerButton\PowerButton.c檔案中的PWR_IOControl()函數。
在return之前添加以下處理:
[cpp] view
plaincopy
- if(dwCode == 0x0){// power off
- RETAILMSG(1, (TEXT("*** [PWR] PWR_IOControl dwCode:%#x ***\r\n"), dwCode) );
- pSysConReg->INFORM2 = 0x55555555; //flag indicate entering sleep mode
- SetSystemPowerState(NULL, POWER_STATE_SUSPEND, 0);
- return TRUE;
- }
上述都修改完後,把這兩個驅動rebuild以下,然後再對整個工程進行build and sysgen。
已經測試通過,使用者可以在應用程式層通過SetSystemPowerState 來進行關機
在此記錄一下