aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tools/testing/selftests/hid/tests/test_ite_keyboard.py
blob: 38550c167baea440d2dc869d719dbea010ff7639 (plain) (blame)
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#!/bin/env python3
# SPDX-License-Identifier: GPL-2.0
# -*- coding: utf-8 -*-
#
# Copyright (c) 2020 Benjamin Tissoires <benjamin.tissoires@gmail.com>
# Copyright (c) 2020 Red Hat, Inc.
#

from .test_keyboard import ArrayKeyboard, TestArrayKeyboard
from hidtools.util import BusType

import libevdev
import logging

logger = logging.getLogger("hidtools.test.ite-keyboard")

KERNEL_MODULE = ("itetech", "hid_ite")


class KbdData(object):
    pass


# The ITE keyboards have an issue regarding the Wifi key:
# nothing comes in when pressing the key, but we get a null
# event on the key release.
# This test covers this case.
class ITEKeyboard(ArrayKeyboard):
    # fmt: off
    report_descriptor = [
        0x06, 0x85, 0xff,              # Usage Page (Vendor Usage Page 0xff85)
        0x09, 0x95,                    # Usage (Vendor Usage 0x95)           3
        0xa1, 0x01,                    # Collection (Application)            5
        0x85, 0x5a,                    # .Report ID (90)                     7
        0x09, 0x01,                    # .Usage (Vendor Usage 0x01)          9
        0x15, 0x00,                    # .Logical Minimum (0)                11
        0x26, 0xff, 0x00,              # .Logical Maximum (255)              13
        0x75, 0x08,                    # .Report Size (8)                    16
        0x95, 0x10,                    # .Report Count (16)                  18
        0xb1, 0x00,                    # .Feature (Data,Arr,Abs)             20
        0xc0,                          # End Collection                      22
        0x05, 0x01,                    # Usage Page (Generic Desktop)        23
        0x09, 0x06,                    # Usage (Keyboard)                    25
        0xa1, 0x01,                    # Collection (Application)            27
        0x85, 0x01,                    # .Report ID (1)                      29
        0x75, 0x01,                    # .Report Size (1)                    31
        0x95, 0x08,                    # .Report Count (8)                   33
        0x05, 0x07,                    # .Usage Page (Keyboard)              35
        0x19, 0xe0,                    # .Usage Minimum (224)                37
        0x29, 0xe7,                    # .Usage Maximum (231)                39
        0x15, 0x00,                    # .Logical Minimum (0)                41
        0x25, 0x01,                    # .Logical Maximum (1)                43
        0x81, 0x02,                    # .Input (Data,Var,Abs)               45
        0x95, 0x01,                    # .Report Count (1)                   47
        0x75, 0x08,                    # .Report Size (8)                    49
        0x81, 0x03,                    # .Input (Cnst,Var,Abs)               51
        0x95, 0x05,                    # .Report Count (5)                   53
        0x75, 0x01,                    # .Report Size (1)                    55
        0x05, 0x08,                    # .Usage Page (LEDs)                  57
        0x19, 0x01,                    # .Usage Minimum (1)                  59
        0x29, 0x05,                    # .Usage Maximum (5)                  61
        0x91, 0x02,                    # .Output (Data,Var,Abs)              63
        0x95, 0x01,                    # .Report Count (1)                   65
        0x75, 0x03,                    # .Report Size (3)                    67
        0x91, 0x03,                    # .Output (Cnst,Var,Abs)              69
        0x95, 0x06,                    # .Report Count (6)                   71
        0x75, 0x08,                    # .Report Size (8)                    73
        0x15, 0x00,                    # .Logical Minimum (0)                75
        0x26, 0xff, 0x00,              # .Logical Maximum (255)              77
        0x05, 0x07,                    # .Usage Page (Keyboard)              80
        0x19, 0x00,                    # .Usage Minimum (0)                  82
        0x2a, 0xff, 0x00,              # .Usage Maximum (255)                84
        0x81, 0x00,                    # .Input (Data,Arr,Abs)               87
        0xc0,                          # End Collection                      89
        0x05, 0x0c,                    # Usage Page (Consumer Devices)       90
        0x09, 0x01,                    # Usage (Consumer Control)            92
        0xa1, 0x01,                    # Collection (Application)            94
        0x85, 0x02,                    # .Report ID (2)                      96
        0x19, 0x00,                    # .Usage Minimum (0)                  98
        0x2a, 0x3c, 0x02,              # .Usage Maximum (572)                100
        0x15, 0x00,                    # .Logical Minimum (0)                103
        0x26, 0x3c, 0x02,              # .Logical Maximum (572)              105
        0x75, 0x10,                    # .Report Size (16)                   108
        0x95, 0x01,                    # .Report Count (1)                   110
        0x81, 0x00,                    # .Input (Data,Arr,Abs)               112
        0xc0,                          # End Collection                      114
        0x05, 0x01,                    # Usage Page (Generic Desktop)        115
        0x09, 0x0c,                    # Usage (Wireless Radio Controls)     117
        0xa1, 0x01,                    # Collection (Application)            119
        0x85, 0x03,                    # .Report ID (3)                      121
        0x15, 0x00,                    # .Logical Minimum (0)                123
        0x25, 0x01,                    # .Logical Maximum (1)                125
        0x09, 0xc6,                    # .Usage (Wireless Radio Button)      127
        0x95, 0x01,                    # .Report Count (1)                   129
        0x75, 0x01,                    # .Report Size (1)                    131
        0x81, 0x06,                    # .Input (Data,Var,Rel)               133
        0x75, 0x07,                    # .Report Size (7)                    135
        0x81, 0x03,                    # .Input (Cnst,Var,Abs)               137
        0xc0,                          # End Collection                      139
        0x05, 0x88,                    # Usage Page (Vendor Usage Page 0x88) 140
        0x09, 0x01,                    # Usage (Vendor Usage 0x01)           142
        0xa1, 0x01,                    # Collection (Application)            144
        0x85, 0x04,                    # .Report ID (4)                      146
        0x19, 0x00,                    # .Usage Minimum (0)                  148
        0x2a, 0xff, 0xff,              # .Usage Maximum (65535)              150
        0x15, 0x00,                    # .Logical Minimum (0)                153
        0x26, 0xff, 0xff,              # .Logical Maximum (65535)            155
        0x75, 0x08,                    # .Report Size (8)                    158
        0x95, 0x02,                    # .Report Count (2)                   160
        0x81, 0x02,                    # .Input (Data,Var,Abs)               162
        0xc0,                          # End Collection                      164
        0x05, 0x01,                    # Usage Page (Generic Desktop)        165
        0x09, 0x80,                    # Usage (System Control)              167
        0xa1, 0x01,                    # Collection (Application)            169
        0x85, 0x05,                    # .Report ID (5)                      171
        0x19, 0x81,                    # .Usage Minimum (129)                173
        0x29, 0x83,                    # .Usage Maximum (131)                175
        0x15, 0x00,                    # .Logical Minimum (0)                177
        0x25, 0x01,                    # .Logical Maximum (1)                179
        0x95, 0x08,                    # .Report Count (8)                   181
        0x75, 0x01,                    # .Report Size (1)                    183
        0x81, 0x02,                    # .Input (Data,Var,Abs)               185
        0xc0,                          # End Collection                      187
    ]
    # fmt: on

    def __init__(
        self,
        rdesc=report_descriptor,
        name=None,
        input_info=(BusType.USB, 0x06CB, 0x2968),
    ):
        super().__init__(rdesc, name, input_info)

    def event(self, keys, reportID=None, application=None):
        application = application or "Keyboard"
        return super().event(keys, reportID, application)


class TestITEKeyboard(TestArrayKeyboard):
    kernel_modules = [KERNEL_MODULE]

    def create_device(self):
        return ITEKeyboard()

    def test_wifi_key(self):
        uhdev = self.uhdev
        syn_event = self.syn_event

        # the following sends a 'release' event on the Wifi key.
        # the kernel is supposed to translate this into Wifi key
        # down and up
        r = [0x03, 0x00]
        uhdev.call_input_event(r)
        expected = [syn_event]
        expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_RFKILL, 1))
        events = uhdev.next_sync_events()
        self.debug_reports([r], uhdev, events)
        self.assertInputEventsIn(expected, events)

        expected = [syn_event]
        expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_RFKILL, 0))
        # the kernel sends the two down/up key events in a batch, no need to
        # call events = uhdev.next_sync_events()
        self.debug_reports([], uhdev, events)
        self.assertInputEventsIn(expected, events)