-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathx205ta-special-keys.patch
97 lines (90 loc) · 2.93 KB
/
x205ta-special-keys.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c
index 70b12f8..11171a8 100644
--- a/drivers/hid/hid-asus.c
+++ b/drivers/hid/hid-asus.c
@@ -1,12 +1,14 @@
/*
* HID driver for Asus notebook built-in keyboard.
- * Fixes small logical maximum to match usage maximum.
+ * Fixes small logical maximum to match usage maximum and
+ * ignores dummy usages.
*
* Currently supported devices are:
* EeeBook X205TA
* VivoBook E200HA
*
* Copyright (c) 2016 Yusuke Fujimaki <usk.fujimaki@gmail.com>
+ * Copyright (c) 2017 Matjaz Hegedic <matjaz.hegedic@gmail.com>
*
* This module based on hid-ortek by
* Copyright (c) 2010 Johnathon Harris <jmharris@gmail.com>
@@ -36,8 +38,11 @@ MODULE_AUTHOR("Yusuke Fujimaki <usk.fujimaki@gmail.com>");
MODULE_AUTHOR("Brendan McGrath <redmcg@redmandi.dyndns.org>");
MODULE_AUTHOR("Victor Vlasenko <victor.vlasenko@sysgears.com>");
MODULE_AUTHOR("Frederik Wenigwieser <frederik.wenigwieser@gmail.com>");
+MODULE_AUTHOR("Matjaz Hegedic <matjaz.hegedic@gmail.com>");
MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad");
+#define HID_UP_ASUSVENDOR 0xff310000
+
#define FEATURE_REPORT_ID 0x0d
#define INPUT_REPORT_ID 0x5d
@@ -63,15 +68,20 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad");
#define QUIRK_NO_INIT_REPORTS BIT(1)
#define QUIRK_SKIP_INPUT_MAPPING BIT(2)
#define QUIRK_IS_MULTITOUCH BIT(3)
+#define QUIRK_NO_CONSUMER_USAGES BIT(4)
#define KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \
- QUIRK_NO_INIT_REPORTS)
+ QUIRK_NO_INIT_REPORTS | \
+ QUIRK_NO_CONSUMER_USAGES)
#define TOUCHPAD_QUIRKS (QUIRK_NO_INIT_REPORTS | \
QUIRK_SKIP_INPUT_MAPPING | \
QUIRK_IS_MULTITOUCH)
#define TRKID_SGN ((TRKID_MAX + 1) >> 1)
+#define asus_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, \
+ max, EV_KEY, (c))
+
struct asus_drvdata {
unsigned long quirks;
struct input_dev *input;
@@ -213,6 +223,42 @@ static int asus_input_mapping(struct hid_device *hdev,
return -1;
}
+ if ((usage->hid & HID_USAGE_PAGE) == HID_UP_ASUSVENDOR) {
+ switch (usage->hid & HID_USAGE) {
+ case 0x10:
+ asus_map_key_clear(KEY_BRIGHTNESSDOWN); break;
+ case 0x20:
+ asus_map_key_clear(KEY_BRIGHTNESSUP); break;
+ case 0x35:
+ asus_map_key_clear(KEY_DISPLAY_OFF); break;
+ case 0x6b:
+ asus_map_key_clear(KEY_F21); break;
+ case 0x6c:
+ asus_map_key_clear(KEY_SLEEP); break;
+ case 0x88:
+ asus_map_key_clear(KEY_RFKILL); break;
+ default:
+ /* ASUS lazily declares 256 usages, ignore the rest */
+ return -1;
+ }
+ return 1;
+ }
+
+ if (drvdata->quirks & QUIRK_NO_CONSUMER_USAGES &&
+ (usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER) {
+ switch (usage->hid & HID_USAGE) {
+ case 0xe2: /* Mute */
+ case 0xe9: /* Volume up */
+ case 0xea: /* Volume down */
+ return 0;
+ default:
+ /* Ignore dummy Consumer usages which make the
+ * keyboard incorrectly appear as a pointer device.
+ */
+ return -1;
+ }
+ }
+
return 0;
}