1 /*
2 * <adbkbd.c>
3 *
4 * Open Hack'Ware BIOS ADB keyboard support.
5 *
6 * Copyright (c) 2005 Jocelyn Mayer
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License V2
10 * as published by the Free Software Foundation
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22 #include <stdlib.h>
23 #include <stdio.h>
24 #include "bios.h"
25 #include "adb.h"
26 #include "kbd.h"
27
28 #ifdef DEBUG_ADB
29 #define ADB_DPRINTF(fmt, args...) \
30 do { dprintf("ADB - %s: " fmt, __func__ , ##args); } while (0)
31 #else
32 #define ADB_DPRINTF(fmt, args...) do { } while (0)
33 #endif
34
35 /* ADB US keyboard translation map
36 * XXX: for now, only shift modifier is defined
37 */
38 static keymap_t ADB_kbd_us[] = {
39 /* 0x00 */
40 { KBD_SH_CAPS, { 0x61, 0x41, -1, -1, -1, -1, -1, -1,
41 -1, -1, -1, -1, -1, -1, -1, -1,
42 -1, -1, -1, -1, -1, -1, -1, -1,
43 -1, -1, -1, -1, -1, -1, -1, -1, }, },
44 { KBD_SH_CAPS, { 0x73, 0x53, -1, -1, -1, -1, -1, -1,
45 -1, -1, -1, -1, -1, -1, -1, -1,
46 -1, -1, -1, -1, -1, -1, -1, -1,
47 -1, -1, -1, -1, -1, -1, -1, -1, }, },
48 { KBD_SH_CAPS, { 0x64, 0x44, -1, -1, -1, -1, -1, -1,
49 -1, -1, -1, -1, -1, -1, -1, -1,
50 -1, -1, -1, -1, -1, -1, -1, -1,
51 -1, -1, -1, -1, -1, -1, -1, -1, }, },
52 { KBD_SH_CAPS, { 0x66, 0x46, -1, -1, -1, -1, -1, -1,
53 -1, -1, -1, -1, -1, -1, -1, -1,
54 -1, -1, -1, -1, -1, -1, -1, -1,
55 -1, -1, -1, -1, -1, -1, -1, -1, }, },
56 { KBD_SH_CAPS, { 0x68, 0x48, -1, -1, -1, -1, -1, -1,
57 -1, -1, -1, -1, -1, -1, -1, -1,
58 -1, -1, -1, -1, -1, -1, -1, -1,
59 -1, -1, -1, -1, -1, -1, -1, -1, }, },
60 { KBD_SH_CAPS, { 0x67, 0x47, -1, -1, -1, -1, -1, -1,
61 -1, -1, -1, -1, -1, -1, -1, -1,
62 -1, -1, -1, -1, -1, -1, -1, -1,
63 -1, -1, -1, -1, -1, -1, -1, -1, }, },
64 { KBD_SH_CAPS, { 0x7A, 0x5A, -1, -1, -1, -1, -1, -1,
65 -1, -1, -1, -1, -1, -1, -1, -1,
66 -1, -1, -1, -1, -1, -1, -1, -1,
67 -1, -1, -1, -1, -1, -1, -1, -1, }, },
68 { KBD_SH_CAPS, { 0x78, 0x58, -1, -1, -1, -1, -1, -1,
69 -1, -1, -1, -1, -1, -1, -1, -1,
70 -1, -1, -1, -1, -1, -1, -1, -1,
71 -1, -1, -1, -1, -1, -1, -1, -1, }, },
72 /* 0x08 */
73 { KBD_SH_CAPS, { 0x63, 0x43, -1, -1, -1, -1, -1, -1,
74 -1, -1, -1, -1, -1, -1, -1, -1,
75 -1, -1, -1, -1, -1, -1, -1, -1,
76 -1, -1, -1, -1, -1, -1, -1, -1, }, },
77 { KBD_SH_CAPS, { 0x76, 0x56, -1, -1, -1, -1, -1, -1,
78 -1, -1, -1, -1, -1, -1, -1, -1,
79 -1, -1, -1, -1, -1, -1, -1, -1,
80 -1, -1, -1, -1, -1, -1, -1, -1, }, },
81 { KBD_SH_CAPS, { 0x60, 0x40, -1, -1, -1, -1, -1, -1, /* ? */
82 -1, -1, -1, -1, -1, -1, -1, -1,
83 -1, -1, -1, -1, -1, -1, -1, -1,
84 -1, -1, -1, -1, -1, -1, -1, -1, }, },
85 { KBD_SH_CAPS, { 0x62, 0x42, -1, -1, -1, -1, -1, -1,
86 -1, -1, -1, -1, -1, -1, -1, -1,
87 -1, -1, -1, -1, -1, -1, -1, -1,
88 -1, -1, -1, -1, -1, -1, -1, -1, }, },
89 { KBD_SH_CAPS, { 0x71, 0x51, -1, -1, -1, -1, -1, -1,
90 -1, -1, -1, -1, -1, -1, -1, -1,
91 -1, -1, -1, -1, -1, -1, -1, -1,
92 -1, -1, -1, -1, -1, -1, -1, -1, }, },
93 { KBD_SH_CAPS, { 0x77, 0x57, -1, -1, -1, -1, -1, -1,
94 -1, -1, -1, -1, -1, -1, -1, -1,
95 -1, -1, -1, -1, -1, -1, -1, -1,
96 -1, -1, -1, -1, -1, -1, -1, -1, }, },
97 { KBD_SH_CAPS, { 0x65, 0x45, -1, -1, -1, -1, -1, -1,
98 -1, -1, -1, -1, -1, -1, -1, -1,
99 -1, -1, -1, -1, -1, -1, -1, -1,
100 -1, -1, -1, -1, -1, -1, -1, -1, }, },
101 { KBD_SH_CAPS, { 0x72, 0x52, -1, -1, -1, -1, -1, -1,
102 -1, -1, -1, -1, -1, -1, -1, -1,
103 -1, -1, -1, -1, -1, -1, -1, -1,
104 -1, -1, -1, -1, -1, -1, -1, -1, }, },
105 /* 0x10 */
106 { KBD_SH_CAPS, { 0x79, 0x59, -1, -1, -1, -1, -1, -1,
107 -1, -1, -1, -1, -1, -1, -1, -1,
108 -1, -1, -1, -1, -1, -1, -1, -1,
109 -1, -1, -1, -1, -1, -1, -1, -1, }, },
110 { KBD_SH_CAPS, { 0x74, 0x54, -1, -1, -1, -1, -1, -1,
111 -1, -1, -1, -1, -1, -1, -1, -1,
112 -1, -1, -1, -1, -1, -1, -1, -1,
113 -1, -1, -1, -1, -1, -1, -1, -1, }, },
114 { KBD_SH_CAPS, { 0x31, 0x21, -1, -1, -1, -1, -1, -1,
115 -1, -1, -1, -1, -1, -1, -1, -1,
116 -1, -1, -1, -1, -1, -1, -1, -1,
117 -1, -1, -1, -1, -1, -1, -1, -1, }, },
118 { KBD_SH_CAPS, { 0x32, 0x40, -1, -1, -1, -1, -1, -1,
119 -1, -1, -1, -1, -1, -1, -1, -1,
120 -1, -1, -1, -1, -1, -1, -1, -1,
121 -1, -1, -1, -1, -1, -1, -1, -1, }, },
122 { KBD_SH_CAPS, { 0x33, 0x23, -1, -1, -1, -1, -1, -1,
123 -1, -1, -1, -1, -1, -1, -1, -1,
124 -1, -1, -1, -1, -1, -1, -1, -1,
125 -1, -1, -1, -1, -1, -1, -1, -1, }, },
126 { KBD_SH_CAPS, { 0x34, 0x24, -1, -1, -1, -1, -1, -1,
127 -1, -1, -1, -1, -1, -1, -1, -1,
128 -1, -1, -1, -1, -1, -1, -1, -1,
129 -1, -1, -1, -1, -1, -1, -1, -1, }, },
130 { KBD_SH_CAPS, { 0x36, 0x5E, -1, -1, -1, -1, -1, -1,
131 -1, -1, -1, -1, -1, -1, -1, -1,
132 -1, -1, -1, -1, -1, -1, -1, -1,
133 -1, -1, -1, -1, -1, -1, -1, -1, }, },
134 { KBD_SH_CAPS, { 0x35, 0x25, -1, -1, -1, -1, -1, -1,
135 -1, -1, -1, -1, -1, -1, -1, -1,
136 -1, -1, -1, -1, -1, -1, -1, -1,
137 -1, -1, -1, -1, -1, -1, -1, -1, }, },
138 /* 0x18 */
139 { KBD_SH_CAPS, { 0x3D, 0x2B, -1, -1, -1, -1, -1, -1,
140 -1, -1, -1, -1, -1, -1, -1, -1,
141 -1, -1, -1, -1, -1, -1, -1, -1,
142 -1, -1, -1, -1, -1, -1, -1, -1, }, },
143 { KBD_SH_CAPS, { 0x39, 0x28, -1, -1, -1, -1, -1, -1,
144 -1, -1, -1, -1, -1, -1, -1, -1,
145 -1, -1, -1, -1, -1, -1, -1, -1,
146 -1, -1, -1, -1, -1, -1, -1, -1, }, },
147 { KBD_SH_CAPS, { 0x37, 0x26, -1, -1, -1, -1, -1, -1,
148 -1, -1, -1, -1, -1, -1, -1, -1,
149 -1, -1, -1, -1, -1, -1, -1, -1,
150 -1, -1, -1, -1, -1, -1, -1, -1, }, },
151 { KBD_SH_CAPS, { 0x2D, 0x5F, -1, -1, -1, -1, -1, -1,
152 -1, -1, -1, -1, -1, -1, -1, -1,
153 -1, -1, -1, -1, -1, -1, -1, -1,
154 -1, -1, -1, -1, -1, -1, -1, -1, }, },
155 { KBD_SH_CAPS, { 0x38, 0x2A, -1, -1, -1, -1, -1, -1,
156 -1, -1, -1, -1, -1, -1, -1, -1,
157 -1, -1, -1, -1, -1, -1, -1, -1,
158 -1, -1, -1, -1, -1, -1, -1, -1, }, },
159 { KBD_SH_CAPS, { 0x30, 0x29, -1, -1, -1, -1, -1, -1,
160 -1, -1, -1, -1, -1, -1, -1, -1,
161 -1, -1, -1, -1, -1, -1, -1, -1,
162 -1, -1, -1, -1, -1, -1, -1, -1, }, },
163 { KBD_SH_CAPS, { 0x5D, 0x7D, -1, -1, -1, -1, -1, -1,
164 -1, -1, -1, -1, -1, -1, -1, -1,
165 -1, -1, -1, -1, -1, -1, -1, -1,
166 -1, -1, -1, -1, -1, -1, -1, -1, }, },
167 { KBD_SH_CAPS, { 0x6F, 0x4F, -1, -1, -1, -1, -1, -1,
168 -1, -1, -1, -1, -1, -1, -1, -1,
169 -1, -1, -1, -1, -1, -1, -1, -1,
170 -1, -1, -1, -1, -1, -1, -1, -1, }, },
171 /* 0x20 */
172 { KBD_SH_CAPS, { 0x75, 0x55, -1, -1, -1, -1, -1, -1,
173 -1, -1, -1, -1, -1, -1, -1, -1,
174 -1, -1, -1, -1, -1, -1, -1, -1,
175 -1, -1, -1, -1, -1, -1, -1, -1, }, },
176 { KBD_SH_CAPS, { 0x5B, 0x7B, -1, -1, -1, -1, -1, -1,
177 -1, -1, -1, -1, -1, -1, -1, -1,
178 -1, -1, -1, -1, -1, -1, -1, -1,
179 -1, -1, -1, -1, -1, -1, -1, -1, }, },
180 { KBD_SH_CAPS, { 0x69, 0x49, -1, -1, -1, -1, -1, -1,
181 -1, -1, -1, -1, -1, -1, -1, -1,
182 -1, -1, -1, -1, -1, -1, -1, -1,
183 -1, -1, -1, -1, -1, -1, -1, -1, }, },
184 { KBD_SH_CAPS, { 0x70, 0x50, -1, -1, -1, -1, -1, -1,
185 -1, -1, -1, -1, -1, -1, -1, -1,
186 -1, -1, -1, -1, -1, -1, -1, -1,
187 -1, -1, -1, -1, -1, -1, -1, -1, }, },
188 { KBD_MOD_MAP(0x0D), },
189 { KBD_SH_CAPS, { 0x6C, 0x4C, -1, -1, -1, -1, -1, -1,
190 -1, -1, -1, -1, -1, -1, -1, -1,
191 -1, -1, -1, -1, -1, -1, -1, -1,
192 -1, -1, -1, -1, -1, -1, -1, -1, }, },
193 { KBD_SH_CAPS, { 0x6A, 0x4A, -1, -1, -1, -1, -1, -1,
194 -1, -1, -1, -1, -1, -1, -1, -1,
195 -1, -1, -1, -1, -1, -1, -1, -1,
196 -1, -1, -1, -1, -1, -1, -1, -1, }, },
197 { KBD_SH_CAPS, { 0x27, 0x22, -1, -1, -1, -1, -1, -1,
198 -1, -1, -1, -1, -1, -1, -1, -1,
199 -1, -1, -1, -1, -1, -1, -1, -1,
200 -1, -1, -1, -1, -1, -1, -1, -1, }, },
201 /* 0x28 */
202 { KBD_SH_CAPS, { 0x6B, 0x4B, -1, -1, -1, -1, -1, -1,
203 -1, -1, -1, -1, -1, -1, -1, -1,
204 -1, -1, -1, -1, -1, -1, -1, -1,
205 -1, -1, -1, -1, -1, -1, -1, -1, }, },
206 { KBD_SH_CAPS, { 0x3B, 0x3A, -1, -1, -1, -1, -1, -1,
207 -1, -1, -1, -1, -1, -1, -1, -1,
208 -1, -1, -1, -1, -1, -1, -1, -1,
209 -1, -1, -1, -1, -1, -1, -1, -1, }, },
210 { KBD_SH_CAPS, { 0x5C, 0x7C, -1, -1, -1, -1, -1, -1,
211 -1, -1, -1, -1, -1, -1, -1, -1,
212 -1, -1, -1, -1, -1, -1, -1, -1,
213 -1, -1, -1, -1, -1, -1, -1, -1, }, },
214 { KBD_SH_CAPS, { 0x2C, 0x3C, -1, -1, -1, -1, -1, -1,
215 -1, -1, -1, -1, -1, -1, -1, -1,
216 -1, -1, -1, -1, -1, -1, -1, -1,
217 -1, -1, -1, -1, -1, -1, -1, -1, }, },
218 { KBD_SH_CAPS, { 0x2F, 0x3F, -1, -1, -1, -1, -1, -1,
219 -1, -1, -1, -1, -1, -1, -1, -1,
220 -1, -1, -1, -1, -1, -1, -1, -1,
221 -1, -1, -1, -1, -1, -1, -1, -1, }, },
222 { KBD_SH_CAPS, { 0x6E, 0x4E, -1, -1, -1, -1, -1, -1,
223 -1, -1, -1, -1, -1, -1, -1, -1,
224 -1, -1, -1, -1, -1, -1, -1, -1,
225 -1, -1, -1, -1, -1, -1, -1, -1, }, },
226 { KBD_SH_CAPS, { 0x6D, 0x4D, -1, -1, -1, -1, -1, -1,
227 -1, -1, -1, -1, -1, -1, -1, -1,
228 -1, -1, -1, -1, -1, -1, -1, -1,
229 -1, -1, -1, -1, -1, -1, -1, -1, }, },
230 { KBD_SH_CAPS, { 0x2E, 0x3E, -1, -1, -1, -1, -1, -1,
231 -1, -1, -1, -1, -1, -1, -1, -1,
232 -1, -1, -1, -1, -1, -1, -1, -1,
233 -1, -1, -1, -1, -1, -1, -1, -1, }, },
234 /* 0x30 : tab */
235 { KBD_MOD_MAP(0x09), },
236 /* 0x31 : space */
237 { KBD_MOD_MAP(0x20), },
238 /* 0x32 : '<' '>' */
239 { KBD_SH_CAPS, { 0x3C, 0x3E, -1, -1, -1, -1, -1, -1, /* ? */
240 -1, -1, -1, -1, -1, -1, -1, -1,
241 -1, -1, -1, -1, -1, -1, -1, -1,
242 -1, -1, -1, -1, -1, -1, -1, -1, }, },
243 /* 0x33 : backspace */
244 { KBD_MOD_MAP(0x08), },
245 { KBD_MAP_NONE, },
246 /* 0x35 : ESC */
247 { KBD_MOD_MAP(0x1B), },
248 /* 0x36 : control */
249 { KBD_MOD_MAP_LCTRL, },
250 /* 0x37 : command */
251 { KBD_MOD_MAP_LCMD, },
252 /* 0x38 : left shift */
253 { KBD_MOD_MAP_LSHIFT, },
254 /* 0x39 : caps-lock */
255 { KBD_MOD_MAP_CAPS, },
256 /* 0x3A : option */
257 { KBD_MOD_MAP_LOPT, },
258 /* 0x3B : left */
259 { KBD_MAP_NONE, },
260 /* 0x3C : right */
261 { KBD_MAP_NONE, },
262 /* 0x3D : down */
263 { KBD_MAP_NONE, },
264 /* 0x3E : up */
265 { KBD_MAP_NONE, },
266 { KBD_MAP_NONE, },
267 /* 0x40 */
268 { KBD_MAP_NONE, },
269 { KBD_SH_NUML, { 0x7F, 0x2E, -1, -1, -1, -1, -1, -1,
270 -1, -1, -1, -1, -1, -1, -1, -1,
271 -1, -1, -1, -1, -1, -1, -1, -1,
272 -1, -1, -1, -1, -1, -1, -1, -1, }, },
273 { KBD_MAP_NONE, },
274 { KBD_SH_NONE, { 0x2A, 0x2A, -1, -1, -1, -1, -1, -1,
275 -1, -1, -1, -1, -1, -1, -1, -1,
276 -1, -1, -1, -1, -1, -1, -1, -1,
277 -1, -1, -1, -1, -1, -1, -1, -1, }, },
278 { KBD_MAP_NONE, },
279 { KBD_SH_NONE, { 0x2B, 0x2B, -1, -1, -1, -1, -1, -1,
280 -1, -1, -1, -1, -1, -1, -1, -1,
281 -1, -1, -1, -1, -1, -1, -1, -1,
282 -1, -1, -1, -1, -1, -1, -1, -1, }, },
283 { KBD_MAP_NONE, },
284 { KBD_MOD_MAP(0x7F), },
285 /* 0x48 */
286 { KBD_MAP_NONE, },
287 { KBD_MAP_NONE, },
288 { KBD_MAP_NONE, },
289 { KBD_SH_NONE, { 0x2F, 0x2F, -1, -1, -1, -1, -1, -1,
290 -1, -1, -1, -1, -1, -1, -1, -1,
291 -1, -1, -1, -1, -1, -1, -1, -1,
292 -1, -1, -1, -1, -1, -1, -1, -1, }, },
293 { KBD_MOD_MAP(0x0D), },
294 { KBD_MAP_NONE, },
295 { KBD_SH_NONE, { 0x2D, 0x2D, -1, -1, -1, -1, -1, -1,
296 -1, -1, -1, -1, -1, -1, -1, -1,
297 -1, -1, -1, -1, -1, -1, -1, -1,
298 -1, -1, -1, -1, -1, -1, -1, -1, }, },
299 { KBD_MAP_NONE, },
300 /* 0x50 */
301 { KBD_MAP_NONE, },
302 { KBD_SH_NONE, { 0x3D, 0x3D, -1, -1, -1, -1, -1, -1,
303 -1, -1, -1, -1, -1, -1, -1, -1,
304 -1, -1, -1, -1, -1, -1, -1, -1,
305 -1, -1, -1, -1, -1, -1, -1, -1, }, },
306 { KBD_SH_NUML, { -1, 0x30, -1, -1, -1, -1, -1, -1,
307 -1, -1, -1, -1, -1, -1, -1, -1,
308 -1, -1, -1, -1, -1, -1, -1, -1,
309 -1, -1, -1, -1, -1, -1, -1, -1, }, },
310 { KBD_SH_NUML, { -1, 0x31, -1, -1, -1, -1, -1, -1,
311 -1, -1, -1, -1, -1, -1, -1, -1,
312 -1, -1, -1, -1, -1, -1, -1, -1,
313 -1, -1, -1, -1, -1, -1, -1, -1, }, },
314 { KBD_SH_NUML, { -1, 0x32, -1, -1, -1, -1, -1, -1,
315 -1, -1, -1, -1, -1, -1, -1, -1,
316 -1, -1, -1, -1, -1, -1, -1, -1,
317 -1, -1, -1, -1, -1, -1, -1, -1, }, },
318 { KBD_SH_NUML, { -1, 0x33, -1, -1, -1, -1, -1, -1,
319 -1, -1, -1, -1, -1, -1, -1, -1,
320 -1, -1, -1, -1, -1, -1, -1, -1,
321 -1, -1, -1, -1, -1, -1, -1, -1, }, },
322 { KBD_SH_NUML, { -1, 0x34, -1, -1, -1, -1, -1, -1,
323 -1, -1, -1, -1, -1, -1, -1, -1,
324 -1, -1, -1, -1, -1, -1, -1, -1,
325 -1, -1, -1, -1, -1, -1, -1, -1, }, },
326 { KBD_SH_NUML, { -1, 0x35, -1, -1, -1, -1, -1, -1,
327 -1, -1, -1, -1, -1, -1, -1, -1,
328 -1, -1, -1, -1, -1, -1, -1, -1,
329 -1, -1, -1, -1, -1, -1, -1, -1, }, },
330 /* 0x58 */
331 { KBD_SH_NUML, { -1, 0x36, -1, -1, -1, -1, -1, -1,
332 -1, -1, -1, -1, -1, -1, -1, -1,
333 -1, -1, -1, -1, -1, -1, -1, -1,
334 -1, -1, -1, -1, -1, -1, -1, -1, }, },
335 { KBD_SH_NUML, { -1, 0x37, -1, -1, -1, -1, -1, -1,
336 -1, -1, -1, -1, -1, -1, -1, -1,
337 -1, -1, -1, -1, -1, -1, -1, -1,
338 -1, -1, -1, -1, -1, -1, -1, -1, }, },
339 { KBD_MAP_NONE, },
340 { KBD_SH_NUML, { -1, 0x38, -1, -1, -1, -1, -1, -1,
341 -1, -1, -1, -1, -1, -1, -1, -1,
342 -1, -1, -1, -1, -1, -1, -1, -1,
343 -1, -1, -1, -1, -1, -1, -1, -1, }, },
344 { KBD_SH_NUML, { -1, 0x39, -1, -1, -1, -1, -1, -1,
345 -1, -1, -1, -1, -1, -1, -1, -1,
346 -1, -1, -1, -1, -1, -1, -1, -1,
347 -1, -1, -1, -1, -1, -1, -1, -1, }, },
348 { KBD_MAP_NONE, },
349 { KBD_MOD_MAP(0x2F), },
350 { KBD_MAP_NONE, },
351 /* 0x60 : F5 */
352 { KBD_MAP_NONE, },
353 /* 0x61 : F6 */
354 { KBD_MAP_NONE, },
355 /* 0x62 : F7 */
356 { KBD_MAP_NONE, },
357 /* 0x63 : F3 */
358 { KBD_MAP_NONE, },
359 /* 0x64 : F8 */
360 { KBD_MAP_NONE, },
361 /* 0x65 : F9 */
362 { KBD_MAP_NONE, },
363 { KBD_MAP_NONE, },
364 /* 0x67 : F11 */
365 { KBD_MAP_NONE, },
366 /* 0x68 */
367 { KBD_MAP_NONE, },
368 /* 0x69 : F13 */
369 { KBD_MAP_NONE, },
370 { KBD_MAP_NONE, },
371 /* 0x6B : F14 */
372 { KBD_MAP_NONE, },
373 { KBD_MAP_NONE, },
374 /* 0x6D : F10 */
375 { KBD_MAP_NONE, },
376 { KBD_MAP_NONE, },
377 /* 0x6F : F12 */
378 { KBD_MAP_NONE, },
379 /* 0x70 */
380 { KBD_MAP_NONE, },
381 /* 0x71 : F15 */
382 { KBD_MAP_NONE, },
383 /* 0x72 : help */
384 { KBD_MAP_NONE, },
385 /* 0x73 : home */
386 { KBD_MAP_NONE, },
387 /* 0x74 : page up */
388 { KBD_MAP_NONE, },
389 /* 0x75 : del */
390 { KBD_MAP_NONE, },
391 /* 0x76 : F4 */
392 { KBD_MAP_NONE, },
393 /* 0x77 : end */
394 { KBD_MAP_NONE, },
395 /* 0x78 : F2 */
396 { KBD_MAP_NONE, },
397 /* 0x79 : page down */
398 { KBD_MAP_NONE, },
399 /* 0x7A : F1 */
400 { KBD_MAP_NONE, },
401 /* 0x7B : right shift */
402 { KBD_MOD_MAP_RSHIFT, },
403 /* 0x7C : right option */
404 { KBD_MOD_MAP_ROPT, },
405 /* 0x7D : right control */
406 { KBD_MOD_MAP_RCTRL, },
407 { KBD_MAP_NONE, },
408 /* 0x7F : power */
409 { KBD_MAP_NONE, },
410 };
411
412 typedef struct adb_kbd_t adb_kbd_t;
413 struct adb_kbd_t {
414 kbd_t kbd;
415 int next_key;
416 };
417
adb_kbd_open(unused void * private)418 static int adb_kbd_open (unused void *private)
419 {
420 return 0;
421 }
422
adb_kbd_close(unused void * private)423 static int adb_kbd_close (unused void *private)
424 {
425 return 0;
426 }
427
adb_kbd_read(void * private)428 static int adb_kbd_read (void *private)
429 {
430 uint8_t buffer[ADB_BUF_SIZE];
431 adb_dev_t *dev = private;
432 adb_kbd_t *kbd;
433 int key;
434 int ret;
435
436 kbd = (void *)dev->state;
437 ADB_DPRINTF("enter\n");
438 /* Get saved state */
439 ret = -1;
440 for (key = -1; key == -1; ) {
441 if (kbd->next_key != -1) {
442 key = kbd->next_key;
443 kbd->next_key = -1;
444 } else {
445 if (adb_reg_get(dev, 0, buffer) != 2) {
446 goto out;
447 }
448 kbd->next_key = buffer[1] == 0xFF ? -1 : buffer[1];
449 key = buffer[0];
450 }
451 ret = kbd_translate_key(&kbd->kbd, key & 0x7F, key >> 7);
452 ADB_DPRINTF("Translated %d (%02x) into %d (%02x)\n",
453 key, key, ret, ret);
454 }
455 out:
456
457 return ret;
458 }
459
460 static cops_t adb_kbd_ops = {
461 &adb_kbd_open,
462 &adb_kbd_close,
463 &adb_kbd_read,
464 NULL,
465 };
466
adb_kbd_new(void * private)467 void *adb_kbd_new (void *private)
468 {
469 adb_kbd_t *kbd;
470 adb_dev_t *dev = private;
471
472 kbd = kbd_new(sizeof(adb_kbd_t));
473 if (kbd != NULL) {
474 kbd_set_keymap(&kbd->kbd,
475 sizeof(ADB_kbd_us) / sizeof(keymap_t), ADB_kbd_us);
476 kbd->next_key = -1;
477 dev->state = (int32_t)kbd;
478 chardev_register(CHARDEV_KBD, &adb_kbd_ops, private);
479 }
480
481 return kbd;
482 }
483