source: mainline/uspace/srv/hid/input/ctl/stty.c

Last change on this file was 7e660378, checked in by Jiri Svoboda <jiri@…>, 22 months ago

Support Alt-key in serial console

  • Property mode set to 100644
File size: 9.6 KB
Line 
1/*
2 * Copyright (c) 2023 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup kbd_ctl
30 * @ingroup input
31 * @{
32 */
33/**
34 * @file
35 * @brief Serial TTY-like keyboard controller driver.
36 *
37 * Keyboard emulation on a serial terminal.
38 */
39
40#include <errno.h>
41#include <io/keycode.h>
42#include "../stroke.h"
43#include "../gsp.h"
44#include "../kbd.h"
45#include "../kbd_port.h"
46#include "../kbd_ctl.h"
47
48static void stty_ctl_parse(sysarg_t);
49static errno_t stty_ctl_init(kbd_dev_t *);
50static void stty_ctl_set_ind(kbd_dev_t *, unsigned int);
51
52kbd_ctl_ops_t stty_ctl = {
53 .parse = stty_ctl_parse,
54 .init = stty_ctl_init,
55 .set_ind = stty_ctl_set_ind
56};
57
58static kbd_dev_t *kbd_dev;
59
60/** Scancode parser */
61static gsp_t sp;
62
63/** Current parser state */
64static int ds;
65
66#include <stdio.h>
67
68/**
69 * Sequnece definitions are primarily for Xterm. Additionally we define
70 * sequences that are unique to Gnome terminal -- most are the same but
71 * some differ.
72 */
73static int seq_defs[] = {
74 /* Not shifted */
75
76 0, KC_BACKTICK, 0x60, GSP_END,
77
78 0, KC_1, 0x31, GSP_END,
79 0, KC_2, 0x32, GSP_END,
80 0, KC_3, 0x33, GSP_END,
81 0, KC_4, 0x34, GSP_END,
82 0, KC_5, 0x35, GSP_END,
83 0, KC_6, 0x36, GSP_END,
84 0, KC_7, 0x37, GSP_END,
85 0, KC_8, 0x38, GSP_END,
86 0, KC_9, 0x39, GSP_END,
87 0, KC_0, 0x30, GSP_END,
88
89 0, KC_MINUS, 0x2d, GSP_END,
90 0, KC_EQUALS, 0x3d, GSP_END,
91
92 0, KC_BACKSPACE, 0x08, GSP_END,
93
94 0, KC_TAB, 0x09, GSP_END,
95
96 0, KC_Q, 0x71, GSP_END,
97 0, KC_W, 0x77, GSP_END,
98 0, KC_E, 0x65, GSP_END,
99 0, KC_R, 0x72, GSP_END,
100 0, KC_T, 0x74, GSP_END,
101 0, KC_Y, 0x79, GSP_END,
102 0, KC_U, 0x75, GSP_END,
103 0, KC_I, 0x69, GSP_END,
104 0, KC_O, 0x6f, GSP_END,
105 0, KC_P, 0x70, GSP_END,
106
107 0, KC_LBRACKET, 0x5b, GSP_END,
108 0, KC_RBRACKET, 0x5d, GSP_END,
109
110 0, KC_A, 0x61, GSP_END,
111 0, KC_S, 0x73, GSP_END,
112 0, KC_D, 0x64, GSP_END,
113 0, KC_F, 0x66, GSP_END,
114 0, KC_G, 0x67, GSP_END,
115 0, KC_H, 0x68, GSP_END,
116 0, KC_J, 0x6a, GSP_END,
117 0, KC_K, 0x6b, GSP_END,
118 0, KC_L, 0x6c, GSP_END,
119
120 0, KC_SEMICOLON, 0x3b, GSP_END,
121 0, KC_QUOTE, 0x27, GSP_END,
122 0, KC_BACKSLASH, 0x5c, GSP_END,
123
124 0, KC_Z, 0x7a, GSP_END,
125 0, KC_X, 0x78, GSP_END,
126 0, KC_C, 0x63, GSP_END,
127 0, KC_V, 0x76, GSP_END,
128 0, KC_B, 0x62, GSP_END,
129 0, KC_N, 0x6e, GSP_END,
130 0, KC_M, 0x6d, GSP_END,
131
132 0, KC_COMMA, 0x2c, GSP_END,
133 0, KC_PERIOD, 0x2e, GSP_END,
134 0, KC_SLASH, 0x2f, GSP_END,
135
136 /* Shifted */
137
138 KM_SHIFT, KC_BACKTICK, 0x7e, GSP_END,
139
140 KM_SHIFT, KC_1, 0x21, GSP_END,
141 KM_SHIFT, KC_2, 0x40, GSP_END,
142 KM_SHIFT, KC_3, 0x23, GSP_END,
143 KM_SHIFT, KC_4, 0x24, GSP_END,
144 KM_SHIFT, KC_5, 0x25, GSP_END,
145 KM_SHIFT, KC_6, 0x5e, GSP_END,
146 KM_SHIFT, KC_7, 0x26, GSP_END,
147 KM_SHIFT, KC_8, 0x2a, GSP_END,
148 KM_SHIFT, KC_9, 0x28, GSP_END,
149 KM_SHIFT, KC_0, 0x29, GSP_END,
150
151 KM_SHIFT, KC_MINUS, 0x5f, GSP_END,
152 KM_SHIFT, KC_EQUALS, 0x2b, GSP_END,
153
154 KM_SHIFT, KC_Q, 0x51, GSP_END,
155 KM_SHIFT, KC_W, 0x57, GSP_END,
156 KM_SHIFT, KC_E, 0x45, GSP_END,
157 KM_SHIFT, KC_R, 0x52, GSP_END,
158 KM_SHIFT, KC_T, 0x54, GSP_END,
159 KM_SHIFT, KC_Y, 0x59, GSP_END,
160 KM_SHIFT, KC_U, 0x55, GSP_END,
161 KM_SHIFT, KC_I, 0x49, GSP_END,
162 KM_SHIFT, KC_O, 0x4f, GSP_END,
163 KM_SHIFT, KC_P, 0x50, GSP_END,
164
165 KM_SHIFT, KC_LBRACKET, 0x7b, GSP_END,
166 KM_SHIFT, KC_RBRACKET, 0x7d, GSP_END,
167
168 KM_SHIFT, KC_A, 0x41, GSP_END,
169 KM_SHIFT, KC_S, 0x53, GSP_END,
170 KM_SHIFT, KC_D, 0x44, GSP_END,
171 KM_SHIFT, KC_F, 0x46, GSP_END,
172 KM_SHIFT, KC_G, 0x47, GSP_END,
173 KM_SHIFT, KC_H, 0x48, GSP_END,
174 KM_SHIFT, KC_J, 0x4a, GSP_END,
175 KM_SHIFT, KC_K, 0x4b, GSP_END,
176 KM_SHIFT, KC_L, 0x4c, GSP_END,
177
178 KM_SHIFT, KC_SEMICOLON, 0x3a, GSP_END,
179 KM_SHIFT, KC_QUOTE, 0x22, GSP_END,
180 KM_SHIFT, KC_BACKSLASH, 0x7c, GSP_END,
181
182 KM_SHIFT, KC_Z, 0x5a, GSP_END,
183 KM_SHIFT, KC_X, 0x58, GSP_END,
184 KM_SHIFT, KC_C, 0x43, GSP_END,
185 KM_SHIFT, KC_V, 0x56, GSP_END,
186 KM_SHIFT, KC_B, 0x42, GSP_END,
187 KM_SHIFT, KC_N, 0x4e, GSP_END,
188 KM_SHIFT, KC_M, 0x4d, GSP_END,
189
190 KM_SHIFT, KC_COMMA, 0x3c, GSP_END,
191 KM_SHIFT, KC_PERIOD, 0x3e, GSP_END,
192 KM_SHIFT, KC_SLASH, 0x3f, GSP_END,
193
194 /* ... */
195
196 0, KC_SPACE, 0x20, GSP_END,
197 0, KC_ENTER, 0x0a, GSP_END,
198 0, KC_ENTER, 0x0d, GSP_END,
199
200 0, KC_ESCAPE, 0x1b, 0x1b, GSP_END,
201
202 0, KC_F1, 0x1b, 0x4f, 0x50, GSP_END,
203 0, KC_F2, 0x1b, 0x4f, 0x51, GSP_END,
204 0, KC_F3, 0x1b, 0x4f, 0x52, GSP_END,
205 0, KC_F4, 0x1b, 0x4f, 0x53, GSP_END,
206 0, KC_F5, 0x1b, 0x5b, 0x31, 0x35, 0x7e, GSP_END,
207 0, KC_F6, 0x1b, 0x5b, 0x31, 0x37, 0x7e, GSP_END,
208 0, KC_F7, 0x1b, 0x5b, 0x31, 0x38, 0x7e, GSP_END,
209 0, KC_F8, 0x1b, 0x5b, 0x31, 0x39, 0x7e, GSP_END,
210 0, KC_F9, 0x1b, 0x5b, 0x32, 0x30, 0x7e, GSP_END,
211 0, KC_F10, 0x1b, 0x5b, 0x32, 0x31, 0x7e, GSP_END,
212 0, KC_F11, 0x1b, 0x5b, 0x32, 0x33, 0x7e, GSP_END,
213 0, KC_F12, 0x1b, 0x5b, 0x32, 0x34, 0x7e, GSP_END,
214
215 0, KC_PRTSCR, 0x1b, 0x5b, 0x32, 0x35, 0x7e, GSP_END,
216 0, KC_PAUSE, 0x1b, 0x5b, 0x32, 0x38, 0x7e, GSP_END,
217
218 0, KC_INSERT, 0x1b, 0x5b, 0x32, 0x7e, GSP_END,
219 0, KC_HOME, 0x1b, 0x5b, 0x48, GSP_END,
220 0, KC_PAGE_UP, 0x1b, 0x5b, 0x35, 0x7e, GSP_END,
221 0, KC_DELETE, 0x1b, 0x5b, 0x33, 0x7e, GSP_END,
222 0, KC_END, 0x1b, 0x5b, 0x46, GSP_END,
223 0, KC_PAGE_DOWN, 0x1b, 0x5b, 0x36, 0x7e, GSP_END,
224
225 0, KC_UP, 0x1b, 0x5b, 0x41, GSP_END,
226 0, KC_LEFT, 0x1b, 0x5b, 0x44, GSP_END,
227 0, KC_DOWN, 0x1b, 0x5b, 0x42, GSP_END,
228 0, KC_RIGHT, 0x1b, 0x5b, 0x43, GSP_END,
229
230 /* Ctrl + key */
231
232 KM_CTRL, KC_Q, 0x11, GSP_END,
233 KM_CTRL, KC_W, 0x17, GSP_END,
234 KM_CTRL, KC_E, 0x05, GSP_END,
235 KM_CTRL, KC_R, 0x12, GSP_END,
236 KM_CTRL, KC_T, 0x14, GSP_END,
237 KM_CTRL, KC_Y, 0x19, GSP_END,
238 KM_CTRL, KC_U, 0x15, GSP_END,
239 KM_CTRL, KC_O, 0x0f, GSP_END,
240 KM_CTRL, KC_P, 0x10, GSP_END,
241
242 KM_CTRL, KC_A, 0x01, GSP_END,
243 KM_CTRL, KC_S, 0x13, GSP_END,
244 KM_CTRL, KC_D, 0x04, GSP_END,
245 KM_CTRL, KC_F, 0x06, GSP_END,
246 KM_CTRL, KC_G, 0x07, GSP_END,
247 KM_CTRL, KC_K, 0x0b, GSP_END,
248 KM_CTRL, KC_L, 0x0c, GSP_END,
249
250 KM_CTRL, KC_Z, 0x1a, GSP_END,
251 KM_CTRL, KC_X, 0x18, GSP_END,
252 KM_CTRL, KC_C, 0x03, GSP_END,
253 KM_CTRL, KC_V, 0x16, GSP_END,
254 KM_CTRL, KC_B, 0x02, GSP_END,
255 KM_CTRL, KC_N, 0x0e, GSP_END,
256
257 /* Alt + key */
258
259 KM_ALT, KC_BACKTICK, 0x1b, 0x60, GSP_END,
260
261 KM_ALT, KC_1, 0x1b, 0x31, GSP_END,
262 KM_ALT, KC_2, 0x1b, 0x32, GSP_END,
263 KM_ALT, KC_3, 0x1b, 0x33, GSP_END,
264 KM_ALT, KC_4, 0x1b, 0x34, GSP_END,
265 KM_ALT, KC_5, 0x1b, 0x35, GSP_END,
266 KM_ALT, KC_6, 0x1b, 0x36, GSP_END,
267 KM_ALT, KC_7, 0x1b, 0x37, GSP_END,
268 KM_ALT, KC_8, 0x1b, 0x38, GSP_END,
269 KM_ALT, KC_9, 0x1b, 0x39, GSP_END,
270 KM_ALT, KC_0, 0x1b, 0x30, GSP_END,
271
272 KM_ALT, KC_MINUS, 0x1b, 0x2d, GSP_END,
273 KM_ALT, KC_EQUALS, 0x1b, 0x3d, GSP_END,
274
275 KM_ALT, KC_Q, 0x1b, 0x71, GSP_END,
276 KM_ALT, KC_W, 0x1b, 0x77, GSP_END,
277 KM_ALT, KC_E, 0x1b, 0x65, GSP_END,
278 KM_ALT, KC_R, 0x1b, 0x72, GSP_END,
279 KM_ALT, KC_T, 0x1b, 0x74, GSP_END,
280 KM_ALT, KC_Y, 0x1b, 0x79, GSP_END,
281 KM_ALT, KC_U, 0x1b, 0x75, GSP_END,
282 KM_ALT, KC_I, 0x1b, 0x69, GSP_END,
283 KM_ALT, KC_O, 0x1b, 0x6f, GSP_END,
284 KM_ALT, KC_P, 0x1b, 0x70, GSP_END,
285
286 /* 0x1b, 0x5b is used by other keys/sequences */
287 KM_ALT, KC_RBRACKET, 0x1b, 0x5d, GSP_END,
288
289 KM_ALT, KC_A, 0x1b, 0x61, GSP_END,
290 KM_ALT, KC_S, 0x1b, 0x73, GSP_END,
291 KM_ALT, KC_D, 0x1b, 0x64, GSP_END,
292 KM_ALT, KC_F, 0x1b, 0x66, GSP_END,
293 KM_ALT, KC_G, 0x1b, 0x67, GSP_END,
294 KM_ALT, KC_H, 0x1b, 0x68, GSP_END,
295 KM_ALT, KC_J, 0x1b, 0x6a, GSP_END,
296 KM_ALT, KC_K, 0x1b, 0x6b, GSP_END,
297 KM_ALT, KC_L, 0x1b, 0x6c, GSP_END,
298
299 KM_ALT, KC_SEMICOLON, 0x1b, 0x3b, GSP_END,
300 KM_ALT, KC_QUOTE, 0x1b, 0x27, GSP_END,
301 KM_ALT, KC_BACKSLASH, 0x1b, 0x5c, GSP_END,
302
303 KM_ALT, KC_Z, 0x1b, 0x7a, GSP_END,
304 KM_ALT, KC_X, 0x1b, 0x78, GSP_END,
305 KM_ALT, KC_C, 0x1b, 0x63, GSP_END,
306 KM_ALT, KC_V, 0x1b, 0x76, GSP_END,
307 KM_ALT, KC_B, 0x1b, 0x62, GSP_END,
308 KM_ALT, KC_N, 0x1b, 0x6e, GSP_END,
309 KM_ALT, KC_M, 0x1b, 0x6d, GSP_END,
310
311 KM_ALT, KC_COMMA, 0x1b, 0x2c, GSP_END,
312 KM_ALT, KC_PERIOD, 0x1b, 0x2e, GSP_END,
313 KM_ALT, KC_SLASH, 0x1b, 0x2f, GSP_END,
314
315 /*
316 * Sequences specific to Gnome terminal
317 */
318 0, KC_BACKSPACE, 0x7f, GSP_END, /* ASCII DEL */
319 0, KC_HOME, 0x1b, 0x4f, 0x48, GSP_END,
320 0, KC_END, 0x1b, 0x4f, 0x46, GSP_END,
321
322 0, 0
323};
324
325static errno_t stty_ctl_init(kbd_dev_t *kdev)
326{
327 kbd_dev = kdev;
328 ds = 0;
329
330 gsp_init(&sp);
331 if (gsp_insert_defs(&sp, seq_defs) < 0) {
332 return EINVAL;
333 }
334 return EOK;
335}
336
337static void stty_ctl_parse(sysarg_t scancode)
338{
339 unsigned mods, key;
340
341 ds = gsp_step(&sp, ds, scancode, &mods, &key);
342 if (key != 0) {
343 stroke_sim(kbd_dev, mods, key);
344 }
345}
346
347static void stty_ctl_set_ind(kbd_dev_t *kdev, unsigned mods)
348{
349 (void) mods;
350}
351
352/**
353 * @}
354 */
Note: See TracBrowser for help on using the repository browser.