test_apple_keyboard.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. #!/bin/env python3
  2. # SPDX-License-Identifier: GPL-2.0
  3. # -*- coding: utf-8 -*-
  4. #
  5. # Copyright (c) 2019 Benjamin Tissoires <benjamin.tissoires@gmail.com>
  6. # Copyright (c) 2019 Red Hat, Inc.
  7. #
  8. from .test_keyboard import ArrayKeyboard, TestArrayKeyboard
  9. from hidtools.util import BusType
  10. import libevdev
  11. import logging
  12. logger = logging.getLogger("hidtools.test.apple-keyboard")
  13. KERNEL_MODULE = ("apple", "hid-apple")
  14. class KbdData(object):
  15. pass
  16. class AppleKeyboard(ArrayKeyboard):
  17. # fmt: off
  18. report_descriptor = [
  19. 0x05, 0x01, # Usage Page (Generic Desktop)
  20. 0x09, 0x06, # Usage (Keyboard)
  21. 0xa1, 0x01, # Collection (Application)
  22. 0x85, 0x01, # .Report ID (1)
  23. 0x05, 0x07, # .Usage Page (Keyboard)
  24. 0x19, 0xe0, # .Usage Minimum (224)
  25. 0x29, 0xe7, # .Usage Maximum (231)
  26. 0x15, 0x00, # .Logical Minimum (0)
  27. 0x25, 0x01, # .Logical Maximum (1)
  28. 0x75, 0x01, # .Report Size (1)
  29. 0x95, 0x08, # .Report Count (8)
  30. 0x81, 0x02, # .Input (Data,Var,Abs)
  31. 0x75, 0x08, # .Report Size (8)
  32. 0x95, 0x01, # .Report Count (1)
  33. 0x81, 0x01, # .Input (Cnst,Arr,Abs)
  34. 0x75, 0x01, # .Report Size (1)
  35. 0x95, 0x05, # .Report Count (5)
  36. 0x05, 0x08, # .Usage Page (LEDs)
  37. 0x19, 0x01, # .Usage Minimum (1)
  38. 0x29, 0x05, # .Usage Maximum (5)
  39. 0x91, 0x02, # .Output (Data,Var,Abs)
  40. 0x75, 0x03, # .Report Size (3)
  41. 0x95, 0x01, # .Report Count (1)
  42. 0x91, 0x01, # .Output (Cnst,Arr,Abs)
  43. 0x75, 0x08, # .Report Size (8)
  44. 0x95, 0x06, # .Report Count (6)
  45. 0x15, 0x00, # .Logical Minimum (0)
  46. 0x26, 0xff, 0x00, # .Logical Maximum (255)
  47. 0x05, 0x07, # .Usage Page (Keyboard)
  48. 0x19, 0x00, # .Usage Minimum (0)
  49. 0x2a, 0xff, 0x00, # .Usage Maximum (255)
  50. 0x81, 0x00, # .Input (Data,Arr,Abs)
  51. 0xc0, # End Collection
  52. 0x05, 0x0c, # Usage Page (Consumer Devices)
  53. 0x09, 0x01, # Usage (Consumer Control)
  54. 0xa1, 0x01, # Collection (Application)
  55. 0x85, 0x47, # .Report ID (71)
  56. 0x05, 0x01, # .Usage Page (Generic Desktop)
  57. 0x09, 0x06, # .Usage (Keyboard)
  58. 0xa1, 0x02, # .Collection (Logical)
  59. 0x05, 0x06, # ..Usage Page (Generic Device Controls)
  60. 0x09, 0x20, # ..Usage (Battery Strength)
  61. 0x15, 0x00, # ..Logical Minimum (0)
  62. 0x26, 0xff, 0x00, # ..Logical Maximum (255)
  63. 0x75, 0x08, # ..Report Size (8)
  64. 0x95, 0x01, # ..Report Count (1)
  65. 0x81, 0x02, # ..Input (Data,Var,Abs)
  66. 0xc0, # .End Collection
  67. 0xc0, # End Collection
  68. 0x05, 0x0c, # Usage Page (Consumer Devices)
  69. 0x09, 0x01, # Usage (Consumer Control)
  70. 0xa1, 0x01, # Collection (Application)
  71. 0x85, 0x11, # .Report ID (17)
  72. 0x15, 0x00, # .Logical Minimum (0)
  73. 0x25, 0x01, # .Logical Maximum (1)
  74. 0x75, 0x01, # .Report Size (1)
  75. 0x95, 0x03, # .Report Count (3)
  76. 0x81, 0x01, # .Input (Cnst,Arr,Abs)
  77. 0x75, 0x01, # .Report Size (1)
  78. 0x95, 0x01, # .Report Count (1)
  79. 0x05, 0x0c, # .Usage Page (Consumer Devices)
  80. 0x09, 0xb8, # .Usage (Eject)
  81. 0x81, 0x02, # .Input (Data,Var,Abs)
  82. 0x06, 0xff, 0x00, # .Usage Page (Vendor Usage Page 0xff)
  83. 0x09, 0x03, # .Usage (Vendor Usage 0x03)
  84. 0x81, 0x02, # .Input (Data,Var,Abs)
  85. 0x75, 0x01, # .Report Size (1)
  86. 0x95, 0x03, # .Report Count (3)
  87. 0x81, 0x01, # .Input (Cnst,Arr,Abs)
  88. 0x05, 0x0c, # .Usage Page (Consumer Devices)
  89. 0x85, 0x12, # .Report ID (18)
  90. 0x15, 0x00, # .Logical Minimum (0)
  91. 0x25, 0x01, # .Logical Maximum (1)
  92. 0x75, 0x01, # .Report Size (1)
  93. 0x95, 0x01, # .Report Count (1)
  94. 0x09, 0xcd, # .Usage (Play/Pause)
  95. 0x81, 0x02, # .Input (Data,Var,Abs)
  96. 0x09, 0xb3, # .Usage (Fast Forward)
  97. 0x81, 0x02, # .Input (Data,Var,Abs)
  98. 0x09, 0xb4, # .Usage (Rewind)
  99. 0x81, 0x02, # .Input (Data,Var,Abs)
  100. 0x09, 0xb5, # .Usage (Scan Next Track)
  101. 0x81, 0x02, # .Input (Data,Var,Abs)
  102. 0x09, 0xb6, # .Usage (Scan Previous Track)
  103. 0x81, 0x02, # .Input (Data,Var,Abs)
  104. 0x81, 0x01, # .Input (Cnst,Arr,Abs)
  105. 0x81, 0x01, # .Input (Cnst,Arr,Abs)
  106. 0x81, 0x01, # .Input (Cnst,Arr,Abs)
  107. 0x85, 0x13, # .Report ID (19)
  108. 0x15, 0x00, # .Logical Minimum (0)
  109. 0x25, 0x01, # .Logical Maximum (1)
  110. 0x75, 0x01, # .Report Size (1)
  111. 0x95, 0x01, # .Report Count (1)
  112. 0x06, 0x01, 0xff, # .Usage Page (Vendor Usage Page 0xff01)
  113. 0x09, 0x0a, # .Usage (Vendor Usage 0x0a)
  114. 0x81, 0x02, # .Input (Data,Var,Abs)
  115. 0x06, 0x01, 0xff, # .Usage Page (Vendor Usage Page 0xff01)
  116. 0x09, 0x0c, # .Usage (Vendor Usage 0x0c)
  117. 0x81, 0x22, # .Input (Data,Var,Abs,NoPref)
  118. 0x75, 0x01, # .Report Size (1)
  119. 0x95, 0x06, # .Report Count (6)
  120. 0x81, 0x01, # .Input (Cnst,Arr,Abs)
  121. 0x85, 0x09, # .Report ID (9)
  122. 0x09, 0x0b, # .Usage (Vendor Usage 0x0b)
  123. 0x75, 0x08, # .Report Size (8)
  124. 0x95, 0x01, # .Report Count (1)
  125. 0xb1, 0x02, # .Feature (Data,Var,Abs)
  126. 0x75, 0x08, # .Report Size (8)
  127. 0x95, 0x02, # .Report Count (2)
  128. 0xb1, 0x01, # .Feature (Cnst,Arr,Abs)
  129. 0xc0, # End Collection
  130. ]
  131. # fmt: on
  132. def __init__(
  133. self,
  134. rdesc=report_descriptor,
  135. name="Apple Wireless Keyboard",
  136. input_info=(BusType.BLUETOOTH, 0x05AC, 0x0256),
  137. ):
  138. super().__init__(rdesc, name, input_info)
  139. self.default_reportID = 1
  140. def send_fn_state(self, state):
  141. data = KbdData()
  142. setattr(data, "0xff0003", state)
  143. r = self.create_report(data, reportID=17)
  144. self.call_input_event(r)
  145. return [r]
  146. class TestAppleKeyboard(TestArrayKeyboard):
  147. kernel_modules = [KERNEL_MODULE]
  148. def create_device(self):
  149. return AppleKeyboard()
  150. def test_single_function_key(self):
  151. """check for function key reliability."""
  152. uhdev = self.uhdev
  153. evdev = uhdev.get_evdev()
  154. syn_event = self.syn_event
  155. r = uhdev.event(["F4"])
  156. expected = [syn_event]
  157. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 1))
  158. events = uhdev.next_sync_events()
  159. self.debug_reports(r, uhdev, events)
  160. self.assertInputEventsIn(expected, events)
  161. assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1
  162. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0
  163. r = uhdev.event([])
  164. expected = [syn_event]
  165. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 0))
  166. events = uhdev.next_sync_events()
  167. self.debug_reports(r, uhdev, events)
  168. self.assertInputEventsIn(expected, events)
  169. assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 0
  170. def test_single_fn_function_key(self):
  171. """check for function key reliability with the fn key."""
  172. uhdev = self.uhdev
  173. evdev = uhdev.get_evdev()
  174. syn_event = self.syn_event
  175. r = uhdev.send_fn_state(1)
  176. r.extend(uhdev.event(["F4"]))
  177. expected = [syn_event]
  178. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 1))
  179. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1))
  180. events = uhdev.next_sync_events()
  181. self.debug_reports(r, uhdev, events)
  182. self.assertInputEventsIn(expected, events)
  183. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 1
  184. r = uhdev.event([])
  185. expected = [syn_event]
  186. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 0))
  187. events = uhdev.next_sync_events()
  188. self.debug_reports(r, uhdev, events)
  189. self.assertInputEventsIn(expected, events)
  190. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  191. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1
  192. r = uhdev.send_fn_state(0)
  193. expected = [syn_event]
  194. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0))
  195. events = uhdev.next_sync_events()
  196. self.debug_reports(r, uhdev, events)
  197. self.assertInputEventsIn(expected, events)
  198. def test_single_fn_function_key_release_first(self):
  199. """check for function key reliability with the fn key."""
  200. uhdev = self.uhdev
  201. evdev = uhdev.get_evdev()
  202. syn_event = self.syn_event
  203. r = uhdev.send_fn_state(1)
  204. r.extend(uhdev.event(["F4"]))
  205. expected = [syn_event]
  206. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 1))
  207. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1))
  208. events = uhdev.next_sync_events()
  209. self.debug_reports(r, uhdev, events)
  210. self.assertInputEventsIn(expected, events)
  211. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 1
  212. r = uhdev.send_fn_state(0)
  213. expected = [syn_event]
  214. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0))
  215. events = uhdev.next_sync_events()
  216. self.debug_reports(r, uhdev, events)
  217. self.assertInputEventsIn(expected, events)
  218. r = uhdev.event([])
  219. expected = [syn_event]
  220. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 0))
  221. events = uhdev.next_sync_events()
  222. self.debug_reports(r, uhdev, events)
  223. self.assertInputEventsIn(expected, events)
  224. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  225. def test_single_fn_function_key_inverted(self):
  226. """check for function key reliability with the fn key."""
  227. uhdev = self.uhdev
  228. evdev = uhdev.get_evdev()
  229. syn_event = self.syn_event
  230. r = uhdev.event(["F4"])
  231. r.extend(uhdev.send_fn_state(1))
  232. expected = [syn_event]
  233. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 1))
  234. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1))
  235. events = uhdev.next_sync_events()
  236. self.debug_reports(r, uhdev, events)
  237. self.assertInputEventsIn(expected, events)
  238. assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1
  239. r = uhdev.event([])
  240. expected = [syn_event]
  241. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 0))
  242. events = uhdev.next_sync_events()
  243. self.debug_reports(r, uhdev, events)
  244. self.assertInputEventsIn(expected, events)
  245. assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 0
  246. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1
  247. r = uhdev.send_fn_state(0)
  248. expected = [syn_event]
  249. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0))
  250. events = uhdev.next_sync_events()
  251. self.debug_reports(r, uhdev, events)
  252. self.assertInputEventsIn(expected, events)
  253. def test_multiple_fn_function_key_release_first(self):
  254. """check for function key reliability with the fn key."""
  255. uhdev = self.uhdev
  256. evdev = uhdev.get_evdev()
  257. syn_event = self.syn_event
  258. r = uhdev.send_fn_state(1)
  259. r.extend(uhdev.event(["F4"]))
  260. r.extend(uhdev.event(["F4", "F6"]))
  261. expected = [syn_event]
  262. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 1))
  263. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F6, 1))
  264. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1))
  265. events = uhdev.next_sync_events()
  266. self.debug_reports(r, uhdev, events)
  267. self.assertInputEventsIn(expected, events)
  268. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 1
  269. assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1
  270. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1
  271. r = uhdev.event(["F6"])
  272. expected = [syn_event]
  273. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F4, 0))
  274. events = uhdev.next_sync_events()
  275. self.debug_reports(r, uhdev, events)
  276. self.assertInputEventsIn(expected, events)
  277. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  278. assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1
  279. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1
  280. r = uhdev.send_fn_state(0)
  281. expected = [syn_event]
  282. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0))
  283. events = uhdev.next_sync_events()
  284. self.debug_reports(r, uhdev, events)
  285. self.assertInputEventsIn(expected, events)
  286. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  287. assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1
  288. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0
  289. r = uhdev.event([])
  290. expected = [syn_event]
  291. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F6, 0))
  292. events = uhdev.next_sync_events()
  293. self.debug_reports(r, uhdev, events)
  294. self.assertInputEventsIn(expected, events)
  295. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  296. assert evdev.value[libevdev.EV_KEY.KEY_F6] == 0
  297. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0
  298. def test_multiple_fn_function_key_release_between(self):
  299. """check for function key reliability with the fn key."""
  300. uhdev = self.uhdev
  301. evdev = uhdev.get_evdev()
  302. syn_event = self.syn_event
  303. # press F4
  304. r = uhdev.event(["F4"])
  305. expected = [syn_event]
  306. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 1))
  307. events = uhdev.next_sync_events()
  308. self.debug_reports(r, uhdev, events)
  309. self.assertInputEventsIn(expected, events)
  310. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  311. assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1
  312. assert evdev.value[libevdev.EV_KEY.KEY_F6] == 0
  313. assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0
  314. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0
  315. # press Fn key
  316. r = uhdev.send_fn_state(1)
  317. expected = [syn_event]
  318. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1))
  319. events = uhdev.next_sync_events()
  320. self.debug_reports(r, uhdev, events)
  321. self.assertInputEventsIn(expected, events)
  322. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  323. assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1
  324. assert evdev.value[libevdev.EV_KEY.KEY_F6] == 0
  325. assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0
  326. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1
  327. # keep F4 and press F6
  328. r = uhdev.event(["F4", "F6"])
  329. expected = [syn_event]
  330. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F6, 1))
  331. events = uhdev.next_sync_events()
  332. self.debug_reports(r, uhdev, events)
  333. self.assertInputEventsIn(expected, events)
  334. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  335. assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1
  336. assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1
  337. assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0
  338. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1
  339. # keep F4 and F6
  340. r = uhdev.event(["F4", "F6"])
  341. expected = []
  342. events = uhdev.next_sync_events()
  343. self.debug_reports(r, uhdev, events)
  344. self.assertInputEventsIn(expected, events)
  345. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  346. assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 1
  347. assert evdev.value[libevdev.EV_KEY.KEY_F6] == 1
  348. assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0
  349. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1
  350. # release Fn key and all keys
  351. r = uhdev.send_fn_state(0)
  352. r.extend(uhdev.event([]))
  353. expected = [syn_event]
  354. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_ALL_APPLICATIONS, 0))
  355. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_F6, 0))
  356. events = uhdev.next_sync_events()
  357. self.debug_reports(r, uhdev, events)
  358. self.assertInputEventsIn(expected, events)
  359. assert evdev.value[libevdev.EV_KEY.KEY_F4] == 0
  360. assert evdev.value[libevdev.EV_KEY.KEY_ALL_APPLICATIONS] == 0
  361. assert evdev.value[libevdev.EV_KEY.KEY_F6] == 0
  362. assert evdev.value[libevdev.EV_KEY.KEY_KBDILLUMUP] == 0
  363. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0
  364. def test_single_pageup_key_release_first(self):
  365. """check for function key reliability with the [page] up key."""
  366. uhdev = self.uhdev
  367. evdev = uhdev.get_evdev()
  368. syn_event = self.syn_event
  369. r = uhdev.send_fn_state(1)
  370. r.extend(uhdev.event(["UpArrow"]))
  371. expected = [syn_event]
  372. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_PAGEUP, 1))
  373. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 1))
  374. events = uhdev.next_sync_events()
  375. self.debug_reports(r, uhdev, events)
  376. self.assertInputEventsIn(expected, events)
  377. assert evdev.value[libevdev.EV_KEY.KEY_PAGEUP] == 1
  378. assert evdev.value[libevdev.EV_KEY.KEY_UP] == 0
  379. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 1
  380. r = uhdev.send_fn_state(0)
  381. expected = [syn_event]
  382. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_FN, 0))
  383. events = uhdev.next_sync_events()
  384. self.debug_reports(r, uhdev, events)
  385. self.assertInputEventsIn(expected, events)
  386. assert evdev.value[libevdev.EV_KEY.KEY_PAGEUP] == 1
  387. assert evdev.value[libevdev.EV_KEY.KEY_UP] == 0
  388. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0
  389. r = uhdev.event([])
  390. expected = [syn_event]
  391. expected.append(libevdev.InputEvent(libevdev.EV_KEY.KEY_PAGEUP, 0))
  392. events = uhdev.next_sync_events()
  393. self.debug_reports(r, uhdev, events)
  394. self.assertInputEventsIn(expected, events)
  395. assert evdev.value[libevdev.EV_KEY.KEY_PAGEUP] == 0
  396. assert evdev.value[libevdev.EV_KEY.KEY_UP] == 0
  397. assert evdev.value[libevdev.EV_KEY.KEY_FN] == 0