Beispiel #1
0
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);
}
Beispiel #2
0
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
}