Annotation of qemu/roms/openbios/drivers/adb_kbd.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.