mtk android power key 长按8s 关机功能实现

本文介绍了一种实现在任何情况下长按电源键8秒即可直接关机的功能。通过在kernel层面进行修改,利用定时器和中断处理机制,确保了功能的稳定性和可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该功能是系统启动后,在任何情况下,长按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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值