原文出处:http://blog.csdn.net/tonywgx/article/details/12120913
假设你要设置pmu(axp209) 的gpio3来唤醒系统。
1、修改linux-3.0/drivers/power/axp_power_axp-sply.h,这个文件里面定义了一个AXP20_NOTIFIER_ON这个变量,我们要加上跟GPIO3相关的内容上去:
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{
if((event) & AXP20_IRQ_GPIO3TG>>32) { //这些是要添加的代码
axp_keydown(charger);
}
if((event) & AXP20_IRQ_GPIO3TG>>32) {
axp_keyup(charger);
}
}
在axp_earlysuspend的最后加入一些代码:
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)
axp_keydown(charger);
}
if((event) & AXP20_IRQ_GPIO3TG>>32) {
axp_keyup(charger);
}
}
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)