|
|
1.1 root 1: /*
2: *
3: * Open Hack'Ware BIOS ADB keyboard support, ported to OpenBIOS
4: *
5: * Copyright (c) 2005 Jocelyn Mayer
6: * Copyright (c) 2005 Stefan Reinauer
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., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
20: */
21:
22: #include "config.h"
23: #include "libopenbios/bindings.h"
24: #include "libc/byteorder.h"
25: #include "libc/vsprintf.h"
26: #include "kbd.h"
27:
28: #include "adb_bus.h"
29: #include "adb_kbd.h"
30:
31: DECLARE_UNNAMED_NODE( keyboard, INSTALL_OPEN, sizeof(int));
32:
33: static void
34: keyboard_open(int *idx)
35: {
36: RET(-1);
37: }
38:
39: static void
40: keyboard_close(int *idx)
41: {
42: }
43:
44: static void keyboard_read(void);
45:
46: NODE_METHODS( keyboard ) = {
47: { "open", keyboard_open },
48: { "close", keyboard_close },
49: { "read", keyboard_read },
50: };
51:
52: /* VT100 escape sequences */
53:
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
59: };
60:
61: #define ADB_MAX_SEQUENCE_LEN 16
62:
63: static const char *ADB_sequences[] = {
64: [KEY_UP] = "A[",
65: [KEY_DOWN] = "B[",
66: [KEY_RIGHT] = "C[",
67: [KEY_LEFT] = "D[",
68: [KEY_PAGE_UP] = "~5[",
69: [KEY_PAGE_DOWN] = "~6[",
70: [KEY_DELETE] = "~3[",
71: [KEY_HOME] = "HO",
72: [KEY_END] = "FO",
73: [KEY_HELP] = "~2[",
74: [KEY_F1] = "PO",
75: [KEY_F2] = "QO",
76: [KEY_F3] = "RO",
77: [KEY_F4] = "SO",
78: [KEY_F5] = "~15[",
79: [KEY_F6] = "~17[",
80: [KEY_F7] = "~18[",
81: [KEY_F8] = "~19[",
82: [KEY_F9] = "~20[",
83: [KEY_F10] = "~21[",
84: [KEY_F11] = "~23[",
85: [KEY_F12] = "~24[",
86: [KEY_F13] = "~25[",
87: [KEY_F14] = "~26[",
88: [KEY_F15] = "~28[",
89: [KEY_F15] = "~29[",
90: };
91:
92: /* ADB US keyboard translation map */
93:
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, },
466: };
467:
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;
474: };
475:
476: static adb_dev_t *my_adb_dev = NULL;
477:
478: static int adb_kbd_read (void *private)
479: {
480: uint8_t buffer[ADB_BUF_SIZE];
481: adb_dev_t *dev = private;
482: adb_kbd_t *kbd;
483: int key;
484: int ret;
485:
486: kbd = dev->state;
487:
488: if (kbd->len > 0) {
489: ret = kbd->sequence[kbd->len-- - 1];
490: ADB_DPRINTF("Buffered %d (%02x)\n", ret, ret);
491: return ret;
492: }
493:
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];
505: }
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];
510: }
511:
512: ADB_DPRINTF("Translated %d (%02x) into %d (%02x)\n",
513: key, key, ret, ret);
514: }
515:
516: return ret;
517: }
518:
519:
520: void *adb_kbd_new (char *path, void *private)
521: {
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;
536: }
537:
538: snprintf(buf, sizeof(buf), "%s/keyboard", path);
539: REGISTER_NAMED_NODE( keyboard, buf);
540:
541: ph = find_dev(buf);
542:
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));
546:
547: aliases = find_dev("/aliases");
548: set_property(aliases, "adb-keyboard", buf, strlen(buf) + 1);
549:
550: return kbd;
551: }
552:
553: /* ( addr len -- actual ) */
554: static void keyboard_read(void)
555: {
556: char *addr;
557: int len, key, i;
558: len=POP();
559: addr=(char *)cell2pointer(POP());
560:
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;
566: }
567: PUSH(i);
568: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.