6410平台下的wince6系统,在应用层中使用SetSystemPowerState api函数关机发现无效。
应用层调用如下:
SetSystemPowerState(NULL, POWER_STATE_OFF, POWER_FORCE);
跟踪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之前加上这么一段:
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); } }
修改C:\WINCE600\PLATFORM\SMDK6410\src\drivers\PowerButton\PowerButton.c文件中的PWR_IOControl()函数。
在return之前添加以下处理:
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; }
已经测试通过,用户可以在应用层通过SetSystemPowerState 来进行关机
在此记录一下