diff options
-rw-r--r-- | drivers/hid/hid-3m-pct.c | 31 | ||||
-rw-r--r-- | drivers/hid/hid-core.c | 1 | ||||
-rw-r--r-- | drivers/hid/hid-ids.h | 1 |
3 files changed, 30 insertions, 3 deletions
diff --git a/drivers/hid/hid-3m-pct.c b/drivers/hid/hid-3m-pct.c index 2370aefc86b2..883fd1af3c4c 100644 --- a/drivers/hid/hid-3m-pct.c +++ b/drivers/hid/hid-3m-pct.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * HID driver for 3M PCT multitouch panels | 2 | * HID driver for 3M PCT multitouch panels |
3 | * | 3 | * |
4 | * Copyright (c) 2009 Stephane Chatty <chatty@enac.fr> | 4 | * Copyright (c) 2009-2010 Stephane Chatty <chatty@enac.fr> |
5 | * | 5 | * |
6 | */ | 6 | */ |
7 | 7 | ||
@@ -24,7 +24,7 @@ MODULE_LICENSE("GPL"); | |||
24 | #include "hid-ids.h" | 24 | #include "hid-ids.h" |
25 | 25 | ||
26 | struct mmm_finger { | 26 | struct mmm_finger { |
27 | __s32 x, y; | 27 | __s32 x, y, w, h; |
28 | __u8 rank; | 28 | __u8 rank; |
29 | bool touch, valid; | 29 | bool touch, valid; |
30 | }; | 30 | }; |
@@ -81,7 +81,18 @@ static int mmm_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |||
81 | /* touchscreen emulation */ | 81 | /* touchscreen emulation */ |
82 | hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); | 82 | hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); |
83 | return 1; | 83 | return 1; |
84 | case HID_DG_WIDTH: | ||
85 | hid_map_usage(hi, usage, bit, max, | ||
86 | EV_ABS, ABS_MT_TOUCH_MAJOR); | ||
87 | return 1; | ||
88 | case HID_DG_HEIGHT: | ||
89 | hid_map_usage(hi, usage, bit, max, | ||
90 | EV_ABS, ABS_MT_TOUCH_MINOR); | ||
91 | input_set_abs_params(hi->input, ABS_MT_ORIENTATION, | ||
92 | 1, 1, 0, 0); | ||
93 | return 1; | ||
84 | case HID_DG_CONTACTID: | 94 | case HID_DG_CONTACTID: |
95 | field->logical_maximum = 59; | ||
85 | hid_map_usage(hi, usage, bit, max, | 96 | hid_map_usage(hi, usage, bit, max, |
86 | EV_ABS, ABS_MT_TRACKING_ID); | 97 | EV_ABS, ABS_MT_TRACKING_ID); |
87 | return 1; | 98 | return 1; |
@@ -127,9 +138,15 @@ static void mmm_filter_event(struct mmm_data *md, struct input_dev *input) | |||
127 | /* this finger is just placeholder data, ignore */ | 138 | /* this finger is just placeholder data, ignore */ |
128 | } else if (f->touch) { | 139 | } else if (f->touch) { |
129 | /* this finger is on the screen */ | 140 | /* this finger is on the screen */ |
141 | int wide = (f->w > f->h); | ||
130 | input_event(input, EV_ABS, ABS_MT_TRACKING_ID, i); | 142 | input_event(input, EV_ABS, ABS_MT_TRACKING_ID, i); |
131 | input_event(input, EV_ABS, ABS_MT_POSITION_X, f->x); | 143 | input_event(input, EV_ABS, ABS_MT_POSITION_X, f->x); |
132 | input_event(input, EV_ABS, ABS_MT_POSITION_Y, f->y); | 144 | input_event(input, EV_ABS, ABS_MT_POSITION_Y, f->y); |
145 | input_event(input, EV_ABS, ABS_MT_ORIENTATION, wide); | ||
146 | input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, | ||
147 | wide ? f->w : f->h); | ||
148 | input_event(input, EV_ABS, ABS_MT_TOUCH_MINOR, | ||
149 | wide ? f->h : f->w); | ||
133 | input_mt_sync(input); | 150 | input_mt_sync(input); |
134 | /* | 151 | /* |
135 | * touchscreen emulation: maintain the age rank | 152 | * touchscreen emulation: maintain the age rank |
@@ -196,6 +213,14 @@ static int mmm_event(struct hid_device *hid, struct hid_field *field, | |||
196 | case HID_DG_CONFIDENCE: | 213 | case HID_DG_CONFIDENCE: |
197 | md->valid = value; | 214 | md->valid = value; |
198 | break; | 215 | break; |
216 | case HID_DG_WIDTH: | ||
217 | if (md->valid) | ||
218 | md->f[md->curid].w = value; | ||
219 | break; | ||
220 | case HID_DG_HEIGHT: | ||
221 | if (md->valid) | ||
222 | md->f[md->curid].h = value; | ||
223 | break; | ||
199 | case HID_DG_CONTACTID: | 224 | case HID_DG_CONTACTID: |
200 | if (md->valid) { | 225 | if (md->valid) { |
201 | md->curid = value; | 226 | md->curid = value; |
@@ -254,6 +279,7 @@ static void mmm_remove(struct hid_device *hdev) | |||
254 | 279 | ||
255 | static const struct hid_device_id mmm_devices[] = { | 280 | static const struct hid_device_id mmm_devices[] = { |
256 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, | 281 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, |
282 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) }, | ||
257 | { } | 283 | { } |
258 | }; | 284 | }; |
259 | MODULE_DEVICE_TABLE(hid, mmm_devices); | 285 | MODULE_DEVICE_TABLE(hid, mmm_devices); |
@@ -286,5 +312,4 @@ static void __exit mmm_exit(void) | |||
286 | 312 | ||
287 | module_init(mmm_init); | 313 | module_init(mmm_init); |
288 | module_exit(mmm_exit); | 314 | module_exit(mmm_exit); |
289 | MODULE_LICENSE("GPL"); | ||
290 | 315 | ||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 7396f47c79db..9f92f629d448 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1251,6 +1251,7 @@ EXPORT_SYMBOL_GPL(hid_disconnect); | |||
1251 | /* a list of devices for which there is a specialized driver on HID bus */ | 1251 | /* a list of devices for which there is a specialized driver on HID bus */ |
1252 | static const struct hid_device_id hid_blacklist[] = { | 1252 | static const struct hid_device_id hid_blacklist[] = { |
1253 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, | 1253 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) }, |
1254 | { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) }, | ||
1254 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) }, | 1255 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) }, |
1255 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, | 1256 | { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, |
1256 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) }, | 1257 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 72c05f90553c..e1b4ce4eeb6e 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | #define USB_VENDOR_ID_3M 0x0596 | 21 | #define USB_VENDOR_ID_3M 0x0596 |
22 | #define USB_DEVICE_ID_3M1968 0x0500 | 22 | #define USB_DEVICE_ID_3M1968 0x0500 |
23 | #define USB_DEVICE_ID_3M2256 0x0502 | ||
23 | 24 | ||
24 | #define USB_VENDOR_ID_A4TECH 0x09da | 25 | #define USB_VENDOR_ID_A4TECH 0x09da |
25 | #define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006 | 26 | #define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006 |