On Aug 02 2017 or thereabouts, Jiri Kosina wrote: > On Mon, 24 Jul 2017, João Paulo Rechi Vita wrote: > > > The Asus T304UA convertible sports a magnetic detachable keyboard with > > touchpad, which is connected over USB. Most of the keyboard hotkeys are > > exposed through the same USB interface as the touchpad, defined in the > > report descriptor as follows: > > > > 0x06, 0x31, 0xFF, // Usage Page (Vendor Defined 0xFF31) > > 0x09, 0x76, // Usage (0x76) > > 0xA1, 0x01, // Collection (Application) > > 0x05, 0xFF, // Usage Page (Reserved 0xFF) > > 0x85, 0x5A, // Report ID (90) > > 0x19, 0x00, // Usage Minimum (0x00) > > 0x2A, 0xFF, 0x00, // Usage Maximum (0xFF) > > 0x15, 0x00, // Logical Minimum (0) > > 0x26, 0xFF, 0x00, // Logical Maximum (255) > > 0x75, 0x08, // Report Size (8) > > 0x95, 0x0F, // Report Count (15) > > 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) > > 0x05, 0xFF, // Usage Page (Reserved 0xFF) > > 0x85, 0x5A, // Report ID (90) > > 0x19, 0x00, // Usage Minimum (0x00) > > 0x2A, 0xFF, 0x00, // Usage Maximum (0xFF) > > 0x15, 0x00, // Logical Minimum (0) > > 0x26, 0xFF, 0x00, // Logical Maximum (255) > > 0x75, 0x08, // Report Size (8) > > 0x95, 0x02, // Report Count (2) > > 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) > > 0xC0, // End Collection > > > > This UsagePage is declared as a variable, but we need to treat it as an > > array to be able to map each Usage we care about to its corresponding > > input key. > > > > Signed-off-by: João Paulo Rechi Vita <jprvita@xxxxxxxxxxxx> > > --- > > drivers/hid/hid-ids.h | 1 + > > drivers/hid/hid-multitouch.c | 44 +++++++++++++++++++++++++++++++++++++++++++- > > include/linux/hid.h | 2 ++ > > 3 files changed, 46 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h > > index 3d911bfd91cf..6b7f9707076e 100644 > > --- a/drivers/hid/hid-ids.h > > +++ b/drivers/hid/hid-ids.h > > @@ -176,6 +176,7 @@ > > #define USB_DEVICE_ID_ASUSTEK_LCM 0x1726 > > #define USB_DEVICE_ID_ASUSTEK_LCM2 0x175b > > #define USB_DEVICE_ID_ASUSTEK_T100_KEYBOARD 0x17e0 > > +#define USB_DEVICE_ID_ASUSTEK_T304_KEYBOARD 0x184a > > #define USB_DEVICE_ID_ASUSTEK_I2C_KEYBOARD 0x8585 > > #define USB_DEVICE_ID_ASUSTEK_I2C_TOUCHPAD 0x0101 > > #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1 0x1854 > > diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c > > index 152d33120a55..6b3de7b01571 100644 > > --- a/drivers/hid/hid-multitouch.c > > +++ b/drivers/hid/hid-multitouch.c > > @@ -72,6 +72,7 @@ MODULE_LICENSE("GPL"); > > #define MT_QUIRK_FIX_CONST_CONTACT_ID BIT(14) > > #define MT_QUIRK_TOUCH_SIZE_SCALING BIT(15) > > #define MT_QUIRK_STICKY_FINGERS BIT(16) > > +#define MT_QUIRK_ASUS_CUSTOM_UP BIT(17) > > > > #define MT_INPUTMODE_TOUCHSCREEN 0x02 > > #define MT_INPUTMODE_TOUCHPAD 0x03 > > @@ -169,6 +170,7 @@ static void mt_post_parse(struct mt_device *td); > > #define MT_CLS_GENERALTOUCH_TWOFINGERS 0x0108 > > #define MT_CLS_GENERALTOUCH_PWT_TENFINGERS 0x0109 > > #define MT_CLS_LG 0x010a > > +#define MT_CLS_ASUS 0x010b > > #define MT_CLS_VTL 0x0110 > > #define MT_CLS_GOOGLE 0x0111 > > > > @@ -290,6 +292,10 @@ static struct mt_class mt_classes[] = { > > MT_QUIRK_IGNORE_DUPLICATES | > > MT_QUIRK_HOVERING | > > MT_QUIRK_CONTACT_CNT_ACCURATE }, > > + { .name = MT_CLS_ASUS, > > + .quirks = MT_QUIRK_ALWAYS_VALID | > > + MT_QUIRK_CONTACT_CNT_ACCURATE | > > + MT_QUIRK_ASUS_CUSTOM_UP }, > > { .name = MT_CLS_VTL, > > .quirks = MT_QUIRK_ALWAYS_VALID | > > MT_QUIRK_CONTACT_CNT_ACCURATE | > > @@ -905,6 +911,8 @@ static int mt_touch_input_configured(struct hid_device *hdev, > > return 0; > > } > > > > +#define mt_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, \ > > + max, EV_KEY, (c)) > > static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, > > struct hid_field *field, struct hid_usage *usage, > > unsigned long **bit, int *max) > > @@ -923,10 +931,35 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, > > field->application != HID_DG_TOUCHPAD && > > field->application != HID_GD_KEYBOARD && > > field->application != HID_CP_CONSUMER_CONTROL && > > - field->application != HID_GD_WIRELESS_RADIO_CTLS) > > + field->application != HID_GD_WIRELESS_RADIO_CTLS && > > + !(field->application == HID_VD_ASUS_CUSTOM_MEDIA_KEYS && > > + td->mtclass.quirks & MT_QUIRK_ASUS_CUSTOM_UP)) > > return -1; > > > > /* > > + * Some Asus keyboard+touchpad devices have the hotkeys defined in the > > + * touchpad report descriptor. We need to treat these as an array to > > + * map usages to input keys. > > + */ > > + if (field->application == 0xff310076 && > > Could you please follow the convention and define a symbolic constant for > this as well? > > Otherwise the patch looks OK to me, so after this minor nit is fixed, I'll > be queuing it for 4.14 unless Benjamin raises any objections. > Sorry for the delay. I was at GUADEC the whole past week and couldn't get much kernel work done. I was thinking a little bit about this series though. Patch 1 is fine, but patch 2 is a little bit more of an issue. Ideally, I'd like to keep hid-multitouch from having too many vendor specific code, but it looks like this is the easier way to handle things here. I guess the proper way of solving this situation would be to merge the generic windows 8 code from hid-multitouch into hid-input so that other drivers can benefit from it, but this is going to be a lot of work and -ETIME. Jiri, I wouldn't scream too loud if you merge this, so do as you want :) Cheers, Benjamin > Thanks, > > -- > Jiri Kosina > SUSE Labs > -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html