Loading drivers/hid/hid-asus.c +109 −14 Original line number Diff line number Diff line Loading @@ -48,6 +48,8 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define INPUT_REPORT_ID 0x5d #define FEATURE_KBD_REPORT_ID 0x5a #define FEATURE_KBD_REPORT_SIZE 16 #define FEATURE_KBD_LED_REPORT_ID1 0x5d #define FEATURE_KBD_LED_REPORT_ID2 0x5e #define SUPPORT_KBD_BACKLIGHT BIT(0) Loading Loading @@ -80,6 +82,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define QUIRK_T101HA_DOCK BIT(9) #define QUIRK_T90CHI BIT(10) #define QUIRK_MEDION_E1239T BIT(11) #define QUIRK_ROG_NKEY_KEYBOARD BIT(12) #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ QUIRK_NO_INIT_REPORTS | \ Loading Loading @@ -332,6 +335,28 @@ static int asus_raw_event(struct hid_device *hdev, if (drvdata->quirks & QUIRK_MEDION_E1239T) return asus_e1239t_event(drvdata, data, size); if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { /* * Skip these report ID, the device emits a continuous stream associated * with the AURA mode it is in which looks like an 'echo'. */ if (report->id == FEATURE_KBD_LED_REPORT_ID1 || report->id == FEATURE_KBD_LED_REPORT_ID2) { return -1; /* Additional report filtering */ } else if (report->id == FEATURE_KBD_REPORT_ID) { /* * G14 and G15 send these codes on some keypresses with no * discernable reason for doing so. We'll filter them out to avoid * unmapped warning messages later. */ if (data[1] == 0xea || data[1] == 0xec || data[1] == 0x02 || data[1] == 0x8a || data[1] == 0x9e) { return -1; } } } return 0; } Loading @@ -344,7 +369,11 @@ static int asus_kbd_set_report(struct hid_device *hdev, u8 *buf, size_t buf_size if (!dmabuf) return -ENOMEM; ret = hid_hw_raw_request(hdev, FEATURE_KBD_REPORT_ID, dmabuf, /* * The report ID should be set from the incoming buffer due to LED and key * interfaces having different pages */ ret = hid_hw_raw_request(hdev, buf[0], dmabuf, buf_size, HID_FEATURE_REPORT, HID_REQ_SET_REPORT); kfree(dmabuf); Loading Loading @@ -397,6 +426,51 @@ static int asus_kbd_get_functions(struct hid_device *hdev, return ret; } static int rog_nkey_led_init(struct hid_device *hdev) { u8 buf_init_start[] = { FEATURE_KBD_LED_REPORT_ID1, 0xB9 }; u8 buf_init2[] = { FEATURE_KBD_LED_REPORT_ID1, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54, 0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 }; u8 buf_init3[] = { FEATURE_KBD_LED_REPORT_ID1, 0x05, 0x20, 0x31, 0x00, 0x08 }; int ret; hid_info(hdev, "Asus initialise N-KEY Device"); /* The first message is an init start */ ret = asus_kbd_set_report(hdev, buf_init_start, sizeof(buf_init_start)); if (ret < 0) { hid_warn(hdev, "Asus failed to send init start command: %d\n", ret); return ret; } /* Followed by a string */ ret = asus_kbd_set_report(hdev, buf_init2, sizeof(buf_init2)); if (ret < 0) { hid_warn(hdev, "Asus failed to send init command 1.0: %d\n", ret); return ret; } /* Followed by a string */ ret = asus_kbd_set_report(hdev, buf_init3, sizeof(buf_init3)); if (ret < 0) { hid_warn(hdev, "Asus failed to send init command 1.1: %d\n", ret); return ret; } /* begin second report ID with same data */ buf_init2[0] = FEATURE_KBD_LED_REPORT_ID2; buf_init3[0] = FEATURE_KBD_LED_REPORT_ID2; ret = asus_kbd_set_report(hdev, buf_init2, sizeof(buf_init2)); if (ret < 0) { hid_warn(hdev, "Asus failed to send init command 2.0: %d\n", ret); return ret; } ret = asus_kbd_set_report(hdev, buf_init3, sizeof(buf_init3)); if (ret < 0) hid_warn(hdev, "Asus failed to send init command 2.1: %d\n", ret); return ret; } static void asus_kbd_backlight_set(struct led_classdev *led_cdev, enum led_brightness brightness) { Loading Loading @@ -460,6 +534,11 @@ static int asus_kbd_register_leds(struct hid_device *hdev) unsigned char kbd_func; int ret; if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { ret = rog_nkey_led_init(hdev); if (ret < 0) return ret; } else { /* Initialize keyboard */ ret = asus_kbd_init(hdev); if (ret < 0) Loading @@ -473,6 +552,7 @@ static int asus_kbd_register_leds(struct hid_device *hdev) /* Check for backlight support */ if (!(kbd_func & SUPPORT_KBD_BACKLIGHT)) return -ENODEV; } drvdata->kbd_backlight = devm_kzalloc(&hdev->dev, sizeof(struct asus_kbd_leds), Loading Loading @@ -751,8 +831,8 @@ static int asus_input_mapping(struct hid_device *hdev, usage->hid == (HID_UP_GENDEVCTRLS | 0x0026))) return -1; /* ASUS-specific keyboard hotkeys */ if ((usage->hid & HID_USAGE_PAGE) == 0xff310000) { /* ASUS-specific keyboard hotkeys and led backlight */ 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; Loading Loading @@ -780,6 +860,18 @@ static int asus_input_mapping(struct hid_device *hdev, /* Fn+F5 "fan" symbol on FX503VD */ case 0x99: asus_map_key_clear(KEY_PROG4); break; /* Fn+F5 "fan" symbol on N-Key keyboard */ case 0xae: asus_map_key_clear(KEY_PROG4); break; /* Fn+Ret "Calc" symbol on N-Key keyboard */ case 0x92: asus_map_key_clear(KEY_CALC); break; /* Fn+Left Aura mode previous on N-Key keyboard */ case 0xb2: asus_map_key_clear(KEY_PROG2); break; /* Fn+Right Aura mode next on N-Key keyboard */ case 0xb3: asus_map_key_clear(KEY_PROG3); break; default: /* ASUS lazily declares 256 usages, ignore the rest, * as some make the keyboard appear as a pointer device. */ Loading Loading @@ -1126,6 +1218,9 @@ static const struct hid_device_id asus_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD), QUIRK_USE_KBD_BACKLIGHT }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD), QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_T100TA_KEYBOARD), QUIRK_T100_KEYBOARD | QUIRK_NO_CONSUMER_USAGES }, Loading drivers/hid/hid-ids.h +1 −0 Original line number Diff line number Diff line Loading @@ -190,6 +190,7 @@ #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1 0x1854 #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2 0x1837 #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3 0x1822 #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD 0x1866 #define USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD 0x1869 #define USB_VENDOR_ID_ATEN 0x0557 Loading Loading
drivers/hid/hid-asus.c +109 −14 Original line number Diff line number Diff line Loading @@ -48,6 +48,8 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define INPUT_REPORT_ID 0x5d #define FEATURE_KBD_REPORT_ID 0x5a #define FEATURE_KBD_REPORT_SIZE 16 #define FEATURE_KBD_LED_REPORT_ID1 0x5d #define FEATURE_KBD_LED_REPORT_ID2 0x5e #define SUPPORT_KBD_BACKLIGHT BIT(0) Loading Loading @@ -80,6 +82,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define QUIRK_T101HA_DOCK BIT(9) #define QUIRK_T90CHI BIT(10) #define QUIRK_MEDION_E1239T BIT(11) #define QUIRK_ROG_NKEY_KEYBOARD BIT(12) #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ QUIRK_NO_INIT_REPORTS | \ Loading Loading @@ -332,6 +335,28 @@ static int asus_raw_event(struct hid_device *hdev, if (drvdata->quirks & QUIRK_MEDION_E1239T) return asus_e1239t_event(drvdata, data, size); if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { /* * Skip these report ID, the device emits a continuous stream associated * with the AURA mode it is in which looks like an 'echo'. */ if (report->id == FEATURE_KBD_LED_REPORT_ID1 || report->id == FEATURE_KBD_LED_REPORT_ID2) { return -1; /* Additional report filtering */ } else if (report->id == FEATURE_KBD_REPORT_ID) { /* * G14 and G15 send these codes on some keypresses with no * discernable reason for doing so. We'll filter them out to avoid * unmapped warning messages later. */ if (data[1] == 0xea || data[1] == 0xec || data[1] == 0x02 || data[1] == 0x8a || data[1] == 0x9e) { return -1; } } } return 0; } Loading @@ -344,7 +369,11 @@ static int asus_kbd_set_report(struct hid_device *hdev, u8 *buf, size_t buf_size if (!dmabuf) return -ENOMEM; ret = hid_hw_raw_request(hdev, FEATURE_KBD_REPORT_ID, dmabuf, /* * The report ID should be set from the incoming buffer due to LED and key * interfaces having different pages */ ret = hid_hw_raw_request(hdev, buf[0], dmabuf, buf_size, HID_FEATURE_REPORT, HID_REQ_SET_REPORT); kfree(dmabuf); Loading Loading @@ -397,6 +426,51 @@ static int asus_kbd_get_functions(struct hid_device *hdev, return ret; } static int rog_nkey_led_init(struct hid_device *hdev) { u8 buf_init_start[] = { FEATURE_KBD_LED_REPORT_ID1, 0xB9 }; u8 buf_init2[] = { FEATURE_KBD_LED_REPORT_ID1, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54, 0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 }; u8 buf_init3[] = { FEATURE_KBD_LED_REPORT_ID1, 0x05, 0x20, 0x31, 0x00, 0x08 }; int ret; hid_info(hdev, "Asus initialise N-KEY Device"); /* The first message is an init start */ ret = asus_kbd_set_report(hdev, buf_init_start, sizeof(buf_init_start)); if (ret < 0) { hid_warn(hdev, "Asus failed to send init start command: %d\n", ret); return ret; } /* Followed by a string */ ret = asus_kbd_set_report(hdev, buf_init2, sizeof(buf_init2)); if (ret < 0) { hid_warn(hdev, "Asus failed to send init command 1.0: %d\n", ret); return ret; } /* Followed by a string */ ret = asus_kbd_set_report(hdev, buf_init3, sizeof(buf_init3)); if (ret < 0) { hid_warn(hdev, "Asus failed to send init command 1.1: %d\n", ret); return ret; } /* begin second report ID with same data */ buf_init2[0] = FEATURE_KBD_LED_REPORT_ID2; buf_init3[0] = FEATURE_KBD_LED_REPORT_ID2; ret = asus_kbd_set_report(hdev, buf_init2, sizeof(buf_init2)); if (ret < 0) { hid_warn(hdev, "Asus failed to send init command 2.0: %d\n", ret); return ret; } ret = asus_kbd_set_report(hdev, buf_init3, sizeof(buf_init3)); if (ret < 0) hid_warn(hdev, "Asus failed to send init command 2.1: %d\n", ret); return ret; } static void asus_kbd_backlight_set(struct led_classdev *led_cdev, enum led_brightness brightness) { Loading Loading @@ -460,6 +534,11 @@ static int asus_kbd_register_leds(struct hid_device *hdev) unsigned char kbd_func; int ret; if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { ret = rog_nkey_led_init(hdev); if (ret < 0) return ret; } else { /* Initialize keyboard */ ret = asus_kbd_init(hdev); if (ret < 0) Loading @@ -473,6 +552,7 @@ static int asus_kbd_register_leds(struct hid_device *hdev) /* Check for backlight support */ if (!(kbd_func & SUPPORT_KBD_BACKLIGHT)) return -ENODEV; } drvdata->kbd_backlight = devm_kzalloc(&hdev->dev, sizeof(struct asus_kbd_leds), Loading Loading @@ -751,8 +831,8 @@ static int asus_input_mapping(struct hid_device *hdev, usage->hid == (HID_UP_GENDEVCTRLS | 0x0026))) return -1; /* ASUS-specific keyboard hotkeys */ if ((usage->hid & HID_USAGE_PAGE) == 0xff310000) { /* ASUS-specific keyboard hotkeys and led backlight */ 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; Loading Loading @@ -780,6 +860,18 @@ static int asus_input_mapping(struct hid_device *hdev, /* Fn+F5 "fan" symbol on FX503VD */ case 0x99: asus_map_key_clear(KEY_PROG4); break; /* Fn+F5 "fan" symbol on N-Key keyboard */ case 0xae: asus_map_key_clear(KEY_PROG4); break; /* Fn+Ret "Calc" symbol on N-Key keyboard */ case 0x92: asus_map_key_clear(KEY_CALC); break; /* Fn+Left Aura mode previous on N-Key keyboard */ case 0xb2: asus_map_key_clear(KEY_PROG2); break; /* Fn+Right Aura mode next on N-Key keyboard */ case 0xb3: asus_map_key_clear(KEY_PROG3); break; default: /* ASUS lazily declares 256 usages, ignore the rest, * as some make the keyboard appear as a pointer device. */ Loading Loading @@ -1126,6 +1218,9 @@ static const struct hid_device_id asus_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD), QUIRK_USE_KBD_BACKLIGHT }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD), QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_T100TA_KEYBOARD), QUIRK_T100_KEYBOARD | QUIRK_NO_CONSUMER_USAGES }, Loading
drivers/hid/hid-ids.h +1 −0 Original line number Diff line number Diff line Loading @@ -190,6 +190,7 @@ #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD1 0x1854 #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD2 0x1837 #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3 0x1822 #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD 0x1866 #define USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD 0x1869 #define USB_VENDOR_ID_ATEN 0x0557 Loading