@@ -72,6 +72,7 @@ MODULE_LICENSE("GPL");
72
72
#define MT_QUIRK_FIX_CONST_CONTACT_ID BIT(14)
73
73
#define MT_QUIRK_TOUCH_SIZE_SCALING BIT(15)
74
74
#define MT_QUIRK_STICKY_FINGERS BIT(16)
75
+ #define MT_QUIRK_ASUS_CUSTOM_UP BIT(17)
75
76
76
77
#define MT_INPUTMODE_TOUCHSCREEN 0x02
77
78
#define MT_INPUTMODE_TOUCHPAD 0x03
@@ -169,6 +170,7 @@ static void mt_post_parse(struct mt_device *td);
169
170
#define MT_CLS_GENERALTOUCH_TWOFINGERS 0x0108
170
171
#define MT_CLS_GENERALTOUCH_PWT_TENFINGERS 0x0109
171
172
#define MT_CLS_LG 0x010a
173
+ #define MT_CLS_ASUS 0x010b
172
174
#define MT_CLS_VTL 0x0110
173
175
#define MT_CLS_GOOGLE 0x0111
174
176
@@ -290,6 +292,10 @@ static struct mt_class mt_classes[] = {
290
292
MT_QUIRK_IGNORE_DUPLICATES |
291
293
MT_QUIRK_HOVERING |
292
294
MT_QUIRK_CONTACT_CNT_ACCURATE },
295
+ { .name = MT_CLS_ASUS ,
296
+ .quirks = MT_QUIRK_ALWAYS_VALID |
297
+ MT_QUIRK_CONTACT_CNT_ACCURATE |
298
+ MT_QUIRK_ASUS_CUSTOM_UP },
293
299
{ .name = MT_CLS_VTL ,
294
300
.quirks = MT_QUIRK_ALWAYS_VALID |
295
301
MT_QUIRK_CONTACT_CNT_ACCURATE |
@@ -905,6 +911,8 @@ static int mt_touch_input_configured(struct hid_device *hdev,
905
911
return 0 ;
906
912
}
907
913
914
+ #define mt_map_key_clear (c ) hid_map_usage_clear(hi, usage, bit, \
915
+ max, EV_KEY, (c))
908
916
static int mt_input_mapping (struct hid_device * hdev , struct hid_input * hi ,
909
917
struct hid_field * field , struct hid_usage * usage ,
910
918
unsigned long * * bit , int * max )
@@ -922,9 +930,35 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
922
930
field -> application != HID_DG_PEN &&
923
931
field -> application != HID_DG_TOUCHPAD &&
924
932
field -> application != HID_GD_KEYBOARD &&
925
- field -> application != HID_CP_CONSUMER_CONTROL )
933
+ field -> application != HID_CP_CONSUMER_CONTROL &&
934
+ field -> application != HID_GD_WIRELESS_RADIO_CTLS &&
935
+ !(field -> application == HID_VD_ASUS_CUSTOM_MEDIA_KEYS &&
936
+ td -> mtclass .quirks & MT_QUIRK_ASUS_CUSTOM_UP ))
926
937
return -1 ;
927
938
939
+ /*
940
+ * Some Asus keyboard+touchpad devices have the hotkeys defined in the
941
+ * touchpad report descriptor. We need to treat these as an array to
942
+ * map usages to input keys.
943
+ */
944
+ if (field -> application == HID_VD_ASUS_CUSTOM_MEDIA_KEYS &&
945
+ td -> mtclass .quirks & MT_QUIRK_ASUS_CUSTOM_UP &&
946
+ (usage -> hid & HID_USAGE_PAGE ) == HID_UP_CUSTOM ) {
947
+ set_bit (EV_REP , hi -> input -> evbit );
948
+ if (field -> flags & HID_MAIN_ITEM_VARIABLE )
949
+ field -> flags &= ~HID_MAIN_ITEM_VARIABLE ;
950
+ switch (usage -> hid & HID_USAGE ) {
951
+ case 0x10 : mt_map_key_clear (KEY_BRIGHTNESSDOWN ); break ;
952
+ case 0x20 : mt_map_key_clear (KEY_BRIGHTNESSUP ); break ;
953
+ case 0x35 : mt_map_key_clear (KEY_DISPLAY_OFF ); break ;
954
+ case 0x6b : mt_map_key_clear (KEY_F21 ); break ;
955
+ case 0x6c : mt_map_key_clear (KEY_SLEEP ); break ;
956
+ default :
957
+ return -1 ;
958
+ }
959
+ return 1 ;
960
+ }
961
+
928
962
/*
929
963
* some egalax touchscreens have "application == HID_DG_TOUCHSCREEN"
930
964
* for the stylus.
@@ -1133,6 +1167,12 @@ static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
1133
1167
case HID_CP_CONSUMER_CONTROL :
1134
1168
suffix = "Consumer Control" ;
1135
1169
break ;
1170
+ case HID_GD_WIRELESS_RADIO_CTLS :
1171
+ suffix = "Wireless Radio Control" ;
1172
+ break ;
1173
+ case HID_VD_ASUS_CUSTOM_MEDIA_KEYS :
1174
+ suffix = "Custom Media Keys" ;
1175
+ break ;
1136
1176
default :
1137
1177
suffix = "UNKNOWN" ;
1138
1178
break ;
@@ -1384,6 +1424,12 @@ static const struct hid_device_id mt_devices[] = {
1384
1424
MT_USB_DEVICE (USB_VENDOR_ID_ANTON ,
1385
1425
USB_DEVICE_ID_ANTON_TOUCH_PAD ) },
1386
1426
1427
+ /* Asus T304UA */
1428
+ { .driver_data = MT_CLS_ASUS ,
1429
+ HID_DEVICE (BUS_USB , HID_GROUP_MULTITOUCH_WIN_8 ,
1430
+ USB_VENDOR_ID_ASUSTEK ,
1431
+ USB_DEVICE_ID_ASUSTEK_T304_KEYBOARD ) },
1432
+
1387
1433
/* Atmel panels */
1388
1434
{ .driver_data = MT_CLS_SERIAL ,
1389
1435
MT_USB_DEVICE (USB_VENDOR_ID_ATMEL ,
0 commit comments