18 #include <linux/device.h>
19 #include <linux/input.h>
20 #include <linux/hid.h>
21 #include <linux/module.h>
25 #define MS_HIDINPUT 0x01
26 #define MS_ERGONOMY 0x02
27 #define MS_PRESENTER 0x04
30 #define MS_DUPLICATE_USAGES 0x20
31 #define MS_RDESC_3K 0x40
36 unsigned long quirks = (
unsigned long)hid_get_drvdata(hdev);
42 if ((quirks &
MS_RDESC) && *rsize == 571 && rdesc[557] == 0x19 &&
44 hid_info(hdev,
"fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n");
49 if ((quirks &
MS_RDESC_3K) && *rsize == 106 && rdesc[94] == 0x19 &&
50 rdesc[95] == 0x00 && rdesc[96] == 0x29 &&
58 #define ms_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \
61 unsigned long **
bit,
int *
max)
83 unsigned long **
bit,
int *
max)
100 unsigned long **bit,
int *max)
102 unsigned long quirks = (
unsigned long)hid_get_drvdata(hdev);
108 int ret = ms_ergonomy_kb_quirk(hi, usage, bit, max);
114 ms_presenter_8k_quirk(hi, usage, bit, max))
122 unsigned long **bit,
int *max)
124 unsigned long quirks = (
unsigned long)hid_get_drvdata(hdev);
135 unsigned long quirks = (
unsigned long)hid_get_drvdata(hdev);
144 static unsigned int last_key = 0;
145 unsigned int key = 0;
147 case 0x01: key =
KEY_F14;
break;
148 case 0x02: key =
KEY_F15;
break;
149 case 0x04: key =
KEY_F16;
break;
150 case 0x08: key =
KEY_F17;
break;
151 case 0x10: key =
KEY_F18;
break;
167 unsigned long quirks =
id->driver_data;
170 hid_set_drvdata(hdev, (
void *)quirks);
175 ret = hid_parse(hdev);
177 hid_err(hdev,
"parse failed\n");
184 hid_err(hdev,
"hw start failed\n");
197 .driver_data = MS_ERGONOMY },
199 .driver_data = MS_ERGONOMY |
MS_RDESC },
201 .driver_data = MS_PRESENTER },
205 .driver_data = MS_NOGET },
210 .driver_data = MS_PRESENTER },
217 .id_table = ms_devices,
218 .report_fixup = ms_report_fixup,
219 .input_mapping = ms_input_mapping,
220 .input_mapped = ms_input_mapped,
225 static int __init ms_init(
void)
230 static void __exit ms_exit(
void)