1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * HID driver for some microsoft "special" devices
5 * Copyright (c) 1999 Andreas Gal
6 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
7 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
8 * Copyright (c) 2006-2007 Jiri Kosina
9 * Copyright (c) 2008 Jiri Slaby
15 #include <linux/device.h>
16 #include <linux/input.h>
17 #include <linux/hid.h>
18 #include <linux/module.h>
22 #define MS_HIDINPUT BIT(0)
23 #define MS_ERGONOMY BIT(1)
24 #define MS_PRESENTER BIT(2)
25 #define MS_RDESC BIT(3)
26 #define MS_NOGET BIT(4)
27 #define MS_DUPLICATE_USAGES BIT(5)
28 #define MS_SURFACE_DIAL BIT(6)
29 #define MS_QUIRK_FF BIT(7)
33 struct hid_device
*hdev
;
34 struct work_struct ff_worker
;
37 void *output_report_dmabuf
;
40 #define XB1S_FF_REPORT 3
41 #define ENABLE_WEAK BIT(0)
42 #define ENABLE_STRONG BIT(1)
50 struct xb1s_ff_report
{
53 __u8 magnitude
[MAGNITUDE_NUM
];
55 __u8 start_delay_10ms
;
59 static __u8
*ms_report_fixup(struct hid_device
*hdev
, __u8
*rdesc
,
62 struct ms_data
*ms
= hid_get_drvdata(hdev
);
63 unsigned long quirks
= ms
->quirks
;
66 * Microsoft Wireless Desktop Receiver (Model 1028) has
67 * 'Usage Min/Max' where it ought to have 'Physical Min/Max'
69 if ((quirks
& MS_RDESC
) && *rsize
== 571 && rdesc
[557] == 0x19 &&
71 hid_info(hdev
, "fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n");
78 #define ms_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
80 static int ms_ergonomy_kb_quirk(struct hid_input
*hi
, struct hid_usage
*usage
,
81 unsigned long **bit
, int *max
)
83 struct input_dev
*input
= hi
->input
;
85 if ((usage
->hid
& HID_USAGE_PAGE
) == HID_UP_CONSUMER
) {
86 switch (usage
->hid
& HID_USAGE
) {
88 * Microsoft uses these 2 reserved usage ids for 2 keys on
89 * the MS office kb labelled "Office Home" and "Task Pane".
92 ms_map_key_clear(KEY_PROG1
);
95 ms_map_key_clear(KEY_PROG2
);
101 if ((usage
->hid
& HID_USAGE_PAGE
) != HID_UP_MSVENDOR
)
104 switch (usage
->hid
& HID_USAGE
) {
105 case 0xfd06: ms_map_key_clear(KEY_CHAT
); break;
106 case 0xfd07: ms_map_key_clear(KEY_PHONE
); break;
108 /* Special keypad keys */
109 ms_map_key_clear(KEY_KPEQUAL
);
110 set_bit(KEY_KPLEFTPAREN
, input
->keybit
);
111 set_bit(KEY_KPRIGHTPAREN
, input
->keybit
);
115 hid_map_usage_clear(hi
, usage
, bit
, max
, EV_REL
, REL_WHEEL
);
119 * This byte contains a copy of the modifier keys byte of a
120 * standard hid keyboard report, as send by interface 0
121 * (this usage is found on interface 1).
123 * This byte only gets send when another key in the same report
124 * changes state, and as such is useless, ignore it.
128 set_bit(EV_REP
, input
->evbit
);
129 ms_map_key_clear(KEY_F13
);
130 set_bit(KEY_F14
, input
->keybit
);
131 set_bit(KEY_F15
, input
->keybit
);
132 set_bit(KEY_F16
, input
->keybit
);
133 set_bit(KEY_F17
, input
->keybit
);
134 set_bit(KEY_F18
, input
->keybit
);
142 static int ms_presenter_8k_quirk(struct hid_input
*hi
, struct hid_usage
*usage
,
143 unsigned long **bit
, int *max
)
145 if ((usage
->hid
& HID_USAGE_PAGE
) != HID_UP_MSVENDOR
)
148 set_bit(EV_REP
, hi
->input
->evbit
);
149 switch (usage
->hid
& HID_USAGE
) {
150 case 0xfd08: ms_map_key_clear(KEY_FORWARD
); break;
151 case 0xfd09: ms_map_key_clear(KEY_BACK
); break;
152 case 0xfd0b: ms_map_key_clear(KEY_PLAYPAUSE
); break;
153 case 0xfd0e: ms_map_key_clear(KEY_CLOSE
); break;
154 case 0xfd0f: ms_map_key_clear(KEY_PLAY
); break;
161 static int ms_surface_dial_quirk(struct hid_input
*hi
, struct hid_field
*field
,
162 struct hid_usage
*usage
, unsigned long **bit
, int *max
)
164 switch (usage
->hid
& HID_USAGE_PAGE
) {
166 case HID_UP_DIGITIZER
:
167 /* ignore those axis */
170 switch (usage
->hid
) {
173 case HID_GD_RFKILL_BTN
:
174 /* ignore those axis */
182 static int ms_input_mapping(struct hid_device
*hdev
, struct hid_input
*hi
,
183 struct hid_field
*field
, struct hid_usage
*usage
,
184 unsigned long **bit
, int *max
)
186 struct ms_data
*ms
= hid_get_drvdata(hdev
);
187 unsigned long quirks
= ms
->quirks
;
189 if (quirks
& MS_ERGONOMY
) {
190 int ret
= ms_ergonomy_kb_quirk(hi
, usage
, bit
, max
);
195 if ((quirks
& MS_PRESENTER
) &&
196 ms_presenter_8k_quirk(hi
, usage
, bit
, max
))
199 if (quirks
& MS_SURFACE_DIAL
) {
200 int ret
= ms_surface_dial_quirk(hi
, field
, usage
, bit
, max
);
209 static int ms_input_mapped(struct hid_device
*hdev
, struct hid_input
*hi
,
210 struct hid_field
*field
, struct hid_usage
*usage
,
211 unsigned long **bit
, int *max
)
213 struct ms_data
*ms
= hid_get_drvdata(hdev
);
214 unsigned long quirks
= ms
->quirks
;
216 if (quirks
& MS_DUPLICATE_USAGES
)
217 clear_bit(usage
->code
, *bit
);
222 static int ms_event(struct hid_device
*hdev
, struct hid_field
*field
,
223 struct hid_usage
*usage
, __s32 value
)
225 struct ms_data
*ms
= hid_get_drvdata(hdev
);
226 unsigned long quirks
= ms
->quirks
;
227 struct input_dev
*input
;
229 if (!(hdev
->claimed
& HID_CLAIMED_INPUT
) || !field
->hidinput
||
233 input
= field
->hidinput
->input
;
235 /* Handling MS keyboards special buttons */
236 if (quirks
& MS_ERGONOMY
&& usage
->hid
== (HID_UP_MSVENDOR
| 0xff00)) {
237 /* Special keypad keys */
238 input_report_key(input
, KEY_KPEQUAL
, value
& 0x01);
239 input_report_key(input
, KEY_KPLEFTPAREN
, value
& 0x02);
240 input_report_key(input
, KEY_KPRIGHTPAREN
, value
& 0x04);
244 if (quirks
& MS_ERGONOMY
&& usage
->hid
== (HID_UP_MSVENDOR
| 0xff01)) {
246 int step
= ((value
& 0x60) >> 5) + 1;
248 switch (value
& 0x1f) {
250 input_report_rel(input
, REL_WHEEL
, step
);
253 input_report_rel(input
, REL_WHEEL
, -step
);
259 if (quirks
& MS_ERGONOMY
&& usage
->hid
== (HID_UP_MSVENDOR
| 0xff05)) {
260 static unsigned int last_key
= 0;
261 unsigned int key
= 0;
263 case 0x01: key
= KEY_F14
; break;
264 case 0x02: key
= KEY_F15
; break;
265 case 0x04: key
= KEY_F16
; break;
266 case 0x08: key
= KEY_F17
; break;
267 case 0x10: key
= KEY_F18
; break;
270 input_event(input
, usage
->type
, key
, 1);
273 input_event(input
, usage
->type
, last_key
, 0);
281 static void ms_ff_worker(struct work_struct
*work
)
283 struct ms_data
*ms
= container_of(work
, struct ms_data
, ff_worker
);
284 struct hid_device
*hdev
= ms
->hdev
;
285 struct xb1s_ff_report
*r
= ms
->output_report_dmabuf
;
288 memset(r
, 0, sizeof(*r
));
290 r
->report_id
= XB1S_FF_REPORT
;
291 r
->enable
= ENABLE_WEAK
| ENABLE_STRONG
;
293 * Specifying maximum duration and maximum loop count should
294 * cover maximum duration of a single effect, which is 65536
297 r
->duration_10ms
= U8_MAX
;
298 r
->loop_count
= U8_MAX
;
299 r
->magnitude
[MAGNITUDE_STRONG
] = ms
->strong
; /* left actuator */
300 r
->magnitude
[MAGNITUDE_WEAK
] = ms
->weak
; /* right actuator */
302 ret
= hid_hw_output_report(hdev
, (__u8
*)r
, sizeof(*r
));
304 hid_warn(hdev
, "failed to send FF report\n");
307 static int ms_play_effect(struct input_dev
*dev
, void *data
,
308 struct ff_effect
*effect
)
310 struct hid_device
*hid
= input_get_drvdata(dev
);
311 struct ms_data
*ms
= hid_get_drvdata(hid
);
313 if (effect
->type
!= FF_RUMBLE
)
317 * Magnitude is 0..100 so scale the 16-bit input here
319 ms
->strong
= ((u32
) effect
->u
.rumble
.strong_magnitude
* 100) / U16_MAX
;
320 ms
->weak
= ((u32
) effect
->u
.rumble
.weak_magnitude
* 100) / U16_MAX
;
322 schedule_work(&ms
->ff_worker
);
326 static int ms_init_ff(struct hid_device
*hdev
)
328 struct hid_input
*hidinput
;
329 struct input_dev
*input_dev
;
330 struct ms_data
*ms
= hid_get_drvdata(hdev
);
332 if (list_empty(&hdev
->inputs
)) {
333 hid_err(hdev
, "no inputs found\n");
336 hidinput
= list_entry(hdev
->inputs
.next
, struct hid_input
, list
);
337 input_dev
= hidinput
->input
;
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
},
451 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT
, USB_DEVICE_ID_8BITDO_SN30_PRO_PLUS
),
452 .driver_data
= MS_QUIRK_FF
},
455 MODULE_DEVICE_TABLE(hid
, ms_devices
);
457 static struct hid_driver ms_driver
= {
459 .id_table
= ms_devices
,
460 .report_fixup
= ms_report_fixup
,
461 .input_mapping
= ms_input_mapping
,
462 .input_mapped
= ms_input_mapped
,
467 module_hid_driver(ms_driver
);
469 MODULE_LICENSE("GPL");