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

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

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 来进行关机


在此记录一下