3 * Open Hack'Ware BIOS ADB keyboard support, ported to OpenBIOS
5 * Copyright (c) 2005 Jocelyn Mayer
6 * Copyright (c) 2005 Stefan Reinauer
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
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.
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., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
23 #include "libopenbios/bindings.h"
24 #include "libc/byteorder.h"
25 #include "libc/vsprintf.h"
31 DECLARE_UNNAMED_NODE( keyboard, INSTALL_OPEN, sizeof(int));
34 keyboard_open(int *idx)
40 keyboard_close(int *idx)
44 static void keyboard_read(void);
45 static void keyboard_getkeymap(void);
47 NODE_METHODS( keyboard ) = {
48 { "open", keyboard_open },
49 { "close", keyboard_close },
50 { "read", keyboard_read },
51 { "get-key-map", keyboard_getkeymap },
54 /* VT100 escape sequences */
57 KEY_UP = 0, KEY_DOWN, KEY_RIGHT, KEY_LEFT, KEY_PAGE_UP, KEY_PAGE_DOWN,
58 KEY_DELETE, KEY_HOME, KEY_END, KEY_HELP,
59 KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8,
60 KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16
63 #define ADB_MAX_SEQUENCE_LEN 16
65 static const char *ADB_sequences[] = {
70 [KEY_PAGE_UP] = "~5[
\e",
71 [KEY_PAGE_DOWN] = "~6[
\e",
72 [KEY_DELETE] = "~3[
\e",
94 /* ADB US keyboard translation map */
96 static const keymap_t ADB_kbd_us[] = {
98 { KBD_SH_CAPS, { 0x61, 0x41, 0x01, -1, -1, -1, -1, -1,
99 -1, -1, -1, -1, -1, -1, -1, -1,
100 -1, -1, -1, -1, -1, -1, -1, -1,
101 -1, -1, -1, -1, -1, -1, -1, -1, }, },
102 { KBD_SH_CAPS, { 0x73, 0x53, 0x13, -1, -1, -1, -1, -1,
103 -1, -1, -1, -1, -1, -1, -1, -1,
104 -1, -1, -1, -1, -1, -1, -1, -1,
105 -1, -1, -1, -1, -1, -1, -1, -1, }, },
106 { KBD_SH_CAPS, { 0x64, 0x44, 0x04, -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, { 0x66, 0x46, 0x06, -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, { 0x68, 0x48, 0x08, -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, { 0x67, 0x47, 0x07, -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, { 0x7A, 0x5A, 0x1A, -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, { 0x78, 0x58, 0x18, -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, }, },
131 { KBD_SH_CAPS, { 0x63, 0x43, 0x03, -1, -1, -1, -1, -1,
132 -1, -1, -1, -1, -1, -1, -1, -1,
133 -1, -1, -1, -1, -1, -1, -1, -1,
134 -1, -1, -1, -1, -1, -1, -1, -1, }, },
135 { KBD_SH_CAPS, { 0x76, 0x56, 0x16, -1, -1, -1, -1, -1,
136 -1, -1, -1, -1, -1, -1, -1, -1,
137 -1, -1, -1, -1, -1, -1, -1, -1,
138 -1, -1, -1, -1, -1, -1, -1, -1, }, },
139 { KBD_SH_CAPS, { 0x60, 0x40, 0x00, -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, { 0x62, 0x42, 0x02, -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, { 0x71, 0x51, 0x11, -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, { 0x77, 0x57, 0x17, -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, { 0x65, 0x45, 0x05, -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, { 0x72, 0x52, 0x12, -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, }, },
164 { KBD_SH_CAPS, { 0x79, 0x59, 0x19, -1, -1, -1, -1, -1,
165 -1, -1, -1, -1, -1, -1, -1, -1,
166 -1, -1, -1, -1, -1, -1, -1, -1,
167 -1, -1, -1, -1, -1, -1, -1, -1, }, },
168 { KBD_SH_CAPS, { 0x74, 0x54, 0x14, -1, -1, -1, -1, -1,
169 -1, -1, -1, -1, -1, -1, -1, -1,
170 -1, -1, -1, -1, -1, -1, -1, -1,
171 -1, -1, -1, -1, -1, -1, -1, -1, }, },
172 { KBD_SH_CAPS, { 0x31, 0x21, -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, { 0x32, 0x40, 0x00, -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, { 0x33, 0x23, -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, { 0x34, 0x24, -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_SH_CAPS, { 0x36, 0x5E, 0x1E, -1, -1, -1, -1, -1,
189 -1, -1, -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 { KBD_SH_CAPS, { 0x35, 0x25, -1, -1, -1, -1, -1, -1,
193 -1, -1, -1, -1, -1, -1, -1, -1,
194 -1, -1, -1, -1, -1, -1, -1, -1,
195 -1, -1, -1, -1, -1, -1, -1, -1, }, },
197 { KBD_SH_CAPS, { 0x3D, 0x2B, -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 { KBD_SH_CAPS, { 0x39, 0x28, -1, -1, -1, -1, -1, -1,
202 -1, -1, -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 { KBD_SH_CAPS, { 0x37, 0x26, -1, -1, -1, -1, -1, -1,
206 -1, -1, -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 { KBD_SH_CAPS, { 0x2D, 0x5F, 0x1F, -1, -1, -1, -1, -1,
210 -1, -1, -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 { KBD_SH_CAPS, { 0x38, 0x2A, -1, -1, -1, -1, -1, -1,
214 -1, -1, -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 { KBD_SH_CAPS, { 0x30, 0x29, -1, -1, -1, -1, -1, -1,
218 -1, -1, -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 { KBD_SH_CAPS, { 0x5D, 0x7D, -1, -1, -1, -1, -1, -1,
222 -1, -1, -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 { KBD_SH_CAPS, { 0x6F, 0x4F, 0x0F, -1, -1, -1, -1, -1,
226 -1, -1, -1, -1, -1, -1, -1, -1,
227 -1, -1, -1, -1, -1, -1, -1, -1,
228 -1, -1, -1, -1, -1, -1, -1, -1, }, },
230 { KBD_SH_CAPS, { 0x75, 0x55, 0x15, -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 { KBD_SH_CAPS, { 0x5B, 0x7B, -1, -1, -1, -1, -1, -1,
235 -1, -1, -1, -1, -1, -1, -1, -1,
236 -1, -1, -1, -1, -1, -1, -1, -1,
237 -1, -1, -1, -1, -1, -1, -1, -1, }, },
238 { KBD_SH_CAPS, { 0x69, 0x49, 0x09, -1, -1, -1, -1, -1,
239 -1, -1, -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 { KBD_SH_CAPS, { 0x70, 0x50, 0x10, -1, -1, -1, -1, -1,
243 -1, -1, -1, -1, -1, -1, -1, -1,
244 -1, -1, -1, -1, -1, -1, -1, -1,
245 -1, -1, -1, -1, -1, -1, -1, -1, }, },
246 { KBD_MOD_MAP(0x0D), },
247 { KBD_SH_CAPS, { 0x6C, 0x4C, 0x0C, -1, -1, -1, -1, -1,
248 -1, -1, -1, -1, -1, -1, -1, -1,
249 -1, -1, -1, -1, -1, -1, -1, -1,
250 -1, -1, -1, -1, -1, -1, -1, -1, }, },
251 { KBD_SH_CAPS, { 0x6A, 0x4A, 0x0A, -1, -1, -1, -1, -1,
252 -1, -1, -1, -1, -1, -1, -1, -1,
253 -1, -1, -1, -1, -1, -1, -1, -1,
254 -1, -1, -1, -1, -1, -1, -1, -1, }, },
255 { KBD_SH_CAPS, { 0x27, 0x22, -1, -1, -1, -1, -1, -1,
256 -1, -1, -1, -1, -1, -1, -1, -1,
257 -1, -1, -1, -1, -1, -1, -1, -1,
258 -1, -1, -1, -1, -1, -1, -1, -1, }, },
260 { KBD_SH_CAPS, { 0x6B, 0x4B, 0x0B, -1, -1, -1, -1, -1,
261 -1, -1, -1, -1, -1, -1, -1, -1,
262 -1, -1, -1, -1, -1, -1, -1, -1,
263 -1, -1, -1, -1, -1, -1, -1, -1, }, },
264 { KBD_SH_CAPS, { 0x3B, 0x3A, -1, -1, -1, -1, -1, -1,
265 -1, -1, -1, -1, -1, -1, -1, -1,
266 -1, -1, -1, -1, -1, -1, -1, -1,
267 -1, -1, -1, -1, -1, -1, -1, -1, }, },
268 { KBD_SH_CAPS, { 0x5C, 0x7C, -1, -1, -1, -1, -1, -1,
269 -1, -1, -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 { KBD_SH_CAPS, { 0x2C, 0x3C, -1, -1, -1, -1, -1, -1,
273 -1, -1, -1, -1, -1, -1, -1, -1,
274 -1, -1, -1, -1, -1, -1, -1, -1,
275 -1, -1, -1, -1, -1, -1, -1, -1, }, },
276 { KBD_SH_CAPS, { 0x2F, 0x3F, -1, -1, -1, -1, -1, -1,
277 -1, -1, -1, -1, -1, -1, -1, -1,
278 -1, -1, -1, -1, -1, -1, -1, -1,
279 -1, -1, -1, -1, -1, -1, -1, -1, }, },
280 { KBD_SH_CAPS, { 0x6E, 0x4E, 0x0E, -1, -1, -1, -1, -1,
281 -1, -1, -1, -1, -1, -1, -1, -1,
282 -1, -1, -1, -1, -1, -1, -1, -1,
283 -1, -1, -1, -1, -1, -1, -1, -1, }, },
284 { KBD_SH_CAPS, { 0x6D, 0x4D, 0x0D, -1, -1, -1, -1, -1,
285 -1, -1, -1, -1, -1, -1, -1, -1,
286 -1, -1, -1, -1, -1, -1, -1, -1,
287 -1, -1, -1, -1, -1, -1, -1, -1, }, },
288 { KBD_SH_CAPS, { 0x2E, 0x3E, -1, -1, -1, -1, -1, -1,
289 -1, -1, -1, -1, -1, -1, -1, -1,
290 -1, -1, -1, -1, -1, -1, -1, -1,
291 -1, -1, -1, -1, -1, -1, -1, -1, }, },
293 { KBD_MOD_MAP(0x09), },
295 { KBD_MOD_MAP(0x20), },
297 { KBD_SH_CAPS, { 0x3C, 0x3E, -1, -1, -1, -1, -1, -1, /* ? */
298 -1, -1, -1, -1, -1, -1, -1, -1,
299 -1, -1, -1, -1, -1, -1, -1, -1,
300 -1, -1, -1, -1, -1, -1, -1, -1, }, },
301 /* 0x33 : backspace */
302 { KBD_MOD_MAP(0x08), },
305 { KBD_MOD_MAP(0x1B), },
307 { KBD_MOD_MAP_LCTRL, },
309 { KBD_MOD_MAP_LCMD, },
310 /* 0x38 : left shift */
311 { KBD_MOD_MAP_LSHIFT, },
312 /* 0x39 : caps-lock */
313 { KBD_MOD_MAP_CAPS, },
315 { KBD_MOD_MAP_LOPT, },
317 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_LEFT)), },
319 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_RIGHT)), },
321 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_DOWN)), },
323 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_UP)), },
327 { KBD_SH_NUML, { 0x7F, 0x2E, -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 -1, -1, -1, -1, -1, -1, -1, -1, }, },
332 { KBD_SH_NONE, { 0x2A, 0x2A, -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 -1, -1, -1, -1, -1, -1, -1, -1, }, },
337 { KBD_SH_NONE, { 0x2B, 0x2B, -1, -1, -1, -1, -1, -1,
338 -1, -1, -1, -1, -1, -1, -1, -1,
339 -1, -1, -1, -1, -1, -1, -1, -1,
340 -1, -1, -1, -1, -1, -1, -1, -1, }, },
342 { KBD_MOD_MAP(0x7F), },
347 { KBD_SH_NONE, { 0x2F, 0x2F, -1, -1, -1, -1, -1, -1,
348 -1, -1, -1, -1, -1, -1, -1, -1,
349 -1, -1, -1, -1, -1, -1, -1, -1,
350 -1, -1, -1, -1, -1, -1, -1, -1, }, },
351 { KBD_MOD_MAP(0x0D), },
353 { KBD_SH_NONE, { 0x2D, 0x2D, -1, -1, -1, -1, -1, -1,
354 -1, -1, -1, -1, -1, -1, -1, -1,
355 -1, -1, -1, -1, -1, -1, -1, -1,
356 -1, -1, -1, -1, -1, -1, -1, -1, }, },
360 { KBD_SH_NONE, { 0x3D, 0x3D, -1, -1, -1, -1, -1, -1,
361 -1, -1, -1, -1, -1, -1, -1, -1,
362 -1, -1, -1, -1, -1, -1, -1, -1,
363 -1, -1, -1, -1, -1, -1, -1, -1, }, },
364 { KBD_SH_NUML, { -1, 0x30, -1, -1, -1, -1, -1, -1,
365 -1, -1, -1, -1, -1, -1, -1, -1,
366 -1, -1, -1, -1, -1, -1, -1, -1,
367 -1, -1, -1, -1, -1, -1, -1, -1, }, },
368 { KBD_SH_NUML, { -1, 0x31, -1, -1, -1, -1, -1, -1,
369 -1, -1, -1, -1, -1, -1, -1, -1,
370 -1, -1, -1, -1, -1, -1, -1, -1,
371 -1, -1, -1, -1, -1, -1, -1, -1, }, },
372 { KBD_SH_NUML, { -1, 0x32, -1, -1, -1, -1, -1, -1,
373 -1, -1, -1, -1, -1, -1, -1, -1,
374 -1, -1, -1, -1, -1, -1, -1, -1,
375 -1, -1, -1, -1, -1, -1, -1, -1, }, },
376 { KBD_SH_NUML, { -1, 0x33, -1, -1, -1, -1, -1, -1,
377 -1, -1, -1, -1, -1, -1, -1, -1,
378 -1, -1, -1, -1, -1, -1, -1, -1,
379 -1, -1, -1, -1, -1, -1, -1, -1, }, },
380 { KBD_SH_NUML, { -1, 0x34, -1, -1, -1, -1, -1, -1,
381 -1, -1, -1, -1, -1, -1, -1, -1,
382 -1, -1, -1, -1, -1, -1, -1, -1,
383 -1, -1, -1, -1, -1, -1, -1, -1, }, },
384 { KBD_SH_NUML, { -1, 0x35, -1, -1, -1, -1, -1, -1,
385 -1, -1, -1, -1, -1, -1, -1, -1,
386 -1, -1, -1, -1, -1, -1, -1, -1,
387 -1, -1, -1, -1, -1, -1, -1, -1, }, },
389 { KBD_SH_NUML, { -1, 0x36, -1, -1, -1, -1, -1, -1,
390 -1, -1, -1, -1, -1, -1, -1, -1,
391 -1, -1, -1, -1, -1, -1, -1, -1,
392 -1, -1, -1, -1, -1, -1, -1, -1, }, },
393 { KBD_SH_NUML, { -1, 0x37, -1, -1, -1, -1, -1, -1,
394 -1, -1, -1, -1, -1, -1, -1, -1,
395 -1, -1, -1, -1, -1, -1, -1, -1,
396 -1, -1, -1, -1, -1, -1, -1, -1, }, },
398 { KBD_SH_NUML, { -1, 0x38, -1, -1, -1, -1, -1, -1,
399 -1, -1, -1, -1, -1, -1, -1, -1,
400 -1, -1, -1, -1, -1, -1, -1, -1,
401 -1, -1, -1, -1, -1, -1, -1, -1, }, },
402 { KBD_SH_NUML, { -1, 0x39, -1, -1, -1, -1, -1, -1,
403 -1, -1, -1, -1, -1, -1, -1, -1,
404 -1, -1, -1, -1, -1, -1, -1, -1,
405 -1, -1, -1, -1, -1, -1, -1, -1, }, },
407 { KBD_MOD_MAP(0x2F), },
410 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F5)), },
412 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F6)), },
414 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F7)), },
416 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F3)), },
418 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F8)), },
420 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F9)), },
423 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F11)), },
427 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F13)), },
430 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F14)), },
433 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F10)), },
436 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F12)), },
440 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F15)), },
442 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_HELP)), },
444 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_HOME)), },
446 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_PAGE_UP)), },
448 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_DELETE)), },
450 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F4)), },
452 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_END)), },
454 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F2)), },
455 /* 0x79 : page down */
456 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_PAGE_UP)), },
458 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F1)), },
459 /* 0x7B : right shift */
460 { KBD_MOD_MAP_RSHIFT, },
461 /* 0x7C : right option */
462 { KBD_MOD_MAP_ROPT, },
463 /* 0x7D : right control */
464 { KBD_MOD_MAP_RCTRL, },
470 typedef struct adb_kbd_t adb_kbd_t;
474 char sequence[ADB_MAX_SEQUENCE_LEN];
479 static adb_dev_t *my_adb_dev = NULL;
481 static int adb_kbd_read (void *private)
483 uint8_t buffer[ADB_BUF_SIZE];
484 adb_dev_t *dev = private;
492 ret = kbd->sequence[kbd->len-- - 1];
493 ADB_DPRINTF("Buffered %d (%02x)\n", ret, ret);
497 /* Get saved state */
499 for (key = -1; key == -1; ) {
500 if (kbd->next_key != -1) {
504 if (adb_reg_get(dev, 0, buffer) != 2)
506 kbd->next_key = buffer[1] == 0xFF ? -1 : buffer[1];
509 ret = kbd_translate_key(&kbd->kbd, key & 0x7F, key >> 7, kbd->sequence);
512 ret = kbd->sequence[kbd->len-- - 1];
515 ADB_DPRINTF("Translated %d (%02x) into %d (%02x)\n",
523 void *adb_kbd_new (char *path, void *private)
527 phandle_t ph, aliases;
529 adb_dev_t *dev = private;
530 kbd = (adb_kbd_t*)malloc(sizeof(adb_kbd_t));
532 memset(kbd, 0, sizeof(adb_kbd_t));
533 kbd_set_keymap(&kbd->kbd, sizeof(ADB_kbd_us) / sizeof(keymap_t),
534 ADB_kbd_us, ADB_sequences);
538 /* Debugging BootX: the lines below force get-key-map to report that
539 * cmd-V is being held down, which forces BootX to run in verbose mode
542 * TODO: if we can find a mapping between the get-key-map bitmap and
543 * ADB scancodes, the keyboard driver should be altered to update this
548 kbd->keytable[3] = 0x40;
549 kbd->keytable[28] = 0x10;
556 snprintf(buf, sizeof(buf), "%s/keyboard", path);
557 REGISTER_NAMED_NODE( keyboard, buf);
561 set_property(ph, "device_type", "keyboard", 9);
562 props[0] = __cpu_to_be32(dev->addr);
563 set_property(ph, "reg", (char *)&props, sizeof(props));
565 aliases = find_dev("/aliases");
566 set_property(aliases, "adb-keyboard", buf, strlen(buf) + 1);
571 /* ( addr len -- actual ) */
572 static void keyboard_read(void)
577 addr=(char *)cell2pointer(POP());
579 for (i = 0; i < len; i++) {
580 key = adb_kbd_read(my_adb_dev);
581 if (key == -1 || key == -2)
588 /* ( -- keymap ) (?) */
589 /* should return a pointer to an array with 32 bytes (256 bits) */
590 static void keyboard_getkeymap(void)
592 adb_kbd_t *kbd = my_adb_dev->state;
594 PUSH( pointer2cell(kbd->keytable) );