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