如何设置通过PMU的gpio来唤醒系统

假设你要设置pmu(axp209)  的gpio3来唤醒系统。
1、修改linux-3.0/drivers/power/axp_power_axp-sply.h,这个文件里面定义了一个AXP20_NOTIFIER_ON这个变量,我们要加上跟GPIO3相关的内容上去:
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
AXP20_IRQ_USBIN |
        AXP20_IRQ_USBRE |
      //AXP20_IRQ_USBLO |
      //AXP20_IRQ_ACOV |
      AXP20_IRQ_ACIN |
      AXP20_IRQ_ACRE |
      //AXP20_IRQ_TEMOV |
      //AXP20_IRQ_TEMLO |
      AXP20_IRQ_BATIN |
      AXP20_IRQ_BATRE |
      //AXP20_IRQ_PEKLO |
      //AXP20_IRQ_PEKSH |
      AXP20_IRQ_CHAST |
      AXP20_IRQ_PEKFE |
      AXP20_IRQ_CHAOV |
      AXP20_IRQ_GPIO3TG | //add by laotie121022 这个是我新添加i的
      AXP20_IRQ_PEKRE ;
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
AXP20_IRQ_USBIN |
        AXP20_IRQ_USBRE |
      //AXP20_IRQ_USBLO |
      //AXP20_IRQ_ACOV |
      AXP20_IRQ_ACIN |
      AXP20_IRQ_ACRE |
      //AXP20_IRQ_TEMOV |
      //AXP20_IRQ_TEMLO |
      AXP20_IRQ_BATIN |
      AXP20_IRQ_BATRE |
      //AXP20_IRQ_PEKLO |
      //AXP20_IRQ_PEKSH |
      AXP20_IRQ_CHAST |
      AXP20_IRQ_PEKFE |
      AXP20_IRQ_CHAOV |
      AXP20_IRQ_GPIO3TG | //add by laotie121022 这个是我新添加i的
      AXP20_IRQ_PEKRE ;
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
AXP20_IRQ_USBIN |
        AXP20_IRQ_USBRE |
      //AXP20_IRQ_USBLO |
      //AXP20_IRQ_ACOV |
      AXP20_IRQ_ACIN |
      AXP20_IRQ_ACRE |
      //AXP20_IRQ_TEMOV |
      //AXP20_IRQ_TEMLO |
      AXP20_IRQ_BATIN |
      AXP20_IRQ_BATRE |
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
AXP20_IRQ_USBIN |
        AXP20_IRQ_USBRE |
      //AXP20_IRQ_USBLO |
      //AXP20_IRQ_ACOV |
      AXP20_IRQ_ACIN |
      AXP20_IRQ_ACRE |
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
const uint64_t AXP20_NOTIFIER_ON =
//AXP20_IRQ_USBOV |
const uint64_t AXP20_NOTIFIER_ON =
AXP20_IRQ_USBIN |
AXP20_IRQ_USBRE |
AXP20_IRQ_ACIN |
AXP20_IRQ_ACRE |
AXP20_IRQ_BATIN |
AXP20_IRQ_BATRE |
AXP20_IRQ_CHAST |
AXP20_IRQ_PEKFE |
AXP20_IRQ_CHAOV |
AXP20_IRQ_GPIO3TG |    //这个就是我们添加的
AXP20_IRQ_PEKRE ;

2、修改axp20-sply-cou.c(如果你使用ocv驱动就是axp20-sply.c)
static int axp_battery_event(struct notifier_block *nb, unsigned long event,void*data){
}
if((bool)data==0){
}
else{
//add by laotie121022 <<<
if((event) & AXP20_IRQ_GPIO3TG>>32) { //如果是这个时间,需要模拟一个powe键
axp_keydown(charger);
}

if((event) & AXP20_IRQ_GPIO3TG>>32) {
axp_keyup(charger);
}

//add end >>>
}

static int axp_battery_event(struct notifier_block *nb, unsigned long event,void*data){
if((bool)data==0){
   其他代码省略
}else{
//add by laotie121022 <<<
if((event) & AXP20_IRQ_GPIO3TG>>32) { //如果是这个时间,需要模拟一个powe键
axp_keydown(charger);
}

if((event) & AXP20_IRQ_GPIO3TG>>32) {
axp_keyup(charger);
}

//add end >>>
}
//add by laotie121022 <<<
if((event) & AXP20_IRQ_GPIO3TG>>32) { //这些是要添加的代码
axp_keydown(charger);
}
if((event) & AXP20_IRQ_GPIO3TG>>32) {
axp_keyup(charger);
}
if((event) & AXP20_IRQ_GPIO3TG>>32) {
axp_keyup(charger);
}
if((event) & AXP20_IRQ_GPIO3TG>>32) {
axp_keyup(charger);
}
if((event) & AXP20_IRQ_GPIO3TG>>32) {
axp_keyup(charger);
}

}
在axp_earlysuspend加入:

在axp_earlysuspend的最后加入一些代码:
static void axp_earlysuspend(struct early_suspend *h)
{
static void axp_earlysuspend(struct early_suspend *h)
{
其他代码省略
axp_read(axp_charger->master,0x44, &tmp);
tmp |= 0x08;//GPIO3 中断使能
axp_write(axp_charger->master,0x44, tmp);
axp_set_bits(axp_charger->master,0x95,0x44);//95H 设置GPIO3为wakeup功能

}

在axp_lateresume的最后加入一些代码:
static void axp_lateresume(struct early_suspend *h)
{
其他代码省略
axp_read(axp_charger->master,0x44, &tmp);
tmp &= ~0x08;
axp_write(axp_charger->master,0x44, tmp);
axp_clr_bits(axp_charger->master,0x95,0x44); 


}

3、修改axp-mfd.h

把#define AXP20_IRQ_GPIO3TG     ( 1 << 35)
改为
#define AXP20_IRQ_GPIO3TG     ( (uint64_t)1 << 35)

你可能感兴趣的:(PMU)