--
Giuseppe "Oblomov" Bilotta
diff --git a/driver/hid-wiimote-core.c b/driver/hid-wiimote-core.c
index 745667e..f0e9fc9 100644
--- a/driver/hid-wiimote-core.c
+++ b/driver/hid-wiimote-core.c
@@ -686,30 +686,24 @@ static void wiimote_ir_close(struct input_dev *dev)
hid_hw_close(wdata->hdev);
}
+static void report_keys(struct input_dev *input, const __u16 keymap[], const __u8 *payload)
+{
+ input_report_key(input, keymap[WIIPROTO_KEY_LEFT], !!(payload[0] & 0x01));
+ input_report_key(input, keymap[WIIPROTO_KEY_RIGHT], !!(payload[0] & 0x02));
+ input_report_key(input, keymap[WIIPROTO_KEY_DOWN], !!(payload[0] & 0x04));
+ input_report_key(input, keymap[WIIPROTO_KEY_UP], !!(payload[0] & 0x08));
+ input_report_key(input, keymap[WIIPROTO_KEY_PLUS], !!(payload[0] & 0x10));
+ input_report_key(input, keymap[WIIPROTO_KEY_TWO], !!(payload[1] & 0x01));
+ input_report_key(input, keymap[WIIPROTO_KEY_ONE], !!(payload[1] & 0x02));
+ input_report_key(input, keymap[WIIPROTO_KEY_B], !!(payload[1] & 0x04));
+ input_report_key(input, keymap[WIIPROTO_KEY_A], !!(payload[1] & 0x08));
+ input_report_key(input, keymap[WIIPROTO_KEY_MINUS], !!(payload[1] & 0x10));
+ input_report_key(input, keymap[WIIPROTO_KEY_HOME], !!(payload[1] & 0x80));
+}
+
static void handler_keys(struct wiimote_data *wdata, const __u8 *payload)
{
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_LEFT],
- !!(payload[0] & 0x01));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_RIGHT],
- !!(payload[0] & 0x02));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_DOWN],
- !!(payload[0] & 0x04));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_UP],
- !!(payload[0] & 0x08));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_PLUS],
- !!(payload[0] & 0x10));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_TWO],
- !!(payload[1] & 0x01));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_ONE],
- !!(payload[1] & 0x02));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_B],
- !!(payload[1] & 0x04));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_A],
- !!(payload[1] & 0x08));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_MINUS],
- !!(payload[1] & 0x10));
- input_report_key(wdata->input, wiiproto_keymap[WIIPROTO_KEY_HOME],
- !!(payload[1] & 0x80));
+ report_keys(wdata->input, wiiproto_keymap, payload);
input_sync(wdata->input);
}
@@ -743,6 +737,7 @@ static void handler_accel(struct wiimote_data *wdata, const __u8 *payload)
input_report_abs(wdata->accel, ABS_RX, x - 0x200);
input_report_abs(wdata->accel, ABS_RY, y - 0x200);
input_report_abs(wdata->accel, ABS_RZ, z - 0x200);
+ report_keys(wdata->accel, wiiproto_keymap, payload);
input_sync(wdata->accel);
}
@@ -1104,6 +1099,11 @@ static struct wiimote_data *wiimote_create(struct hid_device *hdev)
input_set_abs_params(wdata->accel, ABS_RY, -500, 500, 2, 4);
input_set_abs_params(wdata->accel, ABS_RZ, -500, 500, 2, 4);
+ set_bit(EV_KEY, wdata->accel->evbit);
+ for (i = 0; i < WIIPROTO_KEY_COUNT; ++i)
+ set_bit(wiiproto_keymap[i], wdata->accel->keybit);
+
+
wdata->ir = input_allocate_device();
if (!wdata->ir)
goto err_ir;