2 * HID driver for some microsoft "special" devices
4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
7 * Copyright (c) 2006-2007 Jiri Kosina
8 * Copyright (c) 2008 Jiri Slaby
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
18 #include <linux/device.h>
19 #include <linux/input.h>
20 #include <linux/hid.h>
21 #include <linux/module.h>
25 #define MS_HIDINPUT BIT(0)
26 #define MS_ERGONOMY BIT(1)
27 #define MS_PRESENTER BIT(2)
28 #define MS_RDESC BIT(3)
29 #define MS_NOGET BIT(4)
30 #define MS_DUPLICATE_USAGES BIT(5)
31 #define MS_SURFACE_DIAL BIT(6)
32 #define MS_QUIRK_FF BIT(7)
36 struct hid_device
*hdev
;
37 struct work_struct ff_worker
;
40 void *output_report_dmabuf
;
43 #define XB1S_FF_REPORT 3
44 #define ENABLE_WEAK BIT(0)
45 #define ENABLE_STRONG BIT(1)
53 struct xb1s_ff_report
{
56 __u8 magnitude
[MAGNITUDE_NUM
];
58 __u8 start_delay_10ms
;
62 static __u8
*ms_report_fixup(struct hid_device
*hdev
, __u8
*rdesc
,
65 struct ms_data
*ms
= hid_get_drvdata(hdev
);
66 unsigned long quirks
= ms
->quirks
;
69 * Microsoft Wireless Desktop Receiver (Model 1028) has
70 * 'Usage Min/Max' where it ought to have 'Physical Min/Max'
72 if ((quirks
& MS_RDESC
) && *rsize
== 571 && rdesc
[557] == 0x19 &&
74 hid_info(hdev
, "fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n");
81 #define ms_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
83 static int ms_ergonomy_kb_quirk(struct hid_input
*hi
, struct hid_usage
*usage
,
84 unsigned long **bit
, int *max
)
86 struct input_dev
*input
= hi
->input
;
88 if ((usage
->hid
& HID_USAGE_PAGE
) == HID_UP_CONSUMER
) {
89 switch (usage
->hid
& HID_USAGE
) {
91 * Microsoft uses these 2 reserved usage ids for 2 keys on
92 * the MS office kb labelled "Office Home" and "Task Pane".
95 ms_map_key_clear(KEY_PROG1
);
98 ms_map_key_clear(KEY_PROG2
);
104 if ((usage
->hid
& HID_USAGE_PAGE
) != HID_UP_MSVENDOR
)
107 switch (usage
->hid
& HID_USAGE
) {
108 case 0xfd06: ms_map_key_clear(KEY_CHAT
); break;
109 case 0xfd07: ms_map_key_clear(KEY_PHONE
); break;
111 /* Special keypad keys */
112 ms_map_key_clear(KEY_KPEQUAL
);
113 set_bit(KEY_KPLEFTPAREN
, input
->keybit
);
114 set_bit(KEY_KPRIGHTPAREN
, input
->keybit
);
118 hid_map_usage_clear(hi
, usage
, bit
, max
, EV_REL
, REL_WHEEL
);
122 * This byte contains a copy of the modifier keys byte of a
123 * standard hid keyboard report, as send by interface 0
124 * (this usage is found on interface 1).
126 * This byte only gets send when another key in the same report
127 * changes state, and as such is useless, ignore it.
131 set_bit(EV_REP
, input
->evbit
);
132 ms_map_key_clear(KEY_F13
);
133 set_bit(KEY_F14
, input
->keybit
);
134 set_bit(KEY_F15
, input
->keybit
);
135 set_bit(KEY_F16
, input
->keybit
);
136 set_bit(KEY_F17
, input
->keybit
);
137 set_bit(KEY_F18
, input
->keybit
);
145 static int ms_presenter_8k_quirk(struct hid_input
*hi
, struct hid_usage
*usage
,
146 unsigned long **bit
, int *max
)
148 if ((usage
->hid
& HID_USAGE_PAGE
) != HID_UP_MSVENDOR
)
151 set_bit(EV_REP
, hi
->input
->evbit
);
152 switch (usage
->hid
& HID_USAGE
) {
153 case 0xfd08: ms_map_key_clear(KEY_FORWARD
); break;
154 case 0xfd09: ms_map_key_clear(KEY_BACK
); break;
155 case 0xfd0b: ms_map_key_clear(KEY_PLAYPAUSE
); break;
156 case 0xfd0e: ms_map_key_clear(KEY_CLOSE
); break;
157 case 0xfd0f: ms_map_key_clear(KEY_PLAY
); break;
164 static int ms_surface_dial_quirk(struct hid_input
*hi
, struct hid_field
*field
,
165 struct hid_usage
*usage
, unsigned long **bit
, int *max
)
167 switch (usage
->hid
& HID_USAGE_PAGE
) {
170 case HID_UP_DIGITIZER
:
171 /* ignore those axis */
174 switch (usage
->hid
) {
179 case HID_GD_RFKILL_BTN
:
180 /* ignore those axis */
188 static int ms_input_mapping(struct hid_device
*hdev
, struct hid_input
*hi
,
189 struct hid_field
*field
, struct hid_usage
*usage
,
190 unsigned long **bit
, int *max
)
192 struct ms_data
*ms
= hid_get_drvdata(hdev
);
193 unsigned long quirks
= ms
->quirks
;
195 if (quirks
& MS_ERGONOMY
) {
196 int ret
= ms_ergonomy_kb_quirk(hi
, usage
, bit
, max
);
201 if ((quirks
& MS_PRESENTER
) &&
202 ms_presenter_8k_quirk(hi
, usage
, bit
, max
))
205 if (quirks
& MS_SURFACE_DIAL
) {
206 int ret
= ms_surface_dial_quirk(hi
, field
, usage
, bit
, max
);
215 static int ms_input_mapped(struct hid_device
*hdev
, struct hid_input
*hi
,
216 struct hid_field
*field
, struct hid_usage
*usage
,
217 unsigned long **bit
, int *max
)
219 struct ms_data
*ms
= hid_get_drvdata(hdev
);
220 unsigned long quirks
= ms
->quirks
;
222 if (quirks
& MS_DUPLICATE_USAGES
)
223 clear_bit(usage
->code
, *bit
);
228 static int ms_event(struct hid_device
*hdev
, struct hid_field
*field
,
229 struct hid_usage
*usage
, __s32 value
)
231 struct ms_data
*ms
= hid_get_drvdata(hdev
);
232 unsigned long quirks
= ms
->quirks
;
233 struct input_dev
*input
;
235 if (!(hdev
->claimed
& HID_CLAIMED_INPUT
) || !field
->hidinput
||
239 input
= field
->hidinput
->input
;
241 /* Handling MS keyboards special buttons */
242 if (quirks
& MS_ERGONOMY
&& usage
->hid
== (HID_UP_MSVENDOR
| 0xff00)) {
243 /* Special keypad keys */
244 input_report_key(input
, KEY_KPEQUAL
, value
& 0x01);
245 input_report_key(input
, KEY_KPLEFTPAREN
, value
& 0x02);
246 input_report_key(input
, KEY_KPRIGHTPAREN
, value
& 0x04);
250 if (quirks
& MS_ERGONOMY
&& usage
->hid
== (HID_UP_MSVENDOR
| 0xff01)) {
252 int step
= ((value
& 0x60) >> 5) + 1;
254 switch (value
& 0x1f) {
256 input_report_rel(input
, REL_WHEEL
, step
);
259 input_report_rel(input
, REL_WHEEL
, -step
);
265 if (quirks
& MS_ERGONOMY
&& usage
->hid
== (HID_UP_MSVENDOR
| 0xff05)) {
266 static unsigned int last_key
= 0;
267 unsigned int key
= 0;
269 case 0x01: key
= KEY_F14
; break;
270 case 0x02: key
= KEY_F15
; break;
271 case 0x04: key
= KEY_F16
; break;
272 case 0x08: key
= KEY_F17
; break;
273 case 0x10: key
= KEY_F18
; break;
276 input_event(input
, usage
->type
, key
, 1);
279 input_event(input
, usage
->type
, last_key
, 0);
287 static void ms_ff_worker(struct work_struct
*work
)
289 struct ms_data
*ms
= container_of(work
, struct ms_data
, ff_worker
);
290 struct hid_device
*hdev
= ms
->hdev
;
291 struct xb1s_ff_report
*r
= ms
->output_report_dmabuf
;
294 memset(r
, 0, sizeof(*r
));
296 r
->report_id
= XB1S_FF_REPORT
;
297 r
->enable
= ENABLE_WEAK
| ENABLE_STRONG
;
299 * Specifying maximum duration and maximum loop count should
300 * cover maximum duration of a single effect, which is 65536
303 r
->duration_10ms
= U8_MAX
;
304 r
->loop_count
= U8_MAX
;
305 r
->magnitude
[MAGNITUDE_STRONG
] = ms
->strong
; /* left actuator */
306 r
->magnitude
[MAGNITUDE_WEAK
] = ms
->weak
; /* right actuator */
308 ret
= hid_hw_output_report(hdev
, (__u8
*)r
, sizeof(*r
));
310 hid_warn(hdev
, "failed to send FF report\n");
313 static int ms_play_effect(struct input_dev
*dev
, void *data
,
314 struct ff_effect
*effect
)
316 struct hid_device
*hid
= input_get_drvdata(dev
);
317 struct ms_data
*ms
= hid_get_drvdata(hid
);
319 if (effect
->type
!= FF_RUMBLE
)
323 * Magnitude is 0..100 so scale the 16-bit input here
325 ms
->strong
= ((u32
) effect
->u
.rumble
.strong_magnitude
* 100) / U16_MAX
;
326 ms
->weak
= ((u32
) effect
->u
.rumble
.weak_magnitude
* 100) / U16_MAX
;
328 schedule_work(&ms
->ff_worker
);
332 static int ms_init_ff(struct hid_device
*hdev
)
334 struct hid_input
*hidinput
= list_entry(hdev
->inputs
.next
,
335 struct hid_input
, list
);
336 struct input_dev
*input_dev
= hidinput
->input
;
337 struct ms_data
*ms
= hid_get_drvdata(hdev
);
339 if (!(ms
->quirks
& MS_QUIRK_FF
))
343 INIT_WORK(&ms
->ff_worker
, ms_ff_worker
);
345 ms
->output_report_dmabuf
= devm_kzalloc(&hdev
->dev
,
346 sizeof(struct xb1s_ff_report
),
348 if (ms
->output_report_dmabuf
== NULL
)
351 input_set_capability(input_dev
, EV_FF
, FF_RUMBLE
);
352 return input_ff_create_memless(input_dev
, NULL
, ms_play_effect
);
355 static void ms_remove_ff(struct hid_device
*hdev
)
357 struct ms_data
*ms
= hid_get_drvdata(hdev
);
359 if (!(ms
->quirks
& MS_QUIRK_FF
))
362 cancel_work_sync(&ms
->ff_worker
);
365 static int ms_probe(struct hid_device
*hdev
, const struct hid_device_id
*id
)
367 unsigned long quirks
= id
->driver_data
;
371 ms
= devm_kzalloc(&hdev
->dev
, sizeof(*ms
), GFP_KERNEL
);
377 hid_set_drvdata(hdev
, ms
);
379 if (quirks
& MS_NOGET
)
380 hdev
->quirks
|= HID_QUIRK_NOGET
;
382 if (quirks
& MS_SURFACE_DIAL
)
383 hdev
->quirks
|= HID_QUIRK_INPUT_PER_APP
;
385 ret
= hid_parse(hdev
);
387 hid_err(hdev
, "parse failed\n");
391 ret
= hid_hw_start(hdev
, HID_CONNECT_DEFAULT
| ((quirks
& MS_HIDINPUT
) ?
392 HID_CONNECT_HIDINPUT_FORCE
: 0));
394 hid_err(hdev
, "hw start failed\n");
398 ret
= ms_init_ff(hdev
);
400 hid_err(hdev
, "could not initialize ff, continuing anyway");
407 static void ms_remove(struct hid_device
*hdev
)
413 static const struct hid_device_id ms_devices
[] = {
414 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_SIDEWINDER_GV
),
415 .driver_data
= MS_HIDINPUT
},
416 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_OFFICE_KB
),
417 .driver_data
= MS_ERGONOMY
},
418 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_NE4K
),
419 .driver_data
= MS_ERGONOMY
},
420 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_NE4K_JP
),
421 .driver_data
= MS_ERGONOMY
},
422 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_NE7K
),
423 .driver_data
= MS_ERGONOMY
},
424 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_LK6K
),
425 .driver_data
= MS_ERGONOMY
| MS_RDESC
},
426 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_PRESENTER_8K_USB
),
427 .driver_data
= MS_PRESENTER
},
428 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K
),
429 .driver_data
= MS_ERGONOMY
},
430 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_DIGITAL_MEDIA_7K
),
431 .driver_data
= MS_ERGONOMY
},
432 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_DIGITAL_MEDIA_600
),
433 .driver_data
= MS_ERGONOMY
},
434 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1
),
435 .driver_data
= MS_ERGONOMY
},
436 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0
),
437 .driver_data
= MS_NOGET
},
438 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500
),
439 .driver_data
= MS_DUPLICATE_USAGES
},
440 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_POWER_COVER
),
441 .driver_data
= MS_HIDINPUT
},
442 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_COMFORT_KEYBOARD
),
443 .driver_data
= MS_ERGONOMY
},
445 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_PRESENTER_8K_BT
),
446 .driver_data
= MS_PRESENTER
},
447 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT
, 0x091B),
448 .driver_data
= MS_SURFACE_DIAL
},
449 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_MS_XBOX_ONE_S_CONTROLLER
),
450 .driver_data
= MS_QUIRK_FF
},
453 MODULE_DEVICE_TABLE(hid
, ms_devices
);
455 static struct hid_driver ms_driver
= {
457 .id_table
= ms_devices
,
458 .report_fixup
= ms_report_fixup
,
459 .input_mapping
= ms_input_mapping
,
460 .input_mapped
= ms_input_mapped
,
465 module_hid_driver(ms_driver
);
467 MODULE_LICENSE("GPL");