|
| 1 | +#!/bin/env python3 |
| 2 | +# SPDX-License-Identifier: GPL-2.0 |
| 3 | +# -*- coding: utf-8 -*- |
| 4 | +# |
| 5 | +# Copyright (c) 2020 Benjamin Tissoires <[email protected]> |
| 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) |
0 commit comments