Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: hid: import hid-tools hid-ite tests

These tests have been developed in the hid-tools[0] tree for a while.
Now that we have a proper selftests/hid kernel entry and that the tests
are more reliable, it is time to directly include those in the kernel
tree.

[0] https://gitlab.freedesktop.org/libevdev/hid-tools

Cc: Peter Hutterer <peter.hutterer@who-t.net>
Cc: Roderick Colenbrander <roderick.colenbrander@sony.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Roderick Colenbrander <roderick.colenbrander@sony.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>

+175
+1
tools/testing/selftests/hid/Makefile
··· 8 8 TEST_PROGS := hid-core.sh 9 9 TEST_PROGS += hid-apple.sh 10 10 TEST_PROGS += hid-gamepad.sh 11 + TEST_PROGS += hid-ite.sh 11 12 TEST_PROGS += hid-keyboard.sh 12 13 TEST_PROGS += hid-mouse.sh 13 14 TEST_PROGS += hid-multitouch.sh
+1
tools/testing/selftests/hid/config
··· 23 23 CONFIG_USB=y 24 24 CONFIG_USB_HID=y 25 25 CONFIG_HID_APPLE=y 26 + CONFIG_HID_ITE=y 26 27 CONFIG_HID_MULTITOUCH=y 27 28 CONFIG_HID_WACOM=y
+7
tools/testing/selftests/hid/hid-ite.sh
··· 1 + #!/bin/sh 2 + # SPDX-License-Identifier: GPL-2.0 3 + # Runs tests for the HID subsystem 4 + 5 + export TARGET=test_ite_keyboard.py 6 + 7 + bash ./run-hid-tools-tests.sh
+166
tools/testing/selftests/hid/tests/test_ite_keyboard.py
··· 1 + #!/bin/env python3 2 + # SPDX-License-Identifier: GPL-2.0 3 + # -*- coding: utf-8 -*- 4 + # 5 + # Copyright (c) 2020 Benjamin Tissoires <benjamin.tissoires@gmail.com> 6 + # Copyright (c) 2020 Red Hat, Inc. 7 + # 8 + 9 + from .test_keyboard import ArrayKeyboard, TestArrayKeyboard 10 + from hidtools.util import BusType 11 + 12 + import libevdev 13 + import logging 14 + 15 + logger = logging.getLogger("hidtools.test.ite-keyboard") 16 + 17 + KERNEL_MODULE = ("itetech", "hid_ite") 18 + 19 + 20 + class KbdData(object): 21 + pass 22 + 23 + 24 + # The ITE keyboards have an issue regarding the Wifi key: 25 + # nothing comes in when pressing the key, but we get a null 26 + # event on the key release. 27 + # This test covers this case. 28 + class ITEKeyboard(ArrayKeyboard): 29 + # fmt: off 30 + report_descriptor = [ 31 + 0x06, 0x85, 0xff, # Usage Page (Vendor Usage Page 0xff85) 32 + 0x09, 0x95, # Usage (Vendor Usage 0x95) 3 33 + 0xa1, 0x01, # Collection (Application) 5 34 + 0x85, 0x5a, # .Report ID (90) 7 35 + 0x09, 0x01, # .Usage (Vendor Usage 0x01) 9 36 + 0x15, 0x00, # .Logical Minimum (0) 11 37 + 0x26, 0xff, 0x00, # .Logical Maximum (255) 13 38 + 0x75, 0x08, # .Report Size (8) 16 39 + 0x95, 0x10, # .Report Count (16) 18 40 + 0xb1, 0x00, # .Feature (Data,Arr,Abs) 20 41 + 0xc0, # End Collection 22 42 + 0x05, 0x01, # Usage Page (Generic Desktop) 23 43 + 0x09, 0x06, # Usage (Keyboard) 25 44 + 0xa1, 0x01, # Collection (Application) 27 45 + 0x85, 0x01, # .Report ID (1) 29 46 + 0x75, 0x01, # .Report Size (1) 31 47 + 0x95, 0x08, # .Report Count (8) 33 48 + 0x05, 0x07, # .Usage Page (Keyboard) 35 49 + 0x19, 0xe0, # .Usage Minimum (224) 37 50 + 0x29, 0xe7, # .Usage Maximum (231) 39 51 + 0x15, 0x00, # .Logical Minimum (0) 41 52 + 0x25, 0x01, # .Logical Maximum (1) 43 53 + 0x81, 0x02, # .Input (Data,Var,Abs) 45 54 + 0x95, 0x01, # .Report Count (1) 47 55 + 0x75, 0x08, # .Report Size (8) 49 56 + 0x81, 0x03, # .Input (Cnst,Var,Abs) 51 57 + 0x95, 0x05, # .Report Count (5) 53 58 + 0x75, 0x01, # .Report Size (1) 55 59 + 0x05, 0x08, # .Usage Page (LEDs) 57 60 + 0x19, 0x01, # .Usage Minimum (1) 59 61 + 0x29, 0x05, # .Usage Maximum (5) 61 62 + 0x91, 0x02, # .Output (Data,Var,Abs) 63 63 + 0x95, 0x01, # .Report Count (1) 65 64 + 0x75, 0x03, # .Report Size (3) 67 65 + 0x91, 0x03, # .Output (Cnst,Var,Abs) 69 66 + 0x95, 0x06, # .Report Count (6) 71 67 + 0x75, 0x08, # .Report Size (8) 73 68 + 0x15, 0x00, # .Logical Minimum (0) 75 69 + 0x26, 0xff, 0x00, # .Logical Maximum (255) 77 70 + 0x05, 0x07, # .Usage Page (Keyboard) 80 71 + 0x19, 0x00, # .Usage Minimum (0) 82 72 + 0x2a, 0xff, 0x00, # .Usage Maximum (255) 84 73 + 0x81, 0x00, # .Input (Data,Arr,Abs) 87 74 + 0xc0, # End Collection 89 75 + 0x05, 0x0c, # Usage Page (Consumer Devices) 90 76 + 0x09, 0x01, # Usage (Consumer Control) 92 77 + 0xa1, 0x01, # Collection (Application) 94 78 + 0x85, 0x02, # .Report ID (2) 96 79 + 0x19, 0x00, # .Usage Minimum (0) 98 80 + 0x2a, 0x3c, 0x02, # .Usage Maximum (572) 100 81 + 0x15, 0x00, # .Logical Minimum (0) 103 82 + 0x26, 0x3c, 0x02, # .Logical Maximum (572) 105 83 + 0x75, 0x10, # .Report Size (16) 108 84 + 0x95, 0x01, # .Report Count (1) 110 85 + 0x81, 0x00, # .Input (Data,Arr,Abs) 112 86 + 0xc0, # End Collection 114 87 + 0x05, 0x01, # Usage Page (Generic Desktop) 115 88 + 0x09, 0x0c, # Usage (Wireless Radio Controls) 117 89 + 0xa1, 0x01, # Collection (Application) 119 90 + 0x85, 0x03, # .Report ID (3) 121 91 + 0x15, 0x00, # .Logical Minimum (0) 123 92 + 0x25, 0x01, # .Logical Maximum (1) 125 93 + 0x09, 0xc6, # .Usage (Wireless Radio Button) 127 94 + 0x95, 0x01, # .Report Count (1) 129 95 + 0x75, 0x01, # .Report Size (1) 131 96 + 0x81, 0x06, # .Input (Data,Var,Rel) 133 97 + 0x75, 0x07, # .Report Size (7) 135 98 + 0x81, 0x03, # .Input (Cnst,Var,Abs) 137 99 + 0xc0, # End Collection 139 100 + 0x05, 0x88, # Usage Page (Vendor Usage Page 0x88) 140 101 + 0x09, 0x01, # Usage (Vendor Usage 0x01) 142 102 + 0xa1, 0x01, # Collection (Application) 144 103 + 0x85, 0x04, # .Report ID (4) 146 104 + 0x19, 0x00, # .Usage Minimum (0) 148 105 + 0x2a, 0xff, 0xff, # .Usage Maximum (65535) 150 106 + 0x15, 0x00, # .Logical Minimum (0) 153 107 + 0x26, 0xff, 0xff, # .Logical Maximum (65535) 155 108 + 0x75, 0x08, # .Report Size (8) 158 109 + 0x95, 0x02, # .Report Count (2) 160 110 + 0x81, 0x02, # .Input (Data,Var,Abs) 162 111 + 0xc0, # End Collection 164 112 + 0x05, 0x01, # Usage Page (Generic Desktop) 165 113 + 0x09, 0x80, # Usage (System Control) 167 114 + 0xa1, 0x01, # Collection (Application) 169 115 + 0x85, 0x05, # .Report ID (5) 171 116 + 0x19, 0x81, # .Usage Minimum (129) 173 117 + 0x29, 0x83, # .Usage Maximum (131) 175 118 + 0x15, 0x00, # .Logical Minimum (0) 177 119 + 0x25, 0x01, # .Logical Maximum (1) 179 120 + 0x95, 0x08, # .Report Count (8) 181 121 + 0x75, 0x01, # .Report Size (1) 183 122 + 0x81, 0x02, # .Input (Data,Var,Abs) 185 123 + 0xc0, # End Collection 187 124 + ] 125 + # fmt: on 126 + 127 + def __init__( 128 + self, 129 + rdesc=report_descriptor, 130 + name=None, 131 + input_info=(BusType.USB, 0x06CB, 0x2968), 132 + ): 133 + super().__init__(rdesc, name, input_info) 134 + 135 + def event(self, keys, reportID=None, application=None): 136 + application = application or "Keyboard" 137 + return super().event(keys, reportID, application) 138 + 139 + 140 + class TestITEKeyboard(TestArrayKeyboard): 141 + kernel_modules = [KERNEL_MODULE] 142 + 143 + def create_device(self): 144 + return ITEKeyboard() 145 + 146 + def test_wifi_key(self): 147 + uhdev = self.uhdev 148 + syn_event = self.syn_event 149 + 150 + # the following sends a 'release' event on the Wifi key. 151 + # the kernel is supposed to translate this into Wifi key 152 + # down and up 153 + r = [0x03, 0x00] 154 + uhdev.call_input_event(r) 155 + expected = [syn_event] 156 + expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_RFKILL, 1)) 157 + events = uhdev.next_sync_events() 158 + self.debug_reports([r], uhdev, events) 159 + self.assertInputEventsIn(expected, events) 160 + 161 + expected = [syn_event] 162 + expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_RFKILL, 0)) 163 + # the kernel sends the two down/up key events in a batch, no need to 164 + # call events = uhdev.next_sync_events() 165 + self.debug_reports([], uhdev, events) 166 + self.assertInputEventsIn(expected, events)