diff options
author | Przemo Firszt <przemo@firszt.eu> | 2012-02-28 12:19:05 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2012-03-01 03:25:08 -0500 |
commit | 6245bde29dd049300d663516398335be8d451b78 (patch) | |
tree | 2682ef8c0614d72d922b44f6053f064446a6a205 | |
parent | e0829e9c1e6981450f11204a4104646ed0f6907a (diff) |
HID: wacom: Add pad buttons reporting on Intuos4 WL
This patch adds reporting of 1 wheel button and 8 strip buttons for Intuos4 WL.
The buttons are reported as BTN_0 to BTN_9. The change of type butstate variable
is required as the old type 'char' couldn't store state of 9 buttons. The change
is not affecting Graphire tablet as it only uses first 2 bits of 'butstate'.
Signed-off-by: Przemo Firszt <przemo@firszt.eu>
Acked-by:Ping Cheng <pinglinux@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r-- | drivers/hid/hid-wacom.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c index 5a58db2440fa..58aedbc80f02 100644 --- a/drivers/hid/hid-wacom.c +++ b/drivers/hid/hid-wacom.c | |||
@@ -31,9 +31,11 @@ | |||
31 | 31 | ||
32 | #include "hid-ids.h" | 32 | #include "hid-ids.h" |
33 | 33 | ||
34 | #define PAD_DEVICE_ID 0x0F | ||
35 | |||
34 | struct wacom_data { | 36 | struct wacom_data { |
35 | __u16 tool; | 37 | __u16 tool; |
36 | unsigned char butstate; | 38 | __u16 butstate; |
37 | __u8 features; | 39 | __u8 features; |
38 | __u32 id; | 40 | __u32 id; |
39 | __u32 serial; | 41 | __u32 serial; |
@@ -316,6 +318,30 @@ static int wacom_gr_parse_report(struct hid_device *hdev, | |||
316 | return 1; | 318 | return 1; |
317 | } | 319 | } |
318 | 320 | ||
321 | static void wacom_i4_parse_button_report(struct wacom_data *wdata, | ||
322 | struct input_dev *input, unsigned char *data) | ||
323 | { | ||
324 | __u16 new_butstate; | ||
325 | |||
326 | new_butstate = (data[3] << 1) | (data[2] & 0x01); | ||
327 | if (new_butstate != wdata->butstate) { | ||
328 | wdata->butstate = new_butstate; | ||
329 | input_report_key(input, BTN_0, new_butstate & 0x001); | ||
330 | input_report_key(input, BTN_1, new_butstate & 0x002); | ||
331 | input_report_key(input, BTN_2, new_butstate & 0x004); | ||
332 | input_report_key(input, BTN_3, new_butstate & 0x008); | ||
333 | input_report_key(input, BTN_4, new_butstate & 0x010); | ||
334 | input_report_key(input, BTN_5, new_butstate & 0x020); | ||
335 | input_report_key(input, BTN_6, new_butstate & 0x040); | ||
336 | input_report_key(input, BTN_7, new_butstate & 0x080); | ||
337 | input_report_key(input, BTN_8, new_butstate & 0x100); | ||
338 | input_report_key(input, BTN_TOOL_FINGER, 1); | ||
339 | input_report_abs(input, ABS_MISC, PAD_DEVICE_ID); | ||
340 | input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff); | ||
341 | input_sync(input); | ||
342 | } | ||
343 | } | ||
344 | |||
319 | static void wacom_i4_parse_pen_report(struct wacom_data *wdata, | 345 | static void wacom_i4_parse_pen_report(struct wacom_data *wdata, |
320 | struct input_dev *input, unsigned char *data) | 346 | struct input_dev *input, unsigned char *data) |
321 | { | 347 | { |
@@ -389,6 +415,7 @@ static void wacom_i4_parse_report(struct hid_device *hdev, | |||
389 | wdata->features = data[2]; | 415 | wdata->features = data[2]; |
390 | break; | 416 | break; |
391 | case 0x0C: /* Button report */ | 417 | case 0x0C: /* Button report */ |
418 | wacom_i4_parse_button_report(wdata, input, data); | ||
392 | break; | 419 | break; |
393 | default: | 420 | default: |
394 | hid_err(hdev, "Unknown report: %d,%d\n", data[0], data[1]); | 421 | hid_err(hdev, "Unknown report: %d,%d\n", data[0], data[1]); |
@@ -484,6 +511,13 @@ static int wacom_input_mapped(struct hid_device *hdev, struct hid_input *hi, | |||
484 | break; | 511 | break; |
485 | case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH: | 512 | case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH: |
486 | __set_bit(ABS_MISC, input->absbit); | 513 | __set_bit(ABS_MISC, input->absbit); |
514 | __set_bit(BTN_2, input->keybit); | ||
515 | __set_bit(BTN_3, input->keybit); | ||
516 | __set_bit(BTN_4, input->keybit); | ||
517 | __set_bit(BTN_5, input->keybit); | ||
518 | __set_bit(BTN_6, input->keybit); | ||
519 | __set_bit(BTN_7, input->keybit); | ||
520 | __set_bit(BTN_8, input->keybit); | ||
487 | input_set_abs_params(input, ABS_X, 0, 40640, 4, 0); | 521 | input_set_abs_params(input, ABS_X, 0, 40640, 4, 0); |
488 | input_set_abs_params(input, ABS_Y, 0, 25400, 4, 0); | 522 | input_set_abs_params(input, ABS_Y, 0, 25400, 4, 0); |
489 | input_set_abs_params(input, ABS_PRESSURE, 0, 2047, 0, 0); | 523 | input_set_abs_params(input, ABS_PRESSURE, 0, 2047, 0, 0); |