1/* $NetBSD: linux_keymap.c,v 1.2 2017/08/31 19:55:43 jmcneill Exp $ */
2
3/*-
4 * Copyright (c) 1997-2017 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Juergen Hannken-Illjes and Jared McNeill.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <sys/cdefs.h>
33__KERNEL_RCSID(0, "$NetBSD: linux_keymap.c,v 1.2 2017/08/31 19:55:43 jmcneill Exp $");
34
35#include <sys/types.h>
36#include <dev/wscons/linux_keymap.h>
37
38static const uint8_t linux_key_to_usb_map[] = {
39	[0  ] /*         KEY_RESERVED */ =	0x00,
40	[1  ] /*              KEY_ESC */ =	0x29,
41	[2  ] /*                KEY_1 */ =	0x1e,
42	[3  ] /*                KEY_2 */ =	0x1f,
43	[4  ] /*                KEY_3 */ =	0x20,
44	[5  ] /*                KEY_4 */ =	0x21,
45	[6  ] /*                KEY_5 */ =	0x22,
46	[7  ] /*                KEY_6 */ =	0x23,
47	[8  ] /*                KEY_7 */ =	0x24,
48	[9  ] /*                KEY_8 */ =	0x25,
49	[10 ] /*                KEY_9 */ =	0x26,
50	[11 ] /*                KEY_0 */ =	0x27,
51	[12 ] /*            KEY_MINUS */ =	0x2d,
52	[13 ] /*            KEY_EQUAL */ =	0x2e,
53	[14 ] /*        KEY_BACKSPACE */ =	0x2a,
54	[15 ] /*              KEY_TAB */ =	0x2b,
55	[16 ] /*                KEY_Q */ =	0x14,
56	[17 ] /*                KEY_W */ =	0x1a,
57	[18 ] /*                KEY_E */ =	0x08,
58	[19 ] /*                KEY_R */ =	0x15,
59	[20 ] /*                KEY_T */ =	0x17,
60	[21 ] /*                KEY_Y */ =	0x1c,
61	[22 ] /*                KEY_U */ =	0x18,
62	[23 ] /*                KEY_I */ =	0x0c,
63	[24 ] /*                KEY_O */ =	0x12,
64	[25 ] /*                KEY_P */ =	0x13,
65	[26 ] /*        KEY_LEFTBRACE */ =	0x2f,
66	[27 ] /*       KEY_RIGHTBRACE */ =	0x30,
67	[28 ] /*            KEY_ENTER */ =	0x28,
68	[29 ] /*         KEY_LEFTCTRL */ =	0xe0,
69	[30 ] /*                KEY_A */ =	0x04,
70	[31 ] /*                KEY_S */ =	0x16,
71	[32 ] /*                KEY_D */ =	0x07,
72	[33 ] /*                KEY_F */ =	0x09,
73	[34 ] /*                KEY_G */ =	0x0a,
74	[35 ] /*                KEY_H */ =	0x0b,
75	[36 ] /*                KEY_J */ =	0x0d,
76	[37 ] /*                KEY_K */ =	0x0e,
77	[38 ] /*                KEY_L */ =	0x0f,
78	[39 ] /*        KEY_SEMICOLON */ =	0x33,
79	[40 ] /*       KEY_APOSTROPHE */ =	0x34,
80	[41 ] /*            KEY_GRAVE */ =	0x35,
81	[42 ] /*        KEY_LEFTSHIFT */ =	0xe1,
82	[43 ] /*        KEY_BACKSLASH */ =	0x31,
83	[44 ] /*                KEY_Z */ =	0x1d,
84	[45 ] /*                KEY_X */ =	0x1b,
85	[46 ] /*                KEY_C */ =	0x06,
86	[47 ] /*                KEY_V */ =	0x19,
87	[48 ] /*                KEY_B */ =	0x05,
88	[49 ] /*                KEY_N */ =	0x11,
89	[50 ] /*                KEY_M */ =	0x10,
90	[51 ] /*            KEY_COMMA */ =	0x36,
91	[52 ] /*              KEY_DOT */ =	0x37,
92	[53 ] /*            KEY_SLASH */ =	0x38,
93	[54 ] /*       KEY_RIGHTSHIFT */ =	0xe5,
94	[55 ] /*       KEY_KPASTERISK */ =	0x55,
95	[56 ] /*          KEY_LEFTALT */ =	0xe2,
96	[57 ] /*            KEY_SPACE */ =	0x2c,
97	[58 ] /*         KEY_CAPSLOCK */ =	0x39,
98	[59 ] /*               KEY_F1 */ =	0x3a,
99	[60 ] /*               KEY_F2 */ =	0x3b,
100	[61 ] /*               KEY_F3 */ =	0x3c,
101	[62 ] /*               KEY_F4 */ =	0x3d,
102	[63 ] /*               KEY_F5 */ =	0x3e,
103	[64 ] /*               KEY_F6 */ =	0x3f,
104	[65 ] /*               KEY_F7 */ =	0x40,
105	[66 ] /*               KEY_F8 */ =	0x41,
106	[67 ] /*               KEY_F9 */ =	0x42,
107	[68 ] /*              KEY_F10 */ =	0x43,
108	[69 ] /*          KEY_NUMLOCK */ =	0x53,
109	[70 ] /*       KEY_SCROLLLOCK */ =	0x47,
110	[71 ] /*              KEY_KP7 */ =	0x5f,
111	[72 ] /*              KEY_KP8 */ =	0x60,
112	[73 ] /*              KEY_KP9 */ =	0x61,
113	[74 ] /*          KEY_KPMINUS */ =	0x56,
114	[75 ] /*              KEY_KP4 */ =	0x5c,
115	[76 ] /*              KEY_KP5 */ =	0x5d,
116	[77 ] /*              KEY_KP6 */ =	0x5e,
117	[78 ] /*           KEY_KPPLUS */ =	0x57,
118	[79 ] /*              KEY_KP1 */ =	0x59,
119	[80 ] /*              KEY_KP2 */ =	0x5a,
120	[81 ] /*              KEY_KP3 */ =	0x5b,
121	[82 ] /*              KEY_KP0 */ =	0x62,
122	[83 ] /*            KEY_KPDOT */ =	0x63,
123	[85 ] /*   KEY_ZENKAKUHANKAKU */ =	0x94,
124#if 0
125	[86 ] /*            KEY_102ND */ =	???
126#endif
127	[87 ] /*              KEY_F11 */ =	0x44,
128	[88 ] /*              KEY_F12 */ =	0x45,
129	[89 ] /*               KEY_RO */ =	0x87,
130	[90 ] /*         KEY_KATAKANA */ =	0x92,
131	[91 ] /*         KEY_HIRAGANA */ =	0x93,
132	[92 ] /*           KEY_HENKAN */ =	0x8a,
133	[93 ] /* KEY_KATAKANAHIRAGANA */ =	0x88,
134	[94 ] /*         KEY_MUHENKAN */ =	0x8b,
135	[95 ] /*        KEY_KPJPCOMMA */ =	0x8c,
136	[96 ] /*          KEY_KPENTER */ =	0x58,
137	[97 ] /*        KEY_RIGHTCTRL */ =	0xe4,
138	[98 ] /*          KEY_KPSLASH */ =	0x54,
139	[99 ] /*            KEY_SYSRQ */ =	0x9a,
140	[100] /*         KEY_RIGHTALT */ =	0xe6,
141#if 0
142	[101] /*         KEY_LINEFEED */ =	???
143#endif
144	[102] /*             KEY_HOME */ =	0x4a,
145	[103] /*               KEY_UP */ =	0x52,
146	[104] /*           KEY_PAGEUP */ =	0x4b,
147	[105] /*             KEY_LEFT */ =	0x50,
148	[106] /*            KEY_RIGHT */ =	0x4f,
149	[107] /*              KEY_END */ =	0x4d,
150	[108] /*             KEY_DOWN */ =	0x51,
151	[109] /*         KEY_PAGEDOWN */ =	0x4e,
152	[110] /*           KEY_INSERT */ =	0x49,
153	[111] /*           KEY_DELETE */ =	0x4c,
154#if 0
155	[112] /*            KEY_MACRO */ =	???
156#endif
157	[113] /*             KEY_MUTE */ =	0x7f,
158	[114] /*       KEY_VOLUMEDOWN */ =	0x81,
159	[115] /*         KEY_VOLUMEUP */ =	0x80,
160	[116] /*            KEY_POWER */ =	0x66,
161	[117] /*          KEY_KPEQUAL */ =	0x67,
162#if 0
163	[118] /*      KEY_KPPLUSMINUS */ =	???
164#endif
165	[119] /*            KEY_PAUSE */ =	0x48,
166#if 0
167	[120] /*            KEY_SCALE */ =	???
168#endif
169	[121] /*          KEY_KPCOMMA */ =	0x85,
170	[122] /*          KEY_HANGEUL */ =	0x90,
171	[123] /*            KEY_HANJA */ =	0x91,
172	[124] /*              KEY_YEN */ =	0x89,
173	[125] /*         KEY_LEFTMETA */ =	0xe3,
174	[126] /*        KEY_RIGHTMETA */ =	0xe7,
175#if 0
176	[127] /*          KEY_COMPOSE */ =	???
177#endif
178};
179
180uint8_t
181linux_key_to_usb(u_int code)
182{
183	if (code >= __arraycount(linux_key_to_usb_map))
184		return 0x00;	/* No Event */
185	return linux_key_to_usb_map[code];
186}
187