`
dato0123
  • 浏览: 914511 次
文章分类
社区版块
存档分类
最新评论

软开关设计漫谈_软件篇

 
阅读更多

//========================================================================
//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端,所以系统还是无法关闭。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics