软开关设计漫谈_软件篇
//========================================================================
//TITLE:
// 软开关设计漫谈_软件篇
//AUTHOR:
// norains
//DATE:
// Sunday 19-may-2009
//Environment:
// WINDOWS CE 5.0
//========================================================================
相对于硬件来说,软开关的软件代码更为简单,只需要检测DETECT_KEY即可。该功能的实现主要是通过GPIO,而wince并没有对GPIO做上层定义,并且每款CPU的GPIO的操作方式又各自不同,所以本文无法给出一个完整可用的代码,只能用伪代码作为示例讲解。虽然是伪代码,但对于了解其流程还是有一定的意义。
void Power_On()
{
...
//设置GPIO_SHDN为high
SetGPIO_HIGH(GPIO_SHDN);
...
}
DWORD PWR_IntrThread(PVOID pParam)
{
....
//使能中断
EnableInterrupt();
//初始化中断
InterruptInitialize(btnSysIntr, hNotifyEvent, 0, 0)
while(TRUE)
{
//等待中断事件
dwRet = WaitForSingleObject(hNotifyEvent, INFINITE);
if(dwRet == WAIT_OBJECT_0)
{
//中断处理完毕,让中断再次进入处理
InterruptDone(btnSysIntr);
//再次等待中断处理事件
dwRet = WaitForSingleObject(hNotifyEvent, 1000);
if(dwRet == WAIT_TIMEOUT)
{
//当其位WAIT_TIMEOUT时,意味着为长按,进入poweroff函数
EnterPowerOff();
}
}
}
....
}
void EnterPowerOff()
{
...
while(TRUE)
{
if(IsGPIOHigh(GPIO_DETECT_KEY) != FALSE)
{
//S1已经松开,跳出循环
break;
}
}
//关闭系统电源
SetGPIO_LOW(GPIO_SHDN);
...
}
这里唯一需要注意的是EnterPowerOff函数,在这里必须要检测S1是否已经松开。如果还没有松开S1就将GPIO_SHDN置为LOW,因为S1端还有VDD33D电压输入到PWR_ON端,所以系统还是无法关闭。