xref: /netbsd-src/sys/dev/adb/adb_usb_map.c (revision 83998c6d7b54d744dc8ea504ea959eb54cf0b743)
1 /*	$NetBSD: adb_usb_map.c,v 1.3 2022/05/14 01:16:55 manu Exp $ */
2 
3 /*-
4  * Copyright (c) 2006 Michael Lorenz
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include <sys/cdefs.h>
30 __KERNEL_RCSID(0, "$NetBSD: adb_usb_map.c,v 1.3 2022/05/14 01:16:55 manu Exp $");
31 
32 #include <sys/param.h>
33 #include <sys/device.h>
34 
35 #include <dev/wscons/wsksymvar.h>
36 
37 /*
38  * Explanation of the differences between ANSI, ISO and JIS:
39  * https://github.com/tmk/tmk_keyboard/blob/master/converter/adb_usb/matrix.c
40  * Summary:
41  *   ADB scan code        USB scan code
42  *   ANSI    ISO    JIS    ANSI        ISO         JIS
43  *     50     10     50   GRAVE/53  GRAVE/53  GRAVE/53
44  *   ----     50   ----    ----     NUBS/100      ----
45  *     42    112     42   BSLS/49   NUHS/50    NUHS/50
46  *   ----   ----     93    ----       ----     JPY/137
47  *   ----   ----     94    ----       ----      RO/135
48  *
49  * With:
50  *  NUBS = Non-US Backslash
51  *  NUHS = Non-US Hash
52  *  BSLS = Backslash
53  *  JPY  = Japaneese Yen
54  *  RO   = ?
55  *
56  * ANSI backslash should be USB scancode 49 but is 50 in the
57  * array below. For most encoding in sys/dev/hid/hidkbdmap.c
58  * (all used for ADB?), 49 and 50 have the same definition.
59  */
60 
61 keysym_t adb_to_usb_ansi[] = {
62 /*   0, KS_a 		*/		4,
63 /*   1, KS_s 		*/		22,
64 /*   2, KS_d 		*/		7,
65 /*   3, KS_f 		*/		9,
66 /*   4, KS_h 		*/		11,
67 /*   5, KS_g 		*/		10,
68 /*   6, KS_z 		*/		29,
69 /*   7, KS_x 		*/		27,
70 /*   8, KS_c 		*/		6,
71 /*   9, KS_v		*/		25,
72 /*  10, KS_paragraph	*/		53,
73 /*  11, KS_b		*/		5,
74 /*  12, KS_q		*/		20,
75 /*  13, KS_w		*/		26,
76 /*  14, KS_e		*/		8,
77 /*  15, KS_r		*/		21,
78 /*  16, KS_y		*/		28,
79 /*  17, KS_t		*/		23,
80 /*  18, KS_1		*/		30,
81 /*  19, KS_2		*/		31,
82 /*  20, KS_3		*/		32,
83 /*  21, KS_4		*/		33,
84 /*  22, KS_6		*/		35,
85 /*  23, KS_5		*/		34,
86 /*  24, KS_equal	*/		46,
87 /*  25, KS_9		*/		38,
88 /*  26, KS_7		*/		36,
89 /*  27, KS_minus	*/		45,
90 /*  28, KS_8		*/		37,
91 /*  29, KS_0		*/		39,
92 /*  30, KS_bracketright	*/		48,
93 /*  31, KS_o		*/		18,
94 /*  32, KS_u		*/		24,
95 /*  33, KS_bracketleft	*/		47,
96 /*  34, KS_i		*/		12,
97 /*  35, KS_p		*/		19,
98 /*  36, KS_Return	*/		40,
99 /*  37, KS_l		*/		15,
100 /*  38, KS_j		*/		13,
101 /*  39, KS_apostrophe	*/		52,
102 /*  40, KS_k		*/		14,
103 /*  41, KS_semicolon	*/		51,
104 /*  42, KS_backslash	*/		50, /* Should be 49 */
105 /*  43, KS_comma	*/		54,
106 /*  44, KS_slash	*/		56,
107 /*  45, KS_n		*/		17,
108 /*  46, KS_m		*/		16,
109 /*  47, KS_period	*/		55,
110 /*  48, KS_Tab		*/		43,
111 /*  49, KS_space	*/		44,
112 /*  50, KS_grave	*/		53,
113 /*  51, KS_Delete	*/		42,
114 /*  52, KS_KP_Enter	*/		88,
115 /*  53, KS_Escape	*/		41,
116 /*  54, KS_Control_L	*/		224,
117 /*  55, KS_Cmd		*/		227,	/* left meta */
118 /*  56, KS_Shift_L	*/		225,
119 /*  57, KS_Caps_Lock	*/		57,
120 /*  58, KS_Option	*/		226,
121 /*  59, KS_Left		*/		80,
122 /*  60, KS_Right	*/		79,
123 /*  61, KS_Down		*/		81,
124 /*  62, KS_Up		*/		82,
125 /*  63			*/		0,
126 /*  64			*/		0,
127 /*  65, KS_KP_Decimal	*/		99,
128 /*  66			*/		0,
129 /*  67, KS_KP_Multiply	*/		85,
130 /*  68			*/		0,
131 /*  69, KS_KP_Add	*/		87,
132 /*  70			*/		0,
133 /*  71, KS_Num_Lock	*/		83,
134 /*  72			*/		0,
135 /*  73			*/		0,
136 /*  74			*/		0,
137 /*  75, KS_KP_Divide	*/		84,
138 /*  76, KS_KP_Enter	*/		88,
139 /*  77			*/		0,
140 /*  78, KS_KP_Subtract	*/		86,
141 /*  79			*/		0,
142 /*  80			*/		0,
143 /*  81, KS_KP_Equal	*/		46,	/* no KP_EQUAL on USB? */
144 /*  82, KS_KP_Insert, 0	*/		98,
145 /*  83, KS_KP_End,    1	*/		89,
146 /*  84, KS_KP_Down,   2	*/		90,
147 /*  85, KS_KP_Next,   3	*/		91,
148 /*  86, KS_KP_Left,   4	*/		92,
149 /*  87, KS_KP_Begin   5	*/		93,
150 /*  88, KS_KP_Right   6	*/		94,
151 /*  89, KS_KP_Home    7	*/		95,
152 /*  90			*/		0,
153 /*  91, KS_KP_Up      8	*/		96,
154 /*  92, KS_KP_Prior   9	*/		97,
155 /*  93, KS_backslash	*/		100,
156 /*  94, KS_underscore	*/		45,
157 /*  95, KS_KP_Delete  . */		99,
158 /*  96, KS_f5		*/		62,
159 /*  97, KS_f6		*/		63,
160 /*  98, KS_f7		*/		64,
161 /*  99, KS_f3		*/		60,
162 /* 100, KS_f8		*/		65,
163 /* 101, KS_f9		*/		66,
164 /* 102			*/		0,
165 /* 103, KS_f11		*/		68,
166 /* 104			*/		0,
167 /* 105, KS_Print_Screen	*/		70,
168 /* 106, KS_KP_Enter	*/		88,
169 /* 107, KS_Hold_Screen	*/		71,
170 /* 108			*/		0,
171 /* 109, KS_f10		*/		67,
172 /* 110			*/		0,
173 /* 111, KS_f12		*/		69,
174 /* 112			*/		0,
175 /* 113, KS_Pause	*/		72,
176 /* 114, KS_Insert	*/		73,
177 /* 115, KS_Home		*/		74,
178 /* 116, KS_Prior	*/		75,
179 /* 117, KS_BackSpace	*/		76,
180 /* 118, KS_f4		*/		61,
181 /* 119, KS_End		*/		77,
182 /* 120, KS_f2		*/		59,
183 /* 121, KS_Next		*/		78,
184 /* 122, KS_f1		*/		58,
185 /* 123, KS_Shift_R	*/		229,
186 /* 124, KS_Alt_R	*/		230,
187 /* 125, KS_Control_R	*/		228,
188 /* 126			*/		0,
189 /* 127, KS_Cmd_Debugger	*/		102
190 };
191 
192 keysym_t adb_to_usb_iso[] = {
193 /*   0, KS_a 		*/		4,
194 /*   1, KS_s 		*/		22,
195 /*   2, KS_d 		*/		7,
196 /*   3, KS_f 		*/		9,
197 /*   4, KS_h 		*/		11,
198 /*   5, KS_g 		*/		10,
199 /*   6, KS_z 		*/		29,
200 /*   7, KS_x 		*/		27,
201 /*   8, KS_c 		*/		6,
202 /*   9, KS_v		*/		25,
203 /*  10, KS_paragraph	*/		53,
204 /*  11, KS_b		*/		5,
205 /*  12, KS_q		*/		20,
206 /*  13, KS_w		*/		26,
207 /*  14, KS_e		*/		8,
208 /*  15, KS_r		*/		21,
209 /*  16, KS_y		*/		28,
210 /*  17, KS_t		*/		23,
211 /*  18, KS_1		*/		30,
212 /*  19, KS_2		*/		31,
213 /*  20, KS_3		*/		32,
214 /*  21, KS_4		*/		33,
215 /*  22, KS_6		*/		35,
216 /*  23, KS_5		*/		34,
217 /*  24, KS_equal	*/		46,
218 /*  25, KS_9		*/		38,
219 /*  26, KS_7		*/		36,
220 /*  27, KS_minus	*/		45,
221 /*  28, KS_8		*/		37,
222 /*  29, KS_0		*/		39,
223 /*  30, KS_bracketright	*/		48,
224 /*  31, KS_o		*/		18,
225 /*  32, KS_u		*/		24,
226 /*  33, KS_bracketleft	*/		47,
227 /*  34, KS_i		*/		12,
228 /*  35, KS_p		*/		19,
229 /*  36, KS_Return	*/		40,
230 /*  37, KS_l		*/		15,
231 /*  38, KS_j		*/		13,
232 /*  39, KS_apostrophe	*/		52,
233 /*  40, KS_k		*/		14,
234 /*  41, KS_semicolon	*/		51,
235 /*  42, KS_backslash	*/		50,
236 /*  43, KS_comma	*/		54,
237 /*  44, KS_slash	*/		56,
238 /*  45, KS_n		*/		17,
239 /*  46, KS_m		*/		16,
240 /*  47, KS_period	*/		55,
241 /*  48, KS_Tab		*/		43,
242 /*  49, KS_space	*/		44,
243 /*  50, KS_grave	*/		100,
244 /*  51, KS_Delete	*/		42,
245 /*  52, KS_KP_Enter	*/		88,
246 /*  53, KS_Escape	*/		41,
247 /*  54, KS_Control_L	*/		224,
248 /*  55, KS_Cmd		*/		227,	/* left meta */
249 /*  56, KS_Shift_L	*/		225,
250 /*  57, KS_Caps_Lock	*/		57,
251 /*  58, KS_Option	*/		226,
252 /*  59, KS_Left		*/		80,
253 /*  60, KS_Right	*/		79,
254 /*  61, KS_Down		*/		81,
255 /*  62, KS_Up		*/		82,
256 /*  63			*/		0,
257 /*  64			*/		0,
258 /*  65, KS_KP_Decimal	*/		99,
259 /*  66			*/		0,
260 /*  67, KS_KP_Multiply	*/		85,
261 /*  68			*/		0,
262 /*  69, KS_KP_Add	*/		87,
263 /*  70			*/		0,
264 /*  71, KS_Num_Lock	*/		83,
265 /*  72			*/		0,
266 /*  73			*/		0,
267 /*  74			*/		0,
268 /*  75, KS_KP_Divide	*/		84,
269 /*  76, KS_KP_Enter	*/		88,
270 /*  77			*/		0,
271 /*  78, KS_KP_Subtract	*/		86,
272 /*  79			*/		0,
273 /*  80			*/		0,
274 /*  81, KS_KP_Equal	*/		46,	/* no KP_EQUAL on USB? */
275 /*  82, KS_KP_Insert, 0	*/		98,
276 /*  83, KS_KP_End,    1	*/		89,
277 /*  84, KS_KP_Down,   2	*/		90,
278 /*  85, KS_KP_Next,   3	*/		91,
279 /*  86, KS_KP_Left,   4	*/		92,
280 /*  87, KS_KP_Begin   5	*/		93,
281 /*  88, KS_KP_Right   6	*/		94,
282 /*  89, KS_KP_Home    7	*/		95,
283 /*  90			*/		0,
284 /*  91, KS_KP_Up      8	*/		96,
285 /*  92, KS_KP_Prior   9	*/		97,
286 /*  93, KS_backslash	*/		100,
287 /*  94, KS_underscore	*/		45,
288 /*  95, KS_KP_Delete  . */		99,
289 /*  96, KS_f5		*/		62,
290 /*  97, KS_f6		*/		63,
291 /*  98, KS_f7		*/		64,
292 /*  99, KS_f3		*/		60,
293 /* 100, KS_f8		*/		65,
294 /* 101, KS_f9		*/		66,
295 /* 102			*/		0,
296 /* 103, KS_f11		*/		68,
297 /* 104			*/		0,
298 /* 105, KS_Print_Screen	*/		70,
299 /* 106, KS_KP_Enter	*/		88,
300 /* 107, KS_Hold_Screen	*/		71,
301 /* 108			*/		0,
302 /* 109, KS_f10		*/		67,
303 /* 110			*/		0,
304 /* 111, KS_f12		*/		69,
305 /* 112			*/		0,
306 /* 113, KS_Pause	*/		72,
307 /* 114, KS_Insert	*/		73,
308 /* 115, KS_Home		*/		74,
309 /* 116, KS_Prior	*/		75,
310 /* 117, KS_BackSpace	*/		76,
311 /* 118, KS_f4		*/		61,
312 /* 119, KS_End		*/		77,
313 /* 120, KS_f2		*/		59,
314 /* 121, KS_Next		*/		78,
315 /* 122, KS_f1		*/		58,
316 /* 123, KS_Shift_R	*/		229,
317 /* 124, KS_Alt_R	*/		230,
318 /* 125, KS_Control_R	*/		228,
319 /* 126			*/		0,
320 /* 127, KS_Cmd_Debugger	*/		102
321 };
322 
323 keysym_t adb_to_usb_jis[] = { /* XXX not updated from ansi yet */
324 /*   0, KS_a 		*/		4,
325 /*   1, KS_s 		*/		22,
326 /*   2, KS_d 		*/		7,
327 /*   3, KS_f 		*/		9,
328 /*   4, KS_h 		*/		11,
329 /*   5, KS_g 		*/		10,
330 /*   6, KS_z 		*/		29,
331 /*   7, KS_x 		*/		27,
332 /*   8, KS_c 		*/		6,
333 /*   9, KS_v		*/		25,
334 /*  10, KS_paragraph	*/		53,
335 /*  11, KS_b		*/		5,
336 /*  12, KS_q		*/		20,
337 /*  13, KS_w		*/		26,
338 /*  14, KS_e		*/		8,
339 /*  15, KS_r		*/		21,
340 /*  16, KS_y		*/		28,
341 /*  17, KS_t		*/		23,
342 /*  18, KS_1		*/		30,
343 /*  19, KS_2		*/		31,
344 /*  20, KS_3		*/		32,
345 /*  21, KS_4		*/		33,
346 /*  22, KS_6		*/		35,
347 /*  23, KS_5		*/		34,
348 /*  24, KS_equal	*/		46,
349 /*  25, KS_9		*/		38,
350 /*  26, KS_7		*/		36,
351 /*  27, KS_minus	*/		45,
352 /*  28, KS_8		*/		37,
353 /*  29, KS_0		*/		39,
354 /*  30, KS_bracketright	*/		48,
355 /*  31, KS_o		*/		18,
356 /*  32, KS_u		*/		24,
357 /*  33, KS_bracketleft	*/		47,
358 /*  34, KS_i		*/		12,
359 /*  35, KS_p		*/		19,
360 /*  36, KS_Return	*/		40,
361 /*  37, KS_l		*/		15,
362 /*  38, KS_j		*/		13,
363 /*  39, KS_apostrophe	*/		52,
364 /*  40, KS_k		*/		14,
365 /*  41, KS_semicolon	*/		51,
366 /*  42, KS_backslash	*/		50,
367 /*  43, KS_comma	*/		54,
368 /*  44, KS_slash	*/		56,
369 /*  45, KS_n		*/		17,
370 /*  46, KS_m		*/		16,
371 /*  47, KS_period	*/		55,
372 /*  48, KS_Tab		*/		43,
373 /*  49, KS_space	*/		44,
374 /*  50, KS_grave	*/		53,
375 /*  51, KS_Delete	*/		42,
376 /*  52, KS_KP_Enter	*/		88,
377 /*  53, KS_Escape	*/		41,
378 /*  54, KS_Control_L	*/		224,
379 /*  55, KS_Cmd		*/		227,	/* left meta */
380 /*  56, KS_Shift_L	*/		225,
381 /*  57, KS_Caps_Lock	*/		57,
382 /*  58, KS_Option	*/		226,
383 /*  59, KS_Left		*/		80,
384 /*  60, KS_Right	*/		79,
385 /*  61, KS_Down		*/		81,
386 /*  62, KS_Up		*/		82,
387 /*  63			*/		0,
388 /*  64			*/		0,
389 /*  65, KS_KP_Decimal	*/		99,
390 /*  66			*/		0,
391 /*  67, KS_KP_Multiply	*/		85,
392 /*  68			*/		0,
393 /*  69, KS_KP_Add	*/		87,
394 /*  70			*/		0,
395 /*  71, KS_Num_Lock	*/		83,
396 /*  72			*/		0,
397 /*  73			*/		0,
398 /*  74			*/		0,
399 /*  75, KS_KP_Divide	*/		84,
400 /*  76, KS_KP_Enter	*/		88,
401 /*  77			*/		0,
402 /*  78, KS_KP_Subtract	*/		86,
403 /*  79			*/		0,
404 /*  80			*/		0,
405 /*  81, KS_KP_Equal	*/		46,	/* no KP_EQUAL on USB? */
406 /*  82, KS_KP_Insert, 0	*/		98,
407 /*  83, KS_KP_End,    1	*/		89,
408 /*  84, KS_KP_Down,   2	*/		90,
409 /*  85, KS_KP_Next,   3	*/		91,
410 /*  86, KS_KP_Left,   4	*/		92,
411 /*  87, KS_KP_Begin   5	*/		93,
412 /*  88, KS_KP_Right   6	*/		94,
413 /*  89, KS_KP_Home    7	*/		95,
414 /*  90			*/		0,
415 /*  91, KS_KP_Up      8	*/		96,
416 /*  92, KS_KP_Prior   9	*/		97,
417 /*  93, KS_backslash	*/		137,	/* JPY */
418 /*  94, KS_underscore	*/		135,	/* RO */
419 /*  95, KS_KP_Delete  . */		99,
420 /*  96, KS_f5		*/		62,
421 /*  97, KS_f6		*/		63,
422 /*  98, KS_f7		*/		64,
423 /*  99, KS_f3		*/		60,
424 /* 100, KS_f8		*/		65,
425 /* 101, KS_f9		*/		66,
426 /* 102			*/		0,
427 /* 103, KS_f11		*/		68,
428 /* 104			*/		0,
429 /* 105, KS_Print_Screen	*/		70,
430 /* 106, KS_KP_Enter	*/		88,
431 /* 107, KS_Hold_Screen	*/		71,
432 /* 108			*/		0,
433 /* 109, KS_f10		*/		67,
434 /* 110			*/		0,
435 /* 111, KS_f12		*/		69,
436 /* 112			*/		0,
437 /* 113, KS_Pause	*/		72,
438 /* 114, KS_Insert	*/		73,
439 /* 115, KS_Home		*/		74,
440 /* 116, KS_Prior	*/		75,
441 /* 117, KS_BackSpace	*/		76,
442 /* 118, KS_f4		*/		61,
443 /* 119, KS_End		*/		77,
444 /* 120, KS_f2		*/		59,
445 /* 121, KS_Next		*/		78,
446 /* 122, KS_f1		*/		58,
447 /* 123, KS_Shift_R	*/		229,
448 /* 124, KS_Alt_R	*/		230,
449 /* 125, KS_Control_R	*/		228,
450 /* 126			*/		0,
451 /* 127, KS_Cmd_Debugger	*/		102
452 };
453 
454