android power key 长按8s 关机

来源:互联网 发布:comfortable zone 知乎 编辑:程序博客网 时间:2024/04/27 19:45

该功能是系统启动后,在任何情况下,长按power key 8s都能做到直接关机。因此在kernel中实现。

所有修改都在keypad driver中,如下文件。

mediatek\platform\mt6573\kernel\drivers\keypad\kpd.c:


#define FORCE_POWERKEY_SECONDS   8   //定义power key按键持续时间


struct timer_list timer;  


//定时器timer初始化

static int timer_init()  {     init_timer(&timer);     timer.data= 5;     timer.expires = jiffies + (FORCE_POWERKEY_SECONDS*HZ);      timer.function = timer_function;     add_timer(&timer);     printk("<0>ziheng add_timer\n");     return 0;  }  


//定时器timer退出

static void timer_exit()  

   del_timer(&timer);  


//定时器到时事件处理函数

static void timer_function(int para)  {     timer_exit();    arch_reset(0, "charger");  //kernel强制关机接口}  


按键时间在kpd_pwrkey_handler中处理,kpd_pwrkey_handler是一个tasklet,用于power key的按键中断下半部处理。


static void kpd_pwrkey_handler(unsigned long data){

   bool pressed;   u8 old_state = kpd_pwrkey_state;   kpd_pwrkey_state = !kpd_pwrkey_state;   pressed = (kpd_pwrkey_state == !!KPD_PWRKEY_POLARITY);   if (kpd_show_hw_keycode) { printk(KPD_SAY "(%s) HW keycode = using EINT\n",         pressed ? "pressed" : "released");

         }
    #ifdef  FORCE_POWERKEY     if(pressed == 1)   {   printk("<0> kpd_pwr_handler press 1\n");           timer_init();    }     else if(pressed == 0)   {   printk("<0> kpd_pwr_handler press 0\n");           timer_exit();

}

    #endif

  kpd_backlight_handler(pressed, KPD_PWRKEY_MAP);   input_report_key(kpd_input_dev, KPD_PWRKEY_MAP, pressed);   kpd_print("report Linux keycode = %u\n", KPD_PWRKEY_MAP);   /* for detecting the return to old_state */   mt65xx_eint_set_polarity(KPD_PWRKEY_EINT, old_state);   mt65xx_eint_unmask(KPD_PWRKEY_EINT);

}
原创粉丝点击