Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openhackware / src / dev / char / kbdadb.c
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
418 static int adb_kbd_open (unused void *private)
419 {
420     return 0;
421 }
422
423 static int adb_kbd_close (unused void *private)
424 {
425     return 0;
426 }
427
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
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 }