软开关设计漫谈_软件篇

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

posted @ 2009-05-21 18:19  我的一天  阅读(178)  评论(0编辑  收藏  举报