解决6410 WINCE6 应用层调用SetSystemPowerState api关机无效的

6410平台下的wince6系统,,在应用层中使用SetSystemPowerState api函数关机发现无效。

应用层调用如下:

[cpp]view plain

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 plain

if(dwStateHint==POWER_STATE_OFF){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 plain

RETAILMSG(1,(TEXT("***[PWR]PWR_IOControldwCode:%#x***\r\n"),dwCode));pSysConReg->INFORM2=0x55555555;//flagindicateenteringsleepmodeSetSystemPowerState(NULL,POWER_STATE_SUSPEND,0);returnTRUE;}

上述都修改完后,把这两个驱动rebuild以下,然后再对整个工程进行build and sysgen。

已经测试通过,用户可以在应用层通过SetSystemPowerState 来进行关机

在此记录一下

今天不想走,明天就要跑了。

解决6410 WINCE6 应用层调用SetSystemPowerState api关机无效的

相关文章:

你感兴趣的文章:

标签云: