ppc: Adjust isa_io_base for ppc64
[openbios/afaerber.git] / drivers / adb_kbd.c
blobe38798a1690af5eaa2f8c9734bd38118a5311061
1 /*
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
22 #include "config.h"
23 #include "libopenbios/bindings.h"
24 #include "libc/byteorder.h"
25 #include "libc/vsprintf.h"
26 #include "kbd.h"
28 #include "adb_bus.h"
29 #include "adb_kbd.h"
31 DECLARE_UNNAMED_NODE( keyboard, INSTALL_OPEN, sizeof(int));
33 static void
34 keyboard_open(int *idx)
36 RET(-1);
39 static void
40 keyboard_close(int *idx)
44 static void keyboard_read(void);
46 NODE_METHODS( keyboard ) = {
47 { "open", keyboard_open },
48 { "close", keyboard_close },
49 { "read", keyboard_read },
52 /* VT100 escape sequences */
54 enum {
55 KEY_UP = 0, KEY_DOWN, KEY_RIGHT, KEY_LEFT, KEY_PAGE_UP, KEY_PAGE_DOWN,
56 KEY_DELETE, KEY_HOME, KEY_END, KEY_HELP,
57 KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8,
58 KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16
61 #define ADB_MAX_SEQUENCE_LEN 16
63 static const char *ADB_sequences[] = {
64 [KEY_UP] = "A[\e",
65 [KEY_DOWN] = "B[\e",
66 [KEY_RIGHT] = "C[\e",
67 [KEY_LEFT] = "D[\e",
68 [KEY_PAGE_UP] = "~5[\e",
69 [KEY_PAGE_DOWN] = "~6[\e",
70 [KEY_DELETE] = "~3[\e",
71 [KEY_HOME] = "HO\e",
72 [KEY_END] = "FO\e",
73 [KEY_HELP] = "~2[\e",
74 [KEY_F1] = "PO\e",
75 [KEY_F2] = "QO\e",
76 [KEY_F3] = "RO\e",
77 [KEY_F4] = "SO\e",
78 [KEY_F5] = "~15[\e",
79 [KEY_F6] = "~17[\e",
80 [KEY_F7] = "~18[\e",
81 [KEY_F8] = "~19[\e",
82 [KEY_F9] = "~20[\e",
83 [KEY_F10] = "~21[\e",
84 [KEY_F11] = "~23[\e",
85 [KEY_F12] = "~24[\e",
86 [KEY_F13] = "~25[\e",
87 [KEY_F14] = "~26[\e",
88 [KEY_F15] = "~28[\e",
89 [KEY_F15] = "~29[\e",
92 /* ADB US keyboard translation map */
94 static const keymap_t ADB_kbd_us[] = {
95 /* 0x00 */
96 { KBD_SH_CAPS, { 0x61, 0x41, 0x01, -1, -1, -1, -1, -1,
97 -1, -1, -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 { KBD_SH_CAPS, { 0x73, 0x53, 0x13, -1, -1, -1, -1, -1,
101 -1, -1, -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 { KBD_SH_CAPS, { 0x64, 0x44, 0x04, -1, -1, -1, -1, -1,
105 -1, -1, -1, -1, -1, -1, -1, -1,
106 -1, -1, -1, -1, -1, -1, -1, -1,
107 -1, -1, -1, -1, -1, -1, -1, -1, }, },
108 { KBD_SH_CAPS, { 0x66, 0x46, 0x06, -1, -1, -1, -1, -1,
109 -1, -1, -1, -1, -1, -1, -1, -1,
110 -1, -1, -1, -1, -1, -1, -1, -1,
111 -1, -1, -1, -1, -1, -1, -1, -1, }, },
112 { KBD_SH_CAPS, { 0x68, 0x48, 0x08, -1, -1, -1, -1, -1,
113 -1, -1, -1, -1, -1, -1, -1, -1,
114 -1, -1, -1, -1, -1, -1, -1, -1,
115 -1, -1, -1, -1, -1, -1, -1, -1, }, },
116 { KBD_SH_CAPS, { 0x67, 0x47, 0x07, -1, -1, -1, -1, -1,
117 -1, -1, -1, -1, -1, -1, -1, -1,
118 -1, -1, -1, -1, -1, -1, -1, -1,
119 -1, -1, -1, -1, -1, -1, -1, -1, }, },
120 { KBD_SH_CAPS, { 0x7A, 0x5A, 0x1A, -1, -1, -1, -1, -1,
121 -1, -1, -1, -1, -1, -1, -1, -1,
122 -1, -1, -1, -1, -1, -1, -1, -1,
123 -1, -1, -1, -1, -1, -1, -1, -1, }, },
124 { KBD_SH_CAPS, { 0x78, 0x58, 0x18, -1, -1, -1, -1, -1,
125 -1, -1, -1, -1, -1, -1, -1, -1,
126 -1, -1, -1, -1, -1, -1, -1, -1,
127 -1, -1, -1, -1, -1, -1, -1, -1, }, },
128 /* 0x08 */
129 { KBD_SH_CAPS, { 0x63, 0x43, 0x03, -1, -1, -1, -1, -1,
130 -1, -1, -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 { KBD_SH_CAPS, { 0x76, 0x56, 0x16, -1, -1, -1, -1, -1,
134 -1, -1, -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 { KBD_SH_CAPS, { 0x60, 0x40, 0x00, -1, -1, -1, -1, -1, /* ? */
138 -1, -1, -1, -1, -1, -1, -1, -1,
139 -1, -1, -1, -1, -1, -1, -1, -1,
140 -1, -1, -1, -1, -1, -1, -1, -1, }, },
141 { KBD_SH_CAPS, { 0x62, 0x42, 0x02, -1, -1, -1, -1, -1,
142 -1, -1, -1, -1, -1, -1, -1, -1,
143 -1, -1, -1, -1, -1, -1, -1, -1,
144 -1, -1, -1, -1, -1, -1, -1, -1, }, },
145 { KBD_SH_CAPS, { 0x71, 0x51, 0x11, -1, -1, -1, -1, -1,
146 -1, -1, -1, -1, -1, -1, -1, -1,
147 -1, -1, -1, -1, -1, -1, -1, -1,
148 -1, -1, -1, -1, -1, -1, -1, -1, }, },
149 { KBD_SH_CAPS, { 0x77, 0x57, 0x17, -1, -1, -1, -1, -1,
150 -1, -1, -1, -1, -1, -1, -1, -1,
151 -1, -1, -1, -1, -1, -1, -1, -1,
152 -1, -1, -1, -1, -1, -1, -1, -1, }, },
153 { KBD_SH_CAPS, { 0x65, 0x45, 0x05, -1, -1, -1, -1, -1,
154 -1, -1, -1, -1, -1, -1, -1, -1,
155 -1, -1, -1, -1, -1, -1, -1, -1,
156 -1, -1, -1, -1, -1, -1, -1, -1, }, },
157 { KBD_SH_CAPS, { 0x72, 0x52, 0x12, -1, -1, -1, -1, -1,
158 -1, -1, -1, -1, -1, -1, -1, -1,
159 -1, -1, -1, -1, -1, -1, -1, -1,
160 -1, -1, -1, -1, -1, -1, -1, -1, }, },
161 /* 0x10 */
162 { KBD_SH_CAPS, { 0x79, 0x59, 0x19, -1, -1, -1, -1, -1,
163 -1, -1, -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 { KBD_SH_CAPS, { 0x74, 0x54, 0x14, -1, -1, -1, -1, -1,
167 -1, -1, -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 { KBD_SH_CAPS, { 0x31, 0x21, -1, -1, -1, -1, -1, -1,
171 -1, -1, -1, -1, -1, -1, -1, -1,
172 -1, -1, -1, -1, -1, -1, -1, -1,
173 -1, -1, -1, -1, -1, -1, -1, -1, }, },
174 { KBD_SH_CAPS, { 0x32, 0x40, 0x00, -1, -1, -1, -1, -1,
175 -1, -1, -1, -1, -1, -1, -1, -1,
176 -1, -1, -1, -1, -1, -1, -1, -1,
177 -1, -1, -1, -1, -1, -1, -1, -1, }, },
178 { KBD_SH_CAPS, { 0x33, 0x23, -1, -1, -1, -1, -1, -1,
179 -1, -1, -1, -1, -1, -1, -1, -1,
180 -1, -1, -1, -1, -1, -1, -1, -1,
181 -1, -1, -1, -1, -1, -1, -1, -1, }, },
182 { KBD_SH_CAPS, { 0x34, 0x24, -1, -1, -1, -1, -1, -1,
183 -1, -1, -1, -1, -1, -1, -1, -1,
184 -1, -1, -1, -1, -1, -1, -1, -1,
185 -1, -1, -1, -1, -1, -1, -1, -1, }, },
186 { KBD_SH_CAPS, { 0x36, 0x5E, 0x1E, -1, -1, -1, -1, -1,
187 -1, -1, -1, -1, -1, -1, -1, -1,
188 -1, -1, -1, -1, -1, -1, -1, -1,
189 -1, -1, -1, -1, -1, -1, -1, -1, }, },
190 { KBD_SH_CAPS, { 0x35, 0x25, -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 -1, -1, -1, -1, -1, -1, -1, -1, }, },
194 /* 0x18 */
195 { KBD_SH_CAPS, { 0x3D, 0x2B, -1, -1, -1, -1, -1, -1,
196 -1, -1, -1, -1, -1, -1, -1, -1,
197 -1, -1, -1, -1, -1, -1, -1, -1,
198 -1, -1, -1, -1, -1, -1, -1, -1, }, },
199 { KBD_SH_CAPS, { 0x39, 0x28, -1, -1, -1, -1, -1, -1,
200 -1, -1, -1, -1, -1, -1, -1, -1,
201 -1, -1, -1, -1, -1, -1, -1, -1,
202 -1, -1, -1, -1, -1, -1, -1, -1, }, },
203 { KBD_SH_CAPS, { 0x37, 0x26, -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 -1, -1, -1, -1, -1, -1, -1, -1, }, },
207 { KBD_SH_CAPS, { 0x2D, 0x5F, 0x1F, -1, -1, -1, -1, -1,
208 -1, -1, -1, -1, -1, -1, -1, -1,
209 -1, -1, -1, -1, -1, -1, -1, -1,
210 -1, -1, -1, -1, -1, -1, -1, -1, }, },
211 { KBD_SH_CAPS, { 0x38, 0x2A, -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 -1, -1, -1, -1, -1, -1, -1, -1, }, },
215 { KBD_SH_CAPS, { 0x30, 0x29, -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 -1, -1, -1, -1, -1, -1, -1, -1, }, },
219 { KBD_SH_CAPS, { 0x5D, 0x7D, -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 -1, -1, -1, -1, -1, -1, -1, -1, }, },
223 { KBD_SH_CAPS, { 0x6F, 0x4F, 0x0F, -1, -1, -1, -1, -1,
224 -1, -1, -1, -1, -1, -1, -1, -1,
225 -1, -1, -1, -1, -1, -1, -1, -1,
226 -1, -1, -1, -1, -1, -1, -1, -1, }, },
227 /* 0x20 */
228 { KBD_SH_CAPS, { 0x75, 0x55, 0x15, -1, -1, -1, -1, -1,
229 -1, -1, -1, -1, -1, -1, -1, -1,
230 -1, -1, -1, -1, -1, -1, -1, -1,
231 -1, -1, -1, -1, -1, -1, -1, -1, }, },
232 { KBD_SH_CAPS, { 0x5B, 0x7B, -1, -1, -1, -1, -1, -1,
233 -1, -1, -1, -1, -1, -1, -1, -1,
234 -1, -1, -1, -1, -1, -1, -1, -1,
235 -1, -1, -1, -1, -1, -1, -1, -1, }, },
236 { KBD_SH_CAPS, { 0x69, 0x49, 0x09, -1, -1, -1, -1, -1,
237 -1, -1, -1, -1, -1, -1, -1, -1,
238 -1, -1, -1, -1, -1, -1, -1, -1,
239 -1, -1, -1, -1, -1, -1, -1, -1, }, },
240 { KBD_SH_CAPS, { 0x70, 0x50, 0x10, -1, -1, -1, -1, -1,
241 -1, -1, -1, -1, -1, -1, -1, -1,
242 -1, -1, -1, -1, -1, -1, -1, -1,
243 -1, -1, -1, -1, -1, -1, -1, -1, }, },
244 { KBD_MOD_MAP(0x0D), },
245 { KBD_SH_CAPS, { 0x6C, 0x4C, 0x0C, -1, -1, -1, -1, -1,
246 -1, -1, -1, -1, -1, -1, -1, -1,
247 -1, -1, -1, -1, -1, -1, -1, -1,
248 -1, -1, -1, -1, -1, -1, -1, -1, }, },
249 { KBD_SH_CAPS, { 0x6A, 0x4A, 0x0A, -1, -1, -1, -1, -1,
250 -1, -1, -1, -1, -1, -1, -1, -1,
251 -1, -1, -1, -1, -1, -1, -1, -1,
252 -1, -1, -1, -1, -1, -1, -1, -1, }, },
253 { KBD_SH_CAPS, { 0x27, 0x22, -1, -1, -1, -1, -1, -1,
254 -1, -1, -1, -1, -1, -1, -1, -1,
255 -1, -1, -1, -1, -1, -1, -1, -1,
256 -1, -1, -1, -1, -1, -1, -1, -1, }, },
257 /* 0x28 */
258 { KBD_SH_CAPS, { 0x6B, 0x4B, 0x0B, -1, -1, -1, -1, -1,
259 -1, -1, -1, -1, -1, -1, -1, -1,
260 -1, -1, -1, -1, -1, -1, -1, -1,
261 -1, -1, -1, -1, -1, -1, -1, -1, }, },
262 { KBD_SH_CAPS, { 0x3B, 0x3A, -1, -1, -1, -1, -1, -1,
263 -1, -1, -1, -1, -1, -1, -1, -1,
264 -1, -1, -1, -1, -1, -1, -1, -1,
265 -1, -1, -1, -1, -1, -1, -1, -1, }, },
266 { KBD_SH_CAPS, { 0x5C, 0x7C, -1, -1, -1, -1, -1, -1,
267 -1, -1, -1, -1, -1, -1, -1, -1,
268 -1, -1, -1, -1, -1, -1, -1, -1,
269 -1, -1, -1, -1, -1, -1, -1, -1, }, },
270 { KBD_SH_CAPS, { 0x2C, 0x3C, -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 -1, -1, -1, -1, -1, -1, -1, -1, }, },
274 { KBD_SH_CAPS, { 0x2F, 0x3F, -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_SH_CAPS, { 0x6E, 0x4E, 0x0E, -1, -1, -1, -1, -1,
279 -1, -1, -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 { KBD_SH_CAPS, { 0x6D, 0x4D, 0x0D, -1, -1, -1, -1, -1,
283 -1, -1, -1, -1, -1, -1, -1, -1,
284 -1, -1, -1, -1, -1, -1, -1, -1,
285 -1, -1, -1, -1, -1, -1, -1, -1, }, },
286 { KBD_SH_CAPS, { 0x2E, 0x3E, -1, -1, -1, -1, -1, -1,
287 -1, -1, -1, -1, -1, -1, -1, -1,
288 -1, -1, -1, -1, -1, -1, -1, -1,
289 -1, -1, -1, -1, -1, -1, -1, -1, }, },
290 /* 0x30 : tab */
291 { KBD_MOD_MAP(0x09), },
292 /* 0x31 : space */
293 { KBD_MOD_MAP(0x20), },
294 /* 0x32 : '<' '>' */
295 { KBD_SH_CAPS, { 0x3C, 0x3E, -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 /* 0x33 : backspace */
300 { KBD_MOD_MAP(0x08), },
301 { KBD_MAP_NONE, },
302 /* 0x35 : ESC */
303 { KBD_MOD_MAP(0x1B), },
304 /* 0x36 : control */
305 { KBD_MOD_MAP_LCTRL, },
306 /* 0x37 : command */
307 { KBD_MOD_MAP_LCMD, },
308 /* 0x38 : left shift */
309 { KBD_MOD_MAP_LSHIFT, },
310 /* 0x39 : caps-lock */
311 { KBD_MOD_MAP_CAPS, },
312 /* 0x3A : option */
313 { KBD_MOD_MAP_LOPT, },
314 /* 0x3B : left */
315 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_LEFT)), },
316 /* 0x3C : right */
317 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_RIGHT)), },
318 /* 0x3D : down */
319 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_DOWN)), },
320 /* 0x3E : up */
321 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_UP)), },
322 { KBD_MAP_NONE, },
323 /* 0x40 */
324 { KBD_MAP_NONE, },
325 { KBD_SH_NUML, { 0x7F, 0x2E, -1, -1, -1, -1, -1, -1,
326 -1, -1, -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 { KBD_MAP_NONE, },
330 { KBD_SH_NONE, { 0x2A, 0x2A, -1, -1, -1, -1, -1, -1,
331 -1, -1, -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 { KBD_MAP_NONE, },
335 { KBD_SH_NONE, { 0x2B, 0x2B, -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_MOD_MAP(0x7F), },
341 /* 0x48 */
342 { KBD_MAP_NONE, },
343 { KBD_MAP_NONE, },
344 { KBD_MAP_NONE, },
345 { KBD_SH_NONE, { 0x2F, 0x2F, -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 -1, -1, -1, -1, -1, -1, -1, -1, }, },
349 { KBD_MOD_MAP(0x0D), },
350 { KBD_MAP_NONE, },
351 { KBD_SH_NONE, { 0x2D, 0x2D, -1, -1, -1, -1, -1, -1,
352 -1, -1, -1, -1, -1, -1, -1, -1,
353 -1, -1, -1, -1, -1, -1, -1, -1,
354 -1, -1, -1, -1, -1, -1, -1, -1, }, },
355 { KBD_MAP_NONE, },
356 /* 0x50 */
357 { KBD_MAP_NONE, },
358 { KBD_SH_NONE, { 0x3D, 0x3D, -1, -1, -1, -1, -1, -1,
359 -1, -1, -1, -1, -1, -1, -1, -1,
360 -1, -1, -1, -1, -1, -1, -1, -1,
361 -1, -1, -1, -1, -1, -1, -1, -1, }, },
362 { KBD_SH_NUML, { -1, 0x30, -1, -1, -1, -1, -1, -1,
363 -1, -1, -1, -1, -1, -1, -1, -1,
364 -1, -1, -1, -1, -1, -1, -1, -1,
365 -1, -1, -1, -1, -1, -1, -1, -1, }, },
366 { KBD_SH_NUML, { -1, 0x31, -1, -1, -1, -1, -1, -1,
367 -1, -1, -1, -1, -1, -1, -1, -1,
368 -1, -1, -1, -1, -1, -1, -1, -1,
369 -1, -1, -1, -1, -1, -1, -1, -1, }, },
370 { KBD_SH_NUML, { -1, 0x32, -1, -1, -1, -1, -1, -1,
371 -1, -1, -1, -1, -1, -1, -1, -1,
372 -1, -1, -1, -1, -1, -1, -1, -1,
373 -1, -1, -1, -1, -1, -1, -1, -1, }, },
374 { KBD_SH_NUML, { -1, 0x33, -1, -1, -1, -1, -1, -1,
375 -1, -1, -1, -1, -1, -1, -1, -1,
376 -1, -1, -1, -1, -1, -1, -1, -1,
377 -1, -1, -1, -1, -1, -1, -1, -1, }, },
378 { KBD_SH_NUML, { -1, 0x34, -1, -1, -1, -1, -1, -1,
379 -1, -1, -1, -1, -1, -1, -1, -1,
380 -1, -1, -1, -1, -1, -1, -1, -1,
381 -1, -1, -1, -1, -1, -1, -1, -1, }, },
382 { KBD_SH_NUML, { -1, 0x35, -1, -1, -1, -1, -1, -1,
383 -1, -1, -1, -1, -1, -1, -1, -1,
384 -1, -1, -1, -1, -1, -1, -1, -1,
385 -1, -1, -1, -1, -1, -1, -1, -1, }, },
386 /* 0x58 */
387 { KBD_SH_NUML, { -1, 0x36, -1, -1, -1, -1, -1, -1,
388 -1, -1, -1, -1, -1, -1, -1, -1,
389 -1, -1, -1, -1, -1, -1, -1, -1,
390 -1, -1, -1, -1, -1, -1, -1, -1, }, },
391 { KBD_SH_NUML, { -1, 0x37, -1, -1, -1, -1, -1, -1,
392 -1, -1, -1, -1, -1, -1, -1, -1,
393 -1, -1, -1, -1, -1, -1, -1, -1,
394 -1, -1, -1, -1, -1, -1, -1, -1, }, },
395 { KBD_MAP_NONE, },
396 { KBD_SH_NUML, { -1, 0x38, -1, -1, -1, -1, -1, -1,
397 -1, -1, -1, -1, -1, -1, -1, -1,
398 -1, -1, -1, -1, -1, -1, -1, -1,
399 -1, -1, -1, -1, -1, -1, -1, -1, }, },
400 { KBD_SH_NUML, { -1, 0x39, -1, -1, -1, -1, -1, -1,
401 -1, -1, -1, -1, -1, -1, -1, -1,
402 -1, -1, -1, -1, -1, -1, -1, -1,
403 -1, -1, -1, -1, -1, -1, -1, -1, }, },
404 { KBD_MAP_NONE, },
405 { KBD_MOD_MAP(0x2F), },
406 { KBD_MAP_NONE, },
407 /* 0x60 : F5 */
408 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F5)), },
409 /* 0x61 : F6 */
410 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F6)), },
411 /* 0x62 : F7 */
412 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F7)), },
413 /* 0x63 : F3 */
414 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F3)), },
415 /* 0x64 : F8 */
416 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F8)), },
417 /* 0x65 : F9 */
418 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F9)), },
419 { KBD_MAP_NONE, },
420 /* 0x67 : F11 */
421 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F11)), },
422 /* 0x68 */
423 { KBD_MAP_NONE, },
424 /* 0x69 : F13 */
425 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F13)), },
426 { KBD_MAP_NONE, },
427 /* 0x6B : F14 */
428 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F14)), },
429 { KBD_MAP_NONE, },
430 /* 0x6D : F10 */
431 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F10)), },
432 { KBD_MAP_NONE, },
433 /* 0x6F : F12 */
434 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F12)), },
435 /* 0x70 */
436 { KBD_MAP_NONE, },
437 /* 0x71 : F15 */
438 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F15)), },
439 /* 0x72 : help */
440 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_HELP)), },
441 /* 0x73 : home */
442 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_HOME)), },
443 /* 0x74 : page up */
444 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_PAGE_UP)), },
445 /* 0x75 : del */
446 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_DELETE)), },
447 /* 0x76 : F4 */
448 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F4)), },
449 /* 0x77 : end */
450 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_END)), },
451 /* 0x78 : F2 */
452 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F2)), },
453 /* 0x79 : page down */
454 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_PAGE_UP)), },
455 /* 0x7A : F1 */
456 { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F1)), },
457 /* 0x7B : right shift */
458 { KBD_MOD_MAP_RSHIFT, },
459 /* 0x7C : right option */
460 { KBD_MOD_MAP_ROPT, },
461 /* 0x7D : right control */
462 { KBD_MOD_MAP_RCTRL, },
463 { KBD_MAP_NONE, },
464 /* 0x7F : power */
465 { KBD_MAP_NONE, },
468 typedef struct adb_kbd_t adb_kbd_t;
469 struct adb_kbd_t {
470 kbd_t kbd;
471 int next_key;
472 char sequence[ADB_MAX_SEQUENCE_LEN];
473 int len;
476 static adb_dev_t *my_adb_dev = NULL;
478 static int adb_kbd_read (void *private)
480 uint8_t buffer[ADB_BUF_SIZE];
481 adb_dev_t *dev = private;
482 adb_kbd_t *kbd;
483 int key;
484 int ret;
486 kbd = dev->state;
488 if (kbd->len > 0) {
489 ret = kbd->sequence[kbd->len-- - 1];
490 ADB_DPRINTF("Buffered %d (%02x)\n", ret, ret);
491 return ret;
494 /* Get saved state */
495 ret = -1;
496 for (key = -1; key == -1; ) {
497 if (kbd->next_key != -1) {
498 key = kbd->next_key;
499 kbd->next_key = -1;
500 } else {
501 if (adb_reg_get(dev, 0, buffer) != 2)
502 break;
503 kbd->next_key = buffer[1] == 0xFF ? -1 : buffer[1];
504 key = buffer[0];
506 ret = kbd_translate_key(&kbd->kbd, key & 0x7F, key >> 7, kbd->sequence);
507 if (ret > 0) {
508 kbd->len = ret;
509 ret = kbd->sequence[kbd->len-- - 1];
512 ADB_DPRINTF("Translated %d (%02x) into %d (%02x)\n",
513 key, key, ret, ret);
516 return ret;
520 void *adb_kbd_new (char *path, void *private)
522 char buf[64];
523 int props[1];
524 phandle_t ph, aliases;
525 adb_kbd_t *kbd;
526 adb_dev_t *dev = private;
527 kbd = (adb_kbd_t*)malloc(sizeof(adb_kbd_t));
528 if (kbd != NULL) {
529 memset(kbd, 0, sizeof(adb_kbd_t));
530 kbd_set_keymap(&kbd->kbd, sizeof(ADB_kbd_us) / sizeof(keymap_t),
531 ADB_kbd_us, ADB_sequences);
532 kbd->next_key = -1;
533 kbd->len = 0;
534 dev->state = kbd;
535 my_adb_dev = dev;
538 snprintf(buf, sizeof(buf), "%s/keyboard", path);
539 REGISTER_NAMED_NODE( keyboard, buf);
541 ph = find_dev(buf);
543 set_property(ph, "device_type", "keyboard", 9);
544 props[0] = __cpu_to_be32(dev->addr);
545 set_property(ph, "reg", (char *)&props, sizeof(props));
547 aliases = find_dev("/aliases");
548 set_property(aliases, "adb-keyboard", buf, strlen(buf) + 1);
550 return kbd;
553 /* ( addr len -- actual ) */
554 static void keyboard_read(void)
556 char *addr;
557 int len, key, i;
558 len=POP();
559 addr=(char *)cell2pointer(POP());
561 for (i = 0; i < len; i++) {
562 key = adb_kbd_read(my_adb_dev);
563 if (key == -1 || key == -2)
564 break;
565 *addr++ = (char)key;
567 PUSH(i);