Annotation of qemu/roms/openbios/drivers/adb_kbd.c, revision 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.