解决6410 WINCE6 应用层调用SetSystemPowerState api关机无效的问题
2012-07-25 11:22
821 查看
6410平台下的wince6系统,在应用层中使用SetSystemPowerState api函数关机发现无效。
应用层调用如下:
注:该调用需要引用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之前加上这么一段:
2、在PowerButton驱动中添加相应的关机控制处理:
修改C:\WINCE600\PLATFORM\SMDK6410\src\drivers\PowerButton\PowerButton.c文件中的PWR_IOControl()函数。
在return之前添加以下处理:
上述都修改完后,把这两个驱动rebuild以下,然后再对整个工程进行build and sysgen。
已经测试通过,用户可以在应用层通过SetSystemPowerState 来进行关机
在此记录一下
应用层调用如下:
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 来进行关机
在此记录一下
相关文章推荐
- 解决6410 WINCE6 应用层调用SetSystemPowerState api关机无效的问题
- wince6.0电源管理之应用程序调用SetSystemPowerState的执行过程
- Android应用中clearFocus方法调用无效的问题解决
- 安卓:调用真正系统默认短信应用发短信. (含解决4.4系统环聊问题, 含调低版本apk调用高版本系统api)
- 怎么解决操作无效,原因是它导致对 SetCurrentCellAddressCore 函数的可重入调用问题
- wince6.0电源管理之应用程序调用SetSystemPowerState的执行过程
- iOS xcode8提交 iOS10 “此构建版本无效” (已解决)(调用 私有api问题)
- wince6.0电源管理之应用程序调用SetSystemPowerState的执行过程
- Android应用中clearFocus方法调用无效的问题解决
- Android应用中调用输入法后界面调整问题的解决
- 解决system调用返回ECHILD的问题
- 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释
- Ubuntu下解决IDEA与Maven的配置问题:Dmaven.multiModuleProjectDirectory system property is not set
- (原创)Modelsim的“The system date appears to have been set back.Cannot continue”问题的解决办法
- iOS 7.1企业应用证书无效问题(已解决)
- ArcGIS server for .net 中应用API for flex 问题解决办法
- struts2.5 使用感叹号和通配符实现动态方法调用无效的问题及解决!
- 关于react this.setState is not a function 的报错问题解决
- 解决-Dmaven.multiModuleProjectDirectory system property is not set 的问题