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 
38 static 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 
180 uint8_t
linux_key_to_usb(u_int code)181 linux_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