您的位置:首页 > 移动开发 > Android开发

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

2012-07-05 18:33 731 查看
该功能是系统启动后,在任何情况下,长按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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: