处理流程及示意图:
1,硬件配置:
kernel-3.18\arch\arm\boot\dts\projectxxx.dts
&keypad {
mediatek,kpd-key-debounce= <1024>;
mediatek,kpd-sw-pwrkey= <116>;
mediatek,kpd-hw-pwrkey= <8>;
mediatek,kpd-use-extend-type= <0>;
/*HWKeycode [0~71] -> Linux Keycode*/
mediatek,kpd-hw-map-num= <72>;
// kpd-hw-init-map为硬件扫描的矩阵列表。跟具体硬件接法相关。即为linux_code
mediatek,kpd-hw-init-map= <115 114 0 0 0 0 0 0 0 158 0 0 0 0 0 0 0 0 0 0 0 0 0 0
00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >;
mediatek,kpd-pwrkey-eint-gpio= <0>;
mediatek,kpd-pwkey-gpio-din = <0>;
mediatek,kpd-hw-dl-key0= <0>;
mediatek,kpd-hw-dl-key1= <1>;
mediatek,kpd-hw-dl-key2= <8>;
mediatek,kpd-hw-recovery-key= <0>;
mediatek,kpd-hw-factory-key = <1>;
status= "okay";
};
硬件接法,软件注意各个IO的功能配置,以确保按键扫描时获取到正确的值。
2,kernel驱动:
按下按键后,会出发中断,然后进去中断处理程序中进行按键的扫描:
static void kpd_keymap_handler(unsignedlong data)
{
inti, j;
boolpressed;
u16new_state[KPD_NUM_MEMS], change, mask;
u16hw_keycode, linux_keycode;
kpd_get_keymap_state(new_state);
wake_lock_timeout(&kpd_suspend_lock,HZ / 2);
for(i = 0; i < KPD_NUM_MEMS; i++) {
change= new_state[i] ^ kpd_keymap_state[i];
if(!change)
continue;
for(j = 0; j < 16; j++) {
mask= 1U << j;