6410平台下的wince6系统,在应用层中使用SetSystemPowerState api函数关机发现无效。
应用层调用如下:
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之前加上这么一段:
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之前添加以下处理:
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 来进行关机
在此记录一下