1 /*
2  * Copyright (c) 2018 Intel Corporation
3  * Copyright (c) 2018,2021 Nordic Semiconductor ASA
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 /**
9  * @file
10  * @brief USB Human Interface Device (HID) common definitions header
11  *
12  * Header follows Device Class Definition for Human Interface Devices (HID)
13  * Version 1.11 document (HID1_11-1.pdf).
14  */
15 
16 #ifndef ZEPHYR_INCLUDE_USB_CLASS_HID_H_
17 #define ZEPHYR_INCLUDE_USB_CLASS_HID_H_
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /**
24  * @brief hid.h API
25  * @defgroup usb_hid_definitions USB HID common definitions
26  * @ingroup usb
27  * @since 1.11
28  * @version 1.0.0
29  * @{
30  */
31 
32 /**
33  * @name USB HID types and values
34  * @{
35  */
36 
37 /** HID Specification release v1.11 */
38 #define USB_HID_VERSION			0x0111
39 
40 /** USB HID Class HID descriptor type */
41 #define USB_DESC_HID			0x21
42 /** USB HID Class Report descriptor type */
43 #define USB_DESC_HID_REPORT		0x22
44 /** USB HID Class physical descriptor type */
45 #define USB_DESC_HID_PHYSICAL		0x23
46 
47 /** USB HID Class GetReport bRequest value */
48 #define USB_HID_GET_REPORT		0x01
49 /** USB HID Class GetIdle bRequest value */
50 #define USB_HID_GET_IDLE		0x02
51 /** USB HID Class GetProtocol bRequest value */
52 #define USB_HID_GET_PROTOCOL		0x03
53 /** USB HID Class SetReport bRequest value */
54 #define USB_HID_SET_REPORT		0x09
55 /** USB HID Class SetIdle bRequest value */
56 #define USB_HID_SET_IDLE		0x0A
57 /** USB HID Class SetProtocol bRequest value */
58 #define USB_HID_SET_PROTOCOL		0x0B
59 
60 /** USB HID Boot Interface Protocol (bInterfaceProtocol) Code None */
61 #define HID_BOOT_IFACE_CODE_NONE	0
62 /** USB HID Boot Interface Protocol (bInterfaceProtocol) Code Keyboard */
63 #define HID_BOOT_IFACE_CODE_KEYBOARD	1
64 /** USB HID Boot Interface Protocol (bInterfaceProtocol) Code Mouse */
65 #define HID_BOOT_IFACE_CODE_MOUSE	2
66 
67 /** USB HID Class Boot protocol code */
68 #define HID_PROTOCOL_BOOT		0
69 /** USB HID Class Report protocol code */
70 #define HID_PROTOCOL_REPORT		1
71 
72 /** HID Main item type */
73 #define HID_ITEM_TYPE_MAIN		0x0
74 /** HID Global item type */
75 #define HID_ITEM_TYPE_GLOBAL		0x1
76 /** HID Local item type */
77 #define HID_ITEM_TYPE_LOCAL		0x2
78 
79 /** HID Input item tag */
80 #define HID_ITEM_TAG_INPUT		0x8
81 /** HID Output item tag */
82 #define HID_ITEM_TAG_OUTPUT		0x9
83 /** HID Collection item tag */
84 #define HID_ITEM_TAG_COLLECTION		0xA
85 /** HID Feature item tag */
86 #define HID_ITEM_TAG_FEATURE		0xB
87 /** HID End Collection item tag */
88 #define HID_ITEM_TAG_COLLECTION_END	0xC
89 
90 /** HID Usage Page item tag */
91 #define HID_ITEM_TAG_USAGE_PAGE		0x0
92 /** HID Logical Minimum item tag */
93 #define HID_ITEM_TAG_LOGICAL_MIN	0x1
94 /** HID Logical Maximum item tag */
95 #define HID_ITEM_TAG_LOGICAL_MAX	0x2
96 /** HID Physical Minimum item tag */
97 #define HID_ITEM_TAG_PHYSICAL_MIN	0x3
98 /** HID Physical Maximum item tag */
99 #define HID_ITEM_TAG_PHYSICAL_MAX	0x4
100 /** HID Unit Exponent item tag */
101 #define HID_ITEM_TAG_UNIT_EXPONENT	0x5
102 /** HID Unit item tag */
103 #define HID_ITEM_TAG_UNIT		0x6
104 /** HID Report Size item tag */
105 #define HID_ITEM_TAG_REPORT_SIZE	0x7
106 /** HID Report ID item tag */
107 #define HID_ITEM_TAG_REPORT_ID		0x8
108 /** HID Report count item tag */
109 #define HID_ITEM_TAG_REPORT_COUNT	0x9
110 
111 /** HID Usage item tag */
112 #define HID_ITEM_TAG_USAGE		0x0
113 /** HID Usage Minimum item tag */
114 #define HID_ITEM_TAG_USAGE_MIN		0x1
115 /** HID Usage Maximum item tag */
116 #define HID_ITEM_TAG_USAGE_MAX		0x2
117 
118 /** Physical collection type */
119 #define HID_COLLECTION_PHYSICAL		0x00
120 /** Application collection type */
121 #define HID_COLLECTION_APPLICATION	0x01
122 /** Logical collection type */
123 #define HID_COLLECTION_LOGICAL		0x02
124 /** Report collection type */
125 #define HID_COLLECTION_REPORT		0x03
126 /** Named Array collection type */
127 #define HID_COLLECTION_NAMED_ARRAY	0x04
128 /** Usage Switch collection type */
129 #define HID_COLLECTION_USAGE_SWITCH	0x05
130 /** Modifier collection type */
131 #define HID_COLLECTION_MODIFIER		0x06
132 
133 
134 /* Usage page and IDs from Universal Serial Bus HID Usage Tables */
135 
136 /** HID Generic Desktop Controls Usage page */
137 #define HID_USAGE_GEN_DESKTOP		0x01
138 /** HID Keyboard Usage page */
139 #define HID_USAGE_GEN_KEYBOARD		0x07
140 /** HID LEDs Usage page */
141 #define HID_USAGE_GEN_LEDS		0x08
142 /** HID Button Usage page */
143 #define HID_USAGE_GEN_BUTTON		0x09
144 
145 /** HID Generic Desktop Undefined Usage ID */
146 #define HID_USAGE_GEN_DESKTOP_UNDEFINED	0x00
147 /** HID Generic Desktop Pointer Usage ID */
148 #define HID_USAGE_GEN_DESKTOP_POINTER	0x01
149 /** HID Generic Desktop Mouse Usage ID */
150 #define HID_USAGE_GEN_DESKTOP_MOUSE	0x02
151 /** HID Generic Desktop Joystick Usage ID */
152 #define HID_USAGE_GEN_DESKTOP_JOYSTICK	0x04
153 /** HID Generic Desktop Gamepad Usage ID */
154 #define HID_USAGE_GEN_DESKTOP_GAMEPAD	0x05
155 /** HID Generic Desktop Keyboard Usage ID */
156 #define HID_USAGE_GEN_DESKTOP_KEYBOARD	0x06
157 /** HID Generic Desktop Keypad Usage ID */
158 #define HID_USAGE_GEN_DESKTOP_KEYPAD	0x07
159 /** HID Generic Desktop X Usage ID */
160 #define HID_USAGE_GEN_DESKTOP_X		0x30
161 /** HID Generic Desktop Y Usage ID */
162 #define HID_USAGE_GEN_DESKTOP_Y		0x31
163 /** HID Generic Desktop Wheel Usage ID */
164 #define HID_USAGE_GEN_DESKTOP_WHEEL	0x38
165 
166 /**
167  * @}
168  */
169 
170 /**
171  * @defgroup usb_hid_items USB HID Item helpers
172  * @{
173  */
174 
175 /**
176  * @brief Define HID short item.
177  *
178  * @param bTag  Item tag
179  * @param bType Item type
180  * @param bSize Item data size
181  * @return      HID Input item
182  */
183 #define HID_ITEM(bTag, bType, bSize)	(((bTag & 0xF) << 4) | \
184 					 ((bType & 0x3) << 2) | (bSize & 0x3))
185 
186 /**
187  * @brief  Define HID Input item with the data length of one byte.
188  *
189  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
190  * @ref HID_KEYBOARD_REPORT_DESC()
191  *
192  * @param a Input item data
193  * @return  HID Input item
194  */
195 #define HID_INPUT(a)			\
196 	HID_ITEM(HID_ITEM_TAG_INPUT, HID_ITEM_TYPE_MAIN, 1), a
197 
198 /**
199  * @brief Define HID Output item with the data length of one byte.
200  *
201  * For usage examples, see @ref HID_KEYBOARD_REPORT_DESC()
202  *
203  * @param a Output item data
204  * @return  HID Output item
205  */
206 #define HID_OUTPUT(a)			\
207 	HID_ITEM(HID_ITEM_TAG_OUTPUT, HID_ITEM_TYPE_MAIN, 1), a
208 
209 /**
210  * @brief Define HID Feature item with the data length of one byte.
211  *
212  * @param a Feature item data
213  * @return  HID Feature item
214  */
215 #define HID_FEATURE(a)			\
216 	HID_ITEM(HID_ITEM_TAG_FEATURE, HID_ITEM_TYPE_MAIN, 1), a
217 
218 /**
219  * @brief Define HID Collection item with the data length of one byte.
220  *
221  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
222  * @ref HID_KEYBOARD_REPORT_DESC()
223  *
224  * @param a Collection item data
225  * @return  HID Collection item
226  */
227 #define HID_COLLECTION(a)		\
228 	HID_ITEM(HID_ITEM_TAG_COLLECTION, HID_ITEM_TYPE_MAIN, 1), a
229 
230 /**
231  * @brief Define HID End Collection (non-data) item.
232  *
233  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
234  * @ref HID_KEYBOARD_REPORT_DESC()
235  *
236  * @return  HID End Collection item
237  */
238 #define HID_END_COLLECTION		\
239 	HID_ITEM(HID_ITEM_TAG_COLLECTION_END, HID_ITEM_TYPE_MAIN, 0)
240 
241 /**
242  * @brief Define HID Usage Page item.
243  *
244  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
245  * @ref HID_KEYBOARD_REPORT_DESC()
246  *
247  * @param page Usage Page
248  * @return     HID Usage Page item
249  */
250 #define HID_USAGE_PAGE(page)		\
251 	HID_ITEM(HID_ITEM_TAG_USAGE_PAGE, HID_ITEM_TYPE_GLOBAL, 1), page
252 
253 /**
254  * @brief Define HID Logical Minimum item with the data length of one byte.
255  *
256  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
257  * @ref HID_KEYBOARD_REPORT_DESC()
258  *
259  * @param a Minimum value in logical units
260  * @return  HID Logical Minimum item
261  */
262 #define HID_LOGICAL_MIN8(a)		\
263 	HID_ITEM(HID_ITEM_TAG_LOGICAL_MIN, HID_ITEM_TYPE_GLOBAL, 1), a
264 
265 /**
266  * @brief Define HID Logical Maximum item with the data length of one byte.
267  *
268  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
269  * @ref HID_KEYBOARD_REPORT_DESC()
270  *
271  * @param a Maximum value in logical units
272  * @return  HID Logical Maximum item
273  */
274 #define HID_LOGICAL_MAX8(a)		\
275 	HID_ITEM(HID_ITEM_TAG_LOGICAL_MAX, HID_ITEM_TYPE_GLOBAL, 1), a
276 
277 /**
278  * @brief Define HID Logical Minimum item with the data length of two bytes.
279  *
280  * @param a Minimum value lower byte
281  * @param b Minimum value higher byte
282  * @return  HID Logical Minimum item
283  */
284 #define HID_LOGICAL_MIN16(a, b)		\
285 	HID_ITEM(HID_ITEM_TAG_LOGICAL_MIN, HID_ITEM_TYPE_GLOBAL, 2), a, b
286 
287 /**
288  * @brief Define HID Logical Maximum item with the data length of two bytes.
289  *
290  * @param a Minimum value lower byte
291  * @param b Minimum value higher byte
292  * @return  HID Logical Maximum item
293  */
294 #define HID_LOGICAL_MAX16(a, b)		\
295 	HID_ITEM(HID_ITEM_TAG_LOGICAL_MAX, HID_ITEM_TYPE_GLOBAL, 2), a, b
296 
297 /**
298  * @brief Define HID Logical Minimum item with the data length of four bytes.
299  *
300  * @param a Minimum value lower byte
301  * @param b Minimum value low middle byte
302  * @param c Minimum value high middle byte
303  * @param d Minimum value higher byte
304  * @return  HID Logical Minimum item
305  */
306 #define HID_LOGICAL_MIN32(a, b, c, d)	\
307 	HID_ITEM(HID_ITEM_TAG_LOGICAL_MIN, HID_ITEM_TYPE_GLOBAL, 3), a, b, c, d
308 
309 /**
310  * @brief Define HID Logical Maximum item with the data length of four bytes.
311  *
312  * @param a Minimum value lower byte
313  * @param b Minimum value low middle byte
314  * @param c Minimum value high middle byte
315  * @param d Minimum value higher byte
316  * @return  HID Logical Maximum item
317  */
318 #define HID_LOGICAL_MAX32(a, b, c, d)	\
319 	HID_ITEM(HID_ITEM_TAG_LOGICAL_MAX, HID_ITEM_TYPE_GLOBAL, 3), a, b, c, d
320 
321 /**
322  * @brief Define HID Report Size item with the data length of one byte.
323  *
324  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
325  * @ref HID_KEYBOARD_REPORT_DESC()
326  *
327  * @param size Report field size in bits
328  * @return     HID Report Size item
329  */
330 #define HID_REPORT_SIZE(size)		\
331 	HID_ITEM(HID_ITEM_TAG_REPORT_SIZE, HID_ITEM_TYPE_GLOBAL, 1), size
332 
333 /**
334  * @brief Define HID Report ID item with the data length of one byte.
335  *
336  * @param id Report ID
337  * @return   HID Report ID item
338  */
339 #define HID_REPORT_ID(id)		\
340 	HID_ITEM(HID_ITEM_TAG_REPORT_ID, HID_ITEM_TYPE_GLOBAL, 1), id
341 
342 /**
343  * @brief Define HID Report Count item with the data length of one byte.
344  *
345  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
346  * @ref HID_KEYBOARD_REPORT_DESC()
347  *
348  * @param count Number of data fields included in the report
349  * @return      HID Report Count item
350  */
351 #define HID_REPORT_COUNT(count)		\
352 	HID_ITEM(HID_ITEM_TAG_REPORT_COUNT, HID_ITEM_TYPE_GLOBAL, 1), count
353 
354 /**
355  * @brief Define HID Usage Index item with the data length of one byte.
356  *
357  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
358  * @ref HID_KEYBOARD_REPORT_DESC()
359  *
360  * @param idx Number of data fields included in the report
361  * @return    HID Usage Index item
362  */
363 #define HID_USAGE(idx)			\
364 	HID_ITEM(HID_ITEM_TAG_USAGE, HID_ITEM_TYPE_LOCAL, 1), idx
365 
366 /**
367  * @brief Define HID Usage Minimum item with the data length of one byte.
368  *
369  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
370  * @ref HID_KEYBOARD_REPORT_DESC()
371  *
372  * @param a Starting Usage
373  * @return  HID Usage Minimum item
374  */
375 #define HID_USAGE_MIN8(a)		\
376 	HID_ITEM(HID_ITEM_TAG_USAGE_MIN, HID_ITEM_TYPE_LOCAL, 1), a
377 
378 /**
379  * @brief Define HID Usage Maximum item with the data length of one byte.
380  *
381  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
382  * @ref HID_KEYBOARD_REPORT_DESC()
383  *
384  * @param a Ending Usage
385  * @return  HID Usage Maximum item
386  */
387 #define HID_USAGE_MAX8(a)		\
388 	HID_ITEM(HID_ITEM_TAG_USAGE_MAX, HID_ITEM_TYPE_LOCAL, 1), a
389 
390 /**
391  * @brief Define HID Usage Minimum item with the data length of two bytes.
392  *
393  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
394  * @ref HID_KEYBOARD_REPORT_DESC()
395  *
396  * @param a Starting Usage lower byte
397  * @param b Starting Usage higher byte
398  * @return  HID Usage Minimum item
399  */
400 #define HID_USAGE_MIN16(a, b)		\
401 	HID_ITEM(HID_ITEM_TAG_USAGE_MIN, HID_ITEM_TYPE_LOCAL, 2), a, b
402 
403 /**
404  * @brief Define HID Usage Maximum item with the data length of two bytes.
405  *
406  * For usage examples, see @ref HID_MOUSE_REPORT_DESC(),
407  * @ref HID_KEYBOARD_REPORT_DESC()
408  *
409  * @param a Ending Usage lower byte
410  * @param b Ending Usage higher byte
411  * @return  HID Usage Maximum item
412  */
413 #define HID_USAGE_MAX16(a, b)		\
414 	HID_ITEM(HID_ITEM_TAG_USAGE_MAX, HID_ITEM_TYPE_LOCAL, 2), a, b
415 
416 /**
417  * @}
418  */
419 
420 /**
421  * @defgroup usb_hid_mk_report_desc Mouse and keyboard report descriptors
422  * @{
423  */
424 
425 /**
426  * @brief Simple HID mouse report descriptor for n button mouse.
427  *
428  * @param bcnt Button count. Allowed values from 1 to 8.
429  */
430 #define HID_MOUSE_REPORT_DESC(bcnt) {				\
431 	HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP),			\
432 	HID_USAGE(HID_USAGE_GEN_DESKTOP_MOUSE),			\
433 	HID_COLLECTION(HID_COLLECTION_APPLICATION),		\
434 		HID_USAGE(HID_USAGE_GEN_DESKTOP_POINTER),	\
435 		HID_COLLECTION(HID_COLLECTION_PHYSICAL),	\
436 			/* Bits used for button signalling */	\
437 			HID_USAGE_PAGE(HID_USAGE_GEN_BUTTON),	\
438 			HID_USAGE_MIN8(1),			\
439 			HID_USAGE_MAX8(bcnt),			\
440 			HID_LOGICAL_MIN8(0),			\
441 			HID_LOGICAL_MAX8(1),			\
442 			HID_REPORT_SIZE(1),			\
443 			HID_REPORT_COUNT(bcnt),			\
444 			/* HID_INPUT (Data,Var,Abs) */		\
445 			HID_INPUT(0x02),			\
446 			/* Unused bits */			\
447 			HID_REPORT_SIZE(8 - bcnt),		\
448 			HID_REPORT_COUNT(1),			\
449 			/* HID_INPUT (Cnst,Ary,Abs) */		\
450 			HID_INPUT(1),				\
451 			/* X and Y axis, scroll */		\
452 			HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP),	\
453 			HID_USAGE(HID_USAGE_GEN_DESKTOP_X),	\
454 			HID_USAGE(HID_USAGE_GEN_DESKTOP_Y),	\
455 			HID_USAGE(HID_USAGE_GEN_DESKTOP_WHEEL),	\
456 			HID_LOGICAL_MIN8(-127),			\
457 			HID_LOGICAL_MAX8(127),			\
458 			HID_REPORT_SIZE(8),			\
459 			HID_REPORT_COUNT(3),			\
460 			/* HID_INPUT (Data,Var,Rel) */		\
461 			HID_INPUT(0x06),			\
462 		HID_END_COLLECTION,				\
463 	HID_END_COLLECTION,					\
464 }
465 
466 /**
467  * @brief Simple HID keyboard report descriptor.
468  */
469 #define HID_KEYBOARD_REPORT_DESC() {				\
470 	HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP),			\
471 	HID_USAGE(HID_USAGE_GEN_DESKTOP_KEYBOARD),		\
472 	HID_COLLECTION(HID_COLLECTION_APPLICATION),		\
473 		HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP_KEYPAD),	\
474 		/* HID_USAGE_MINIMUM(Keyboard LeftControl) */	\
475 		HID_USAGE_MIN8(0xE0),				\
476 		/* HID_USAGE_MAXIMUM(Keyboard Right GUI) */	\
477 		HID_USAGE_MAX8(0xE7),				\
478 		HID_LOGICAL_MIN8(0),				\
479 		HID_LOGICAL_MAX8(1),				\
480 		HID_REPORT_SIZE(1),				\
481 		HID_REPORT_COUNT(8),				\
482 		/* HID_INPUT(Data,Var,Abs) */			\
483 		HID_INPUT(0x02),				\
484 		HID_REPORT_SIZE(8),				\
485 		HID_REPORT_COUNT(1),				\
486 		/* HID_INPUT(Cnst,Var,Abs) */			\
487 		HID_INPUT(0x03),				\
488 		HID_REPORT_SIZE(1),				\
489 		HID_REPORT_COUNT(5),				\
490 		HID_USAGE_PAGE(HID_USAGE_GEN_LEDS),		\
491 		/* HID_USAGE_MINIMUM(Num Lock) */		\
492 		HID_USAGE_MIN8(1),				\
493 		/* HID_USAGE_MAXIMUM(Kana) */			\
494 		HID_USAGE_MAX8(5),				\
495 		/* HID_OUTPUT(Data,Var,Abs) */			\
496 		HID_OUTPUT(0x02),				\
497 		HID_REPORT_SIZE(3),				\
498 		HID_REPORT_COUNT(1),				\
499 		/* HID_OUTPUT(Cnst,Var,Abs) */			\
500 		HID_OUTPUT(0x03),				\
501 		HID_REPORT_SIZE(8),				\
502 		HID_REPORT_COUNT(6),				\
503 		HID_LOGICAL_MIN8(0),				\
504 		HID_LOGICAL_MAX8(101),				\
505 		HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP_KEYPAD),	\
506 		/* HID_USAGE_MIN8(Reserved) */			\
507 		HID_USAGE_MIN8(0),				\
508 		/* HID_USAGE_MAX8(Keyboard Application) */	\
509 		HID_USAGE_MAX8(101),				\
510 		/* HID_INPUT (Data,Ary,Abs) */			\
511 		HID_INPUT(0x00),				\
512 	HID_END_COLLECTION,					\
513 }
514 
515 /**
516  * @brief HID keyboard button codes.
517  */
518 enum hid_kbd_code {
519 	HID_KEY_A		= 4,
520 	HID_KEY_B		= 5,
521 	HID_KEY_C		= 6,
522 	HID_KEY_D		= 7,
523 	HID_KEY_E		= 8,
524 	HID_KEY_F		= 9,
525 	HID_KEY_G		= 10,
526 	HID_KEY_H		= 11,
527 	HID_KEY_I		= 12,
528 	HID_KEY_J		= 13,
529 	HID_KEY_K		= 14,
530 	HID_KEY_L		= 15,
531 	HID_KEY_M		= 16,
532 	HID_KEY_N		= 17,
533 	HID_KEY_O		= 18,
534 	HID_KEY_P		= 19,
535 	HID_KEY_Q		= 20,
536 	HID_KEY_R		= 21,
537 	HID_KEY_S		= 22,
538 	HID_KEY_T		= 23,
539 	HID_KEY_U		= 24,
540 	HID_KEY_V		= 25,
541 	HID_KEY_W		= 26,
542 	HID_KEY_X		= 27,
543 	HID_KEY_Y		= 28,
544 	HID_KEY_Z		= 29,
545 	HID_KEY_1		= 30,
546 	HID_KEY_2		= 31,
547 	HID_KEY_3		= 32,
548 	HID_KEY_4		= 33,
549 	HID_KEY_5		= 34,
550 	HID_KEY_6		= 35,
551 	HID_KEY_7		= 36,
552 	HID_KEY_8		= 37,
553 	HID_KEY_9		= 38,
554 	HID_KEY_0		= 39,
555 	HID_KEY_ENTER		= 40,
556 	HID_KEY_ESC		= 41,
557 	HID_KEY_BACKSPACE	= 42,
558 	HID_KEY_TAB		= 43,
559 	HID_KEY_SPACE		= 44,
560 	HID_KEY_MINUS		= 45,
561 	HID_KEY_EQUAL		= 46,
562 	HID_KEY_LEFTBRACE	= 47,
563 	HID_KEY_RIGHTBRACE	= 48,
564 	HID_KEY_BACKSLASH	= 49,
565 	HID_KEY_HASH		= 50, /* Non-US # and ~ */
566 	HID_KEY_SEMICOLON	= 51,
567 	HID_KEY_APOSTROPHE	= 52,
568 	HID_KEY_GRAVE		= 53,
569 	HID_KEY_COMMA		= 54,
570 	HID_KEY_DOT		= 55,
571 	HID_KEY_SLASH		= 56,
572 	HID_KEY_CAPSLOCK	= 57,
573 	HID_KEY_F1		= 58,
574 	HID_KEY_F2		= 59,
575 	HID_KEY_F3		= 60,
576 	HID_KEY_F4		= 61,
577 	HID_KEY_F5		= 62,
578 	HID_KEY_F6		= 63,
579 	HID_KEY_F7		= 64,
580 	HID_KEY_F8		= 65,
581 	HID_KEY_F9		= 66,
582 	HID_KEY_F10		= 67,
583 	HID_KEY_F11		= 68,
584 	HID_KEY_F12		= 69,
585 	HID_KEY_SYSRQ		= 70, /* PRINTSCREEN */
586 	HID_KEY_SCROLLLOCK	= 71,
587 	HID_KEY_PAUSE		= 72,
588 	HID_KEY_INSERT		= 73,
589 	HID_KEY_HOME		= 74,
590 	HID_KEY_PAGEUP		= 75,
591 	HID_KEY_DELETE		= 76,
592 	HID_KEY_END		= 77,
593 	HID_KEY_PAGEDOWN	= 78,
594 	HID_KEY_RIGHT		= 79,
595 	HID_KEY_LEFT		= 80,
596 	HID_KEY_DOWN		= 81,
597 	HID_KEY_UP		= 82,
598 	HID_KEY_NUMLOCK		= 83,
599 	HID_KEY_KPSLASH		= 84, /* NUMPAD DIVIDE */
600 	HID_KEY_KPASTERISK	= 85, /* NUMPAD MULTIPLY */
601 	HID_KEY_KPMINUS		= 86,
602 	HID_KEY_KPPLUS		= 87,
603 	HID_KEY_KPENTER		= 88,
604 	HID_KEY_KP_1		= 89,
605 	HID_KEY_KP_2		= 90,
606 	HID_KEY_KP_3		= 91,
607 	HID_KEY_KP_4		= 92,
608 	HID_KEY_KP_5		= 93,
609 	HID_KEY_KP_6		= 94,
610 	HID_KEY_KP_7		= 95,
611 	HID_KEY_KP_8		= 96,
612 	HID_KEY_KP_9		= 97,
613 	HID_KEY_KP_0		= 98,
614 };
615 
616 /**
617  * @brief HID keyboard modifiers.
618  */
619 enum hid_kbd_modifier {
620 	HID_KBD_MODIFIER_NONE		= 0x00,
621 	HID_KBD_MODIFIER_LEFT_CTRL	= 0x01,
622 	HID_KBD_MODIFIER_LEFT_SHIFT	= 0x02,
623 	HID_KBD_MODIFIER_LEFT_ALT	= 0x04,
624 	HID_KBD_MODIFIER_LEFT_UI	= 0x08,
625 	HID_KBD_MODIFIER_RIGHT_CTRL	= 0x10,
626 	HID_KBD_MODIFIER_RIGHT_SHIFT	= 0x20,
627 	HID_KBD_MODIFIER_RIGHT_ALT	= 0x40,
628 	HID_KBD_MODIFIER_RIGHT_UI	= 0x80,
629 };
630 
631 /**
632  * @brief HID keyboard LEDs.
633  */
634 enum hid_kbd_led {
635 	HID_KBD_LED_NUM_LOCK	= 0x01,
636 	HID_KBD_LED_CAPS_LOCK	= 0x02,
637 	HID_KBD_LED_SCROLL_LOCK	= 0x04,
638 	HID_KBD_LED_COMPOSE	= 0x08,
639 	HID_KBD_LED_KANA	= 0x10,
640 };
641 
642 /**
643  * @}
644  */
645 
646 /**
647  * @}
648  */
649 
650 #ifdef __cplusplus
651 }
652 #endif
653 
654 #endif /* ZEPHYR_INCLUDE_USB_CLASS_HID_H_ */
655