* [RFC][PATCH 1/2] HID: wiimote: refactor key reporting
2012-06-04 19:19 [RFC][PATCH 0/2] HID: wiimote: proper joystick device support Giuseppe Bilotta
@ 2012-06-04 19:19 ` Giuseppe Bilotta
2012-06-04 19:19 ` [RFC][PATCH 2/2] HID: wiimote: report keys in Accelerometer too Giuseppe Bilotta
1 sibling, 0 replies; 3+ messages in thread
From: Giuseppe Bilotta @ 2012-06-04 19:19 UTC (permalink / raw)
To: linux-input
Cc: David Herrmann, Vojtech Pavlik, Dmitry Torokhov, Giuseppe Bilotta
A Wii Remote is exposed as three distinct input devices, but only the
main one (which is the last registered) reports keys. To allow button
presses to also be reported by other devices, we refactor the key
reporting code out of handler_keys() in its own report_keys() function,
that accepts an abritrary input device and an arbitrary key map.
Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
---
drivers/hid/hid-wiimote-core.c | 38 ++++++++++++++++----------------------
1 file changed, 16 insertions(+), 22 deletions(-)
diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c
index 84e2fbe..ece9c28 100644
--- a/drivers/hid/hid-wiimote-core.c
+++ b/drivers/hid/hid-wiimote-core.c
@@ -690,30 +690,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);
}
--
1.7.10.rc3.204.g95589
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [RFC][PATCH 2/2] HID: wiimote: report keys in Accelerometer too
2012-06-04 19:19 [RFC][PATCH 0/2] HID: wiimote: proper joystick device support Giuseppe Bilotta
2012-06-04 19:19 ` [RFC][PATCH 1/2] HID: wiimote: refactor key reporting Giuseppe Bilotta
@ 2012-06-04 19:19 ` Giuseppe Bilotta
1 sibling, 0 replies; 3+ messages in thread
From: Giuseppe Bilotta @ 2012-06-04 19:19 UTC (permalink / raw)
To: linux-input
Cc: David Herrmann, Vojtech Pavlik, Dmitry Torokhov, Giuseppe Bilotta
The main input device registered by the wiimote driver gets classified
as a gamepad because it reports the presence of a BTN_A button. This
results in the detection of a joystick device with 7 buttons and no axes
(thus unusable) when a Wii Remote is connected.
By letting the Accelerometer input device also report buttons, we get it
to be recognized as a 7-buttons, 3-axes gamepad, that can be used on
games with no direct Wii Remote support through the joydev interface.
This approach is currently not perfect: button presses gets reported on
two devices (Remote and Accelerometer), and the main device is still
classified as a gamepad due to the mapping.
Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
---
drivers/hid/hid-wiimote-core.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c
index ece9c28..2177dbe 100644
--- a/drivers/hid/hid-wiimote-core.c
+++ b/drivers/hid/hid-wiimote-core.c
@@ -741,6 +741,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);
}
@@ -1096,6 +1097,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;
--
1.7.10.rc3.204.g95589
^ permalink raw reply related [flat|nested] 3+ messages in thread