static int report_key_event(struct microp_input_state *ds, uint8_t keycode)
{
	uint8_t pressed;
	uint8_t keymap_index;
	const struct gpio_event_direct_entry *key_entry;
	uint32_t err = 0;
	if (keycode == 0) {
		KEY_LOGE("%s(), get invalid keycode!, keycode:%d\n", __func__, keycode);
		return -1;
	}
	pressed = !(keycode & 0x80);
	keymap_index = (keycode & 0xF) - 1;

	key_entry = &ds->info->keymap[keymap_index];
	pr_info("microp_keys_scan_keys: key %d-%d, %d (%d) "
		"changed to %d\n", ds->info->type, key_entry->code,
		keymap_index, key_entry->gpio, pressed);
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
	if (ds->info->info.oj_btn && key_entry->code == BTN_MOUSE)
		curcial_oj_send_key(BTN_MOUSE, pressed);
	else
#endif
	{
		input_event(ds->input_devs->dev[key_entry->dev],
		ds->info->type, key_entry->code, pressed);
		input_sync(ds->input_devs->dev[key_entry->dev]);
	}
	return err;
}
static void microp_scan_key(struct microp_input_state *ds)
{
	const struct gpio_event_direct_entry *key_entry;
	uint8_t pressed = 0;
	uint8_t data[3];
	int i = 0;

	memset(data, 0x00, sizeof(uint8_t)*3);
	microp_i2c_read(MICROP_I2C_RCMD_GPIO_STATUS, data, 3);

	key_entry = ds->info->keymap;
	if (key_entry == NULL) {
		KEY_LOGE("%s, (key_entry == NULL) failed\n", __func__);
		return;
	}

	for (i = 0; i < ds->info->keymap_size; i++) {
		pressed = read_microp_gpio(data, key_entry[i].gpio);
		pr_info("microp_keys_scan_keys: key %d-%d, %d (%d) "
			"changed to %d\n", ds->info->type,
			key_entry[i].code, i, key_entry[i].gpio, pressed);
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
		if (ds->info->info.oj_btn && key_entry->code == BTN_MOUSE) {
			curcial_oj_send_key(BTN_MOUSE, pressed);
		} else {
#endif
			input_event(ds->input_devs->dev[key_entry[i].dev],
			ds->info->type, key_entry[i].code, pressed);
			input_sync(ds->input_devs->dev[key_entry->dev]);
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
		}
#endif
	}
}
static void report_key(struct gpio_kp *kp, int key_index, int out, int in)
{
	struct gpio_event_matrix_info *mi = kp->keypad_info;
	int pressed = test_bit(key_index, kp->keys_pressed);
	unsigned short keyentry = mi->keymap[key_index];
	unsigned short keycode = keyentry & MATRIX_KEY_MASK;
	unsigned short dev = keyentry >> MATRIX_CODE_BITS;
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
	static unsigned need_send_spec_key = 1;
#endif

	if (pressed != test_bit(keycode, kp->input_devs->dev[dev]->key)) {
		if (keycode == KEY_RESERVED) {
			if (mi->flags & GPIOKPF_PRINT_UNMAPPED_KEYS)
				pr_info("gpiomatrix: unmapped key, %d-%d "
					"(%d-%d) changed to %d\n",
					out, in, mi->output_gpios[out],
					mi->input_gpios[in], pressed);
		} else {
			if (mi->flags & GPIOKPF_PRINT_MAPPED_KEYS)
				pr_info("gpiomatrix: key %x, %d-%d (%d-%d) "
					"changed to %d\n", keycode,
					out, in, mi->output_gpios[out],
					mi->input_gpios[in], pressed);
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
			if ((machine_is_bravo() || machine_is_legend() ||
				machine_is_latte() || machine_is_liberty()
			|| machine_is_paradise() || machine_is_bravoc() ||
							machine_is_bee())
						&& keycode == BTN_MOUSE)
				;
			else
#endif
#ifdef CONFIG_MACH_HEROC
			if (button_filter(kp->input_devs->dev[dev],
				EV_KEY, keycode, pressed, kp->keys_pressed))
#endif
				input_report_key(kp->input_devs->dev[dev],
							keycode, pressed);
		}
	}
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
	if ((machine_is_bravo() || machine_is_legend() || machine_is_latte()
			|| machine_is_liberty() || machine_is_paradise() ||
				machine_is_bravoc() || machine_is_bee()) &&
							keycode == BTN_MOUSE) {
		if (need_send_spec_key == pressed) {
			curcial_oj_send_key(keycode, pressed);
			need_send_spec_key = !pressed;
			printk(KERN_DEBUG "%s: send key, pressed: %d\n",
				__func__, need_send_spec_key);
		}
	}
#endif
}
static void report_key(struct gpio_kp *kp, int key_index, int out, int in)
{
	struct gpio_event_matrix_info *mi = kp->keypad_info;
	int pressed = test_bit(key_index, kp->keys_pressed);
	unsigned short keyentry = mi->keymap[key_index];
	unsigned short keycode = keyentry & MATRIX_KEY_MASK;
	unsigned short dev = keyentry >> MATRIX_CODE_BITS;
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
	static unsigned need_send_spec_key = 1;
#endif

	if (pressed != test_bit(keycode, kp->input_devs->dev[dev]->key)) {
		if (keycode == KEY_RESERVED) {
			pr_info("gpiomatrix: unmapped key, %d-%d "
					"(%d-%d) changed to %d\n",
					out, in, mi->output_gpios[out],
					mi->input_gpios[in], pressed);
		} else {
			pr_info("gpiomatrix: key %d, %d-%d (%d-%d) "
					"changed to %d\n", keycode,
					out, in, mi->output_gpios[out],
					mi->input_gpios[in], pressed);
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
			if (mi->info.oj_btn && keycode == BTN_MOUSE)
				;
			else
#endif
				input_report_key(kp->input_devs->dev[dev],
							keycode, pressed);
		}
	}
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
	if (mi->info.oj_btn && keycode == BTN_MOUSE) {
		if (need_send_spec_key == pressed) {
			curcial_oj_send_key(keycode, pressed);
			need_send_spec_key = !pressed;
			pr_info("%s: send OJ action key, pressed: %d\n",
				__func__, pressed);
		}
	}
#endif
}
Beispiel #5
0
static void report_key(struct gpio_kp *kp, int key_index, int out, int in)
{
	struct gpio_event_matrix_info *mi = kp->keypad_info;
	int pressed = test_bit(key_index, kp->keys_pressed);
	unsigned short keyentry = mi->keymap[key_index];
	unsigned short keycode = keyentry & MATRIX_KEY_MASK;
	unsigned short dev = keyentry >> MATRIX_CODE_BITS;
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
	static unsigned need_send_spec_key = 1;
#endif
	int report = 1;

	if (pressed != test_bit(keycode, kp->input_devs->dev[dev]->key)) {
		if (keycode == KEY_RESERVED) {
			KEY_LOGI("gpiomatrix: unmapped key, %d-%d "
					"(%d-%d) changed to %d\n",
					out, in, mi->output_gpios[out],
					mi->input_gpios[in], pressed);
		} else {
			KEY_LOGI("gpiomatrix: key %d, %d-%d (%d-%d) "
					"changed to %d\n", keycode,
					out, in, mi->output_gpios[out],
					mi->input_gpios[in], pressed);
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
			if (mi->info.oj_btn && keycode == BTN_MOUSE)
				;
			else
#endif
			{
				report = 1;
#ifdef CONFIG_MACH_DOUBLESHOT
				// fix for the all too often happening accidental key press repetitions
				if (pressed)
				{
					if (keycode == last_pressed)
					{
						if (press_time_init == 0)
						{
							press_time_init = 1;
							last_pressed_time = jiffies;
						} else
						{
							if ( time_before( jiffies, last_pressed_time + BETWEEN_PRESS_MIN_DIFF ) )
							{
								report = 0; // too close
							} else
							{
								last_pressed_time = jiffies;
							}
						}
					} else
					{
						last_pressed_time = jiffies;
					}
					last_pressed = keycode;
					}
#endif
				if (report) {
					input_report_key(kp->input_devs->dev[dev],
							keycode, pressed);
					input_sync(kp->input_devs->dev[dev]);
				}
			}
		}
	}
#ifdef CONFIG_OPTICALJOYSTICK_CRUCIAL
	if (mi->info.oj_btn && keycode == BTN_MOUSE) {
		if (need_send_spec_key == pressed) {
			curcial_oj_send_key(keycode, pressed);
			need_send_spec_key = !pressed;
			KEY_LOGI("%s: send OJ action key, pressed: %d\n",
				__func__, pressed);
		}
	}
#endif
}