1 /*
2  * Copyright 2024 Google LLC
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <stdint.h>
8 #include <zephyr/dt-bindings/input/input-event-codes.h>
9 #include <zephyr/sys/util.h>
10 #include <zephyr/usb/class/hid.h>
11 
12 static uint8_t input_to_hid_map[] = {
13 	[INPUT_KEY_A] = HID_KEY_A,
14 	[INPUT_KEY_B] = HID_KEY_B,
15 	[INPUT_KEY_C] = HID_KEY_C,
16 	[INPUT_KEY_D] = HID_KEY_D,
17 	[INPUT_KEY_E] = HID_KEY_E,
18 	[INPUT_KEY_F] = HID_KEY_F,
19 	[INPUT_KEY_G] = HID_KEY_G,
20 	[INPUT_KEY_H] = HID_KEY_H,
21 	[INPUT_KEY_I] = HID_KEY_I,
22 	[INPUT_KEY_J] = HID_KEY_J,
23 	[INPUT_KEY_K] = HID_KEY_K,
24 	[INPUT_KEY_L] = HID_KEY_L,
25 	[INPUT_KEY_M] = HID_KEY_M,
26 	[INPUT_KEY_N] = HID_KEY_N,
27 	[INPUT_KEY_O] = HID_KEY_O,
28 	[INPUT_KEY_P] = HID_KEY_P,
29 	[INPUT_KEY_Q] = HID_KEY_Q,
30 	[INPUT_KEY_R] = HID_KEY_R,
31 	[INPUT_KEY_S] = HID_KEY_S,
32 	[INPUT_KEY_T] = HID_KEY_T,
33 	[INPUT_KEY_U] = HID_KEY_U,
34 	[INPUT_KEY_V] = HID_KEY_V,
35 	[INPUT_KEY_W] = HID_KEY_W,
36 	[INPUT_KEY_X] = HID_KEY_X,
37 	[INPUT_KEY_Y] = HID_KEY_Y,
38 	[INPUT_KEY_Z] = HID_KEY_Z,
39 	[INPUT_KEY_1] = HID_KEY_1,
40 	[INPUT_KEY_2] = HID_KEY_2,
41 	[INPUT_KEY_3] = HID_KEY_3,
42 	[INPUT_KEY_4] = HID_KEY_4,
43 	[INPUT_KEY_5] = HID_KEY_5,
44 	[INPUT_KEY_6] = HID_KEY_6,
45 	[INPUT_KEY_7] = HID_KEY_7,
46 	[INPUT_KEY_8] = HID_KEY_8,
47 	[INPUT_KEY_9] = HID_KEY_9,
48 	[INPUT_KEY_0] = HID_KEY_0,
49 	[INPUT_KEY_ENTER] = HID_KEY_ENTER,
50 	[INPUT_KEY_ESC] = HID_KEY_ESC,
51 	[INPUT_KEY_BACKSPACE] = HID_KEY_BACKSPACE,
52 	[INPUT_KEY_TAB] = HID_KEY_TAB,
53 	[INPUT_KEY_SPACE] = HID_KEY_SPACE,
54 	[INPUT_KEY_MINUS] = HID_KEY_MINUS,
55 	[INPUT_KEY_EQUAL] = HID_KEY_EQUAL,
56 	[INPUT_KEY_LEFTBRACE] = HID_KEY_LEFTBRACE,
57 	[INPUT_KEY_RIGHTBRACE] = HID_KEY_RIGHTBRACE,
58 	[INPUT_KEY_BACKSLASH] = HID_KEY_BACKSLASH,
59 	[INPUT_KEY_SEMICOLON] = HID_KEY_SEMICOLON,
60 	[INPUT_KEY_APOSTROPHE] = HID_KEY_APOSTROPHE,
61 	[INPUT_KEY_GRAVE] = HID_KEY_GRAVE,
62 	[INPUT_KEY_COMMA] = HID_KEY_COMMA,
63 	[INPUT_KEY_DOT] = HID_KEY_DOT,
64 	[INPUT_KEY_SLASH] = HID_KEY_SLASH,
65 	[INPUT_KEY_CAPSLOCK] = HID_KEY_CAPSLOCK,
66 	[INPUT_KEY_F1] = HID_KEY_F1,
67 	[INPUT_KEY_F2] = HID_KEY_F2,
68 	[INPUT_KEY_F3] = HID_KEY_F3,
69 	[INPUT_KEY_F4] = HID_KEY_F4,
70 	[INPUT_KEY_F5] = HID_KEY_F5,
71 	[INPUT_KEY_F6] = HID_KEY_F6,
72 	[INPUT_KEY_F7] = HID_KEY_F7,
73 	[INPUT_KEY_F8] = HID_KEY_F8,
74 	[INPUT_KEY_F9] = HID_KEY_F9,
75 	[INPUT_KEY_F10] = HID_KEY_F10,
76 	[INPUT_KEY_F11] = HID_KEY_F11,
77 	[INPUT_KEY_F12] = HID_KEY_F12,
78 	[INPUT_KEY_SYSRQ] = HID_KEY_SYSRQ,
79 	[INPUT_KEY_SCROLLLOCK] = HID_KEY_SCROLLLOCK,
80 	[INPUT_KEY_PAUSE] = HID_KEY_PAUSE,
81 	[INPUT_KEY_INSERT] = HID_KEY_INSERT,
82 	[INPUT_KEY_HOME] = HID_KEY_HOME,
83 	[INPUT_KEY_PAGEUP] = HID_KEY_PAGEUP,
84 	[INPUT_KEY_DELETE] = HID_KEY_DELETE,
85 	[INPUT_KEY_END] = HID_KEY_END,
86 	[INPUT_KEY_PAGEDOWN] = HID_KEY_PAGEDOWN,
87 	[INPUT_KEY_RIGHT] = HID_KEY_RIGHT,
88 	[INPUT_KEY_LEFT] = HID_KEY_LEFT,
89 	[INPUT_KEY_DOWN] = HID_KEY_DOWN,
90 	[INPUT_KEY_UP] = HID_KEY_UP,
91 	[INPUT_KEY_NUMLOCK] = HID_KEY_NUMLOCK,
92 	[INPUT_KEY_KPSLASH] = HID_KEY_KPSLASH,
93 	[INPUT_KEY_KPASTERISK] = HID_KEY_KPASTERISK,
94 	[INPUT_KEY_KPMINUS] = HID_KEY_KPMINUS,
95 	[INPUT_KEY_KPPLUS] = HID_KEY_KPPLUS,
96 	[INPUT_KEY_KPENTER] = HID_KEY_KPENTER,
97 	[INPUT_KEY_KP1] = HID_KEY_KP_1,
98 	[INPUT_KEY_KP2] = HID_KEY_KP_2,
99 	[INPUT_KEY_KP3] = HID_KEY_KP_3,
100 	[INPUT_KEY_KP4] = HID_KEY_KP_4,
101 	[INPUT_KEY_KP5] = HID_KEY_KP_5,
102 	[INPUT_KEY_KP6] = HID_KEY_KP_6,
103 	[INPUT_KEY_KP7] = HID_KEY_KP_7,
104 	[INPUT_KEY_KP8] = HID_KEY_KP_8,
105 	[INPUT_KEY_KP9] = HID_KEY_KP_9,
106 	[INPUT_KEY_KP0] = HID_KEY_KP_0,
107 };
108 
input_to_hid_code(uint16_t input_code)109 int16_t input_to_hid_code(uint16_t input_code)
110 {
111 	uint8_t hid_code;
112 
113 	if (input_code >= ARRAY_SIZE(input_to_hid_map)) {
114 		return -1;
115 	}
116 
117 	hid_code = input_to_hid_map[input_code];
118 
119 	if (hid_code == 0) {
120 		return -1;
121 	}
122 
123 	return hid_code;
124 }
125 
input_to_hid_modifier(uint16_t input_code)126 uint8_t input_to_hid_modifier(uint16_t input_code)
127 {
128 	switch (input_code) {
129 	case INPUT_KEY_LEFTCTRL:
130 		return HID_KBD_MODIFIER_LEFT_CTRL;
131 	case INPUT_KEY_LEFTSHIFT:
132 		return HID_KBD_MODIFIER_LEFT_SHIFT;
133 	case INPUT_KEY_LEFTALT:
134 		return HID_KBD_MODIFIER_LEFT_ALT;
135 	case INPUT_KEY_LEFTMETA:
136 		return HID_KBD_MODIFIER_LEFT_UI;
137 	case INPUT_KEY_RIGHTCTRL:
138 		return HID_KBD_MODIFIER_RIGHT_CTRL;
139 	case INPUT_KEY_RIGHTSHIFT:
140 		return HID_KBD_MODIFIER_RIGHT_SHIFT;
141 	case INPUT_KEY_RIGHTALT:
142 		return HID_KBD_MODIFIER_RIGHT_ALT;
143 	case INPUT_KEY_RIGHTMETA:
144 		return HID_KBD_MODIFIER_RIGHT_UI;
145 	default:
146 		return HID_KBD_MODIFIER_NONE;
147 	}
148 }
149