static void fcover_key_handler(unsigned long data) { bool pressed; u8 old_state = fcover_key_state; fcover_key_state = !fcover_key_state; pressed = (fcover_key_state == !!FCOVER_KEY_POLARITY); printk("\r\n leanda fcover_key_eint_handler in pressed=%d, fcover_key_state=%d,old_state=%d \r\n", pressed, fcover_key_state, old_state); if(pressed) // close { fcover_close_flag = 0; input_report_key(kpd_input_dev, KEY_FCOVER_1, 1); input_sync(kpd_input_dev); mdelay(1); input_report_key(kpd_input_dev, KEY_FCOVER_1, 0); input_sync(kpd_input_dev); printk("report Linux keycode = %u\n", KEY_FCOVER_1); //======================test========================= #ifdef KERNEL_OPEN_FCOVER if(lcm_backlight_flag == 1) { kpd_backlight_handler(1, KPD_PWRKEY_MAP); input_report_key(kpd_input_dev, KPD_PWRKEY_MAP, 1); input_sync(kpd_input_dev); printk("report Linux keycode = %u\n", KPD_PWRKEY_MAP); mdelay(1); kpd_backlight_handler(0, KPD_PWRKEY_MAP); input_report_key(kpd_input_dev, KPD_PWRKEY_MAP, 0); input_sync(kpd_input_dev); printk("report Linux keycode = %u\n", KPD_PWRKEY_MAP); } #endif //======================end=========================== } else // open { fcover_close_flag = 1; input_report_key(kpd_input_dev, KEY_FCOVER_2, 1); input_sync(kpd_input_dev); mdelay(1); input_report_key(kpd_input_dev, KEY_FCOVER_2, 0); input_sync(kpd_input_dev); printk("report Linux keycode = %u\n", KEY_FCOVER_2); } /* for detecting the return to old_state */ mt_eint_set_polarity(FCOVER_KEY_EINT, old_state); mt_eint_unmask(FCOVER_KEY_EINT); }
static void kpd_keymap_handler(unsigned long data) { int i, j; bool pressed; u16 new_state[KPD_NUM_MEMS], change, mask; u16 hw_keycode, linux_keycode; kpd_get_keymap_state(new_state); #ifdef CONFIG_MTK_TC1_FM_AT_SUSPEND wake_lock_timeout(&kpd_suspend_lock, HZ / 2); #endif 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; if (!(change & mask)) continue; hw_keycode = (i << 4) + j; /* bit is 1: not pressed, 0: pressed */ pressed = !(new_state[i] & mask); if (kpd_show_hw_keycode) { printk(KPD_SAY "(%s) HW keycode = %u\n", pressed ? "pressed" : "released", hw_keycode); } BUG_ON(hw_keycode >= KPD_NUM_KEYS); linux_keycode = kpd_keymap[hw_keycode]; if (unlikely(linux_keycode == 0)) { kpd_print("Linux keycode = 0\n"); continue; } kpd_aee_handler(linux_keycode, pressed); kpd_backlight_handler(pressed, linux_keycode); input_report_key(kpd_input_dev, linux_keycode, pressed); input_sync(kpd_input_dev); kpd_print("report Linux keycode = %u\n", linux_keycode); } } memcpy(kpd_keymap_state, new_state, sizeof(new_state)); kpd_print("save new keymap state\n"); #ifdef CONFIG_OF enable_irq(kp_irqnr); #else enable_irq(MT_KP_IRQ_ID); #endif }