|
|
1.1 ! root 1: /* ! 2: * ! 3: * Open Hack'Ware BIOS ADB keyboard support, ported to OpenBIOS ! 4: * ! 5: * Copyright (c) 2005 Jocelyn Mayer ! 6: * Copyright (c) 2005 Stefan Reinauer ! 7: * ! 8: * This program is free software; you can redistribute it and/or ! 9: * modify it under the terms of the GNU General Public License V2 ! 10: * as published by the Free Software Foundation ! 11: * ! 12: * This program is distributed in the hope that it will be useful, ! 13: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 15: * GNU General Public License for more details. ! 16: * ! 17: * You should have received a copy of the GNU General Public License ! 18: * along with this program; if not, write to the Free Software ! 19: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA ! 20: */ ! 21: ! 22: #include "config.h" ! 23: #include "libopenbios/bindings.h" ! 24: #include "libc/byteorder.h" ! 25: #include "libc/vsprintf.h" ! 26: #include "kbd.h" ! 27: ! 28: #include "adb_bus.h" ! 29: #include "adb_kbd.h" ! 30: ! 31: DECLARE_UNNAMED_NODE( keyboard, INSTALL_OPEN, sizeof(int)); ! 32: ! 33: static void ! 34: keyboard_open(int *idx) ! 35: { ! 36: RET(-1); ! 37: } ! 38: ! 39: static void ! 40: keyboard_close(int *idx) ! 41: { ! 42: } ! 43: ! 44: static void keyboard_read(void); ! 45: ! 46: NODE_METHODS( keyboard ) = { ! 47: { "open", keyboard_open }, ! 48: { "close", keyboard_close }, ! 49: { "read", keyboard_read }, ! 50: }; ! 51: ! 52: /* VT100 escape sequences */ ! 53: ! 54: enum { ! 55: KEY_UP = 0, KEY_DOWN, KEY_RIGHT, KEY_LEFT, KEY_PAGE_UP, KEY_PAGE_DOWN, ! 56: KEY_DELETE, KEY_HOME, KEY_END, KEY_HELP, ! 57: KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, ! 58: KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16 ! 59: }; ! 60: ! 61: #define ADB_MAX_SEQUENCE_LEN 16 ! 62: ! 63: static const char *ADB_sequences[] = { ! 64: [KEY_UP] = "A[", ! 65: [KEY_DOWN] = "B[", ! 66: [KEY_RIGHT] = "C[", ! 67: [KEY_LEFT] = "D[", ! 68: [KEY_PAGE_UP] = "~5[", ! 69: [KEY_PAGE_DOWN] = "~6[", ! 70: [KEY_DELETE] = "~3[", ! 71: [KEY_HOME] = "HO", ! 72: [KEY_END] = "FO", ! 73: [KEY_HELP] = "~2[", ! 74: [KEY_F1] = "PO", ! 75: [KEY_F2] = "QO", ! 76: [KEY_F3] = "RO", ! 77: [KEY_F4] = "SO", ! 78: [KEY_F5] = "~15[", ! 79: [KEY_F6] = "~17[", ! 80: [KEY_F7] = "~18[", ! 81: [KEY_F8] = "~19[", ! 82: [KEY_F9] = "~20[", ! 83: [KEY_F10] = "~21[", ! 84: [KEY_F11] = "~23[", ! 85: [KEY_F12] = "~24[", ! 86: [KEY_F13] = "~25[", ! 87: [KEY_F14] = "~26[", ! 88: [KEY_F15] = "~28[", ! 89: [KEY_F15] = "~29[", ! 90: }; ! 91: ! 92: /* ADB US keyboard translation map */ ! 93: ! 94: static const keymap_t ADB_kbd_us[] = { ! 95: /* 0x00 */ ! 96: { KBD_SH_CAPS, { 0x61, 0x41, 0x01, -1, -1, -1, -1, -1, ! 97: -1, -1, -1, -1, -1, -1, -1, -1, ! 98: -1, -1, -1, -1, -1, -1, -1, -1, ! 99: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 100: { KBD_SH_CAPS, { 0x73, 0x53, 0x13, -1, -1, -1, -1, -1, ! 101: -1, -1, -1, -1, -1, -1, -1, -1, ! 102: -1, -1, -1, -1, -1, -1, -1, -1, ! 103: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 104: { KBD_SH_CAPS, { 0x64, 0x44, 0x04, -1, -1, -1, -1, -1, ! 105: -1, -1, -1, -1, -1, -1, -1, -1, ! 106: -1, -1, -1, -1, -1, -1, -1, -1, ! 107: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 108: { KBD_SH_CAPS, { 0x66, 0x46, 0x06, -1, -1, -1, -1, -1, ! 109: -1, -1, -1, -1, -1, -1, -1, -1, ! 110: -1, -1, -1, -1, -1, -1, -1, -1, ! 111: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 112: { KBD_SH_CAPS, { 0x68, 0x48, 0x08, -1, -1, -1, -1, -1, ! 113: -1, -1, -1, -1, -1, -1, -1, -1, ! 114: -1, -1, -1, -1, -1, -1, -1, -1, ! 115: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 116: { KBD_SH_CAPS, { 0x67, 0x47, 0x07, -1, -1, -1, -1, -1, ! 117: -1, -1, -1, -1, -1, -1, -1, -1, ! 118: -1, -1, -1, -1, -1, -1, -1, -1, ! 119: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 120: { KBD_SH_CAPS, { 0x7A, 0x5A, 0x1A, -1, -1, -1, -1, -1, ! 121: -1, -1, -1, -1, -1, -1, -1, -1, ! 122: -1, -1, -1, -1, -1, -1, -1, -1, ! 123: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 124: { KBD_SH_CAPS, { 0x78, 0x58, 0x18, -1, -1, -1, -1, -1, ! 125: -1, -1, -1, -1, -1, -1, -1, -1, ! 126: -1, -1, -1, -1, -1, -1, -1, -1, ! 127: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 128: /* 0x08 */ ! 129: { KBD_SH_CAPS, { 0x63, 0x43, 0x03, -1, -1, -1, -1, -1, ! 130: -1, -1, -1, -1, -1, -1, -1, -1, ! 131: -1, -1, -1, -1, -1, -1, -1, -1, ! 132: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 133: { KBD_SH_CAPS, { 0x76, 0x56, 0x16, -1, -1, -1, -1, -1, ! 134: -1, -1, -1, -1, -1, -1, -1, -1, ! 135: -1, -1, -1, -1, -1, -1, -1, -1, ! 136: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 137: { KBD_SH_CAPS, { 0x60, 0x40, 0x00, -1, -1, -1, -1, -1, /* ? */ ! 138: -1, -1, -1, -1, -1, -1, -1, -1, ! 139: -1, -1, -1, -1, -1, -1, -1, -1, ! 140: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 141: { KBD_SH_CAPS, { 0x62, 0x42, 0x02, -1, -1, -1, -1, -1, ! 142: -1, -1, -1, -1, -1, -1, -1, -1, ! 143: -1, -1, -1, -1, -1, -1, -1, -1, ! 144: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 145: { KBD_SH_CAPS, { 0x71, 0x51, 0x11, -1, -1, -1, -1, -1, ! 146: -1, -1, -1, -1, -1, -1, -1, -1, ! 147: -1, -1, -1, -1, -1, -1, -1, -1, ! 148: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 149: { KBD_SH_CAPS, { 0x77, 0x57, 0x17, -1, -1, -1, -1, -1, ! 150: -1, -1, -1, -1, -1, -1, -1, -1, ! 151: -1, -1, -1, -1, -1, -1, -1, -1, ! 152: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 153: { KBD_SH_CAPS, { 0x65, 0x45, 0x05, -1, -1, -1, -1, -1, ! 154: -1, -1, -1, -1, -1, -1, -1, -1, ! 155: -1, -1, -1, -1, -1, -1, -1, -1, ! 156: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 157: { KBD_SH_CAPS, { 0x72, 0x52, 0x12, -1, -1, -1, -1, -1, ! 158: -1, -1, -1, -1, -1, -1, -1, -1, ! 159: -1, -1, -1, -1, -1, -1, -1, -1, ! 160: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 161: /* 0x10 */ ! 162: { KBD_SH_CAPS, { 0x79, 0x59, 0x19, -1, -1, -1, -1, -1, ! 163: -1, -1, -1, -1, -1, -1, -1, -1, ! 164: -1, -1, -1, -1, -1, -1, -1, -1, ! 165: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 166: { KBD_SH_CAPS, { 0x74, 0x54, 0x14, -1, -1, -1, -1, -1, ! 167: -1, -1, -1, -1, -1, -1, -1, -1, ! 168: -1, -1, -1, -1, -1, -1, -1, -1, ! 169: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 170: { KBD_SH_CAPS, { 0x31, 0x21, -1, -1, -1, -1, -1, -1, ! 171: -1, -1, -1, -1, -1, -1, -1, -1, ! 172: -1, -1, -1, -1, -1, -1, -1, -1, ! 173: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 174: { KBD_SH_CAPS, { 0x32, 0x40, 0x00, -1, -1, -1, -1, -1, ! 175: -1, -1, -1, -1, -1, -1, -1, -1, ! 176: -1, -1, -1, -1, -1, -1, -1, -1, ! 177: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 178: { KBD_SH_CAPS, { 0x33, 0x23, -1, -1, -1, -1, -1, -1, ! 179: -1, -1, -1, -1, -1, -1, -1, -1, ! 180: -1, -1, -1, -1, -1, -1, -1, -1, ! 181: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 182: { KBD_SH_CAPS, { 0x34, 0x24, -1, -1, -1, -1, -1, -1, ! 183: -1, -1, -1, -1, -1, -1, -1, -1, ! 184: -1, -1, -1, -1, -1, -1, -1, -1, ! 185: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 186: { KBD_SH_CAPS, { 0x36, 0x5E, 0x1E, -1, -1, -1, -1, -1, ! 187: -1, -1, -1, -1, -1, -1, -1, -1, ! 188: -1, -1, -1, -1, -1, -1, -1, -1, ! 189: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 190: { KBD_SH_CAPS, { 0x35, 0x25, -1, -1, -1, -1, -1, -1, ! 191: -1, -1, -1, -1, -1, -1, -1, -1, ! 192: -1, -1, -1, -1, -1, -1, -1, -1, ! 193: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 194: /* 0x18 */ ! 195: { KBD_SH_CAPS, { 0x3D, 0x2B, -1, -1, -1, -1, -1, -1, ! 196: -1, -1, -1, -1, -1, -1, -1, -1, ! 197: -1, -1, -1, -1, -1, -1, -1, -1, ! 198: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 199: { KBD_SH_CAPS, { 0x39, 0x28, -1, -1, -1, -1, -1, -1, ! 200: -1, -1, -1, -1, -1, -1, -1, -1, ! 201: -1, -1, -1, -1, -1, -1, -1, -1, ! 202: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 203: { KBD_SH_CAPS, { 0x37, 0x26, -1, -1, -1, -1, -1, -1, ! 204: -1, -1, -1, -1, -1, -1, -1, -1, ! 205: -1, -1, -1, -1, -1, -1, -1, -1, ! 206: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 207: { KBD_SH_CAPS, { 0x2D, 0x5F, 0x1F, -1, -1, -1, -1, -1, ! 208: -1, -1, -1, -1, -1, -1, -1, -1, ! 209: -1, -1, -1, -1, -1, -1, -1, -1, ! 210: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 211: { KBD_SH_CAPS, { 0x38, 0x2A, -1, -1, -1, -1, -1, -1, ! 212: -1, -1, -1, -1, -1, -1, -1, -1, ! 213: -1, -1, -1, -1, -1, -1, -1, -1, ! 214: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 215: { KBD_SH_CAPS, { 0x30, 0x29, -1, -1, -1, -1, -1, -1, ! 216: -1, -1, -1, -1, -1, -1, -1, -1, ! 217: -1, -1, -1, -1, -1, -1, -1, -1, ! 218: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 219: { KBD_SH_CAPS, { 0x5D, 0x7D, -1, -1, -1, -1, -1, -1, ! 220: -1, -1, -1, -1, -1, -1, -1, -1, ! 221: -1, -1, -1, -1, -1, -1, -1, -1, ! 222: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 223: { KBD_SH_CAPS, { 0x6F, 0x4F, 0x0F, -1, -1, -1, -1, -1, ! 224: -1, -1, -1, -1, -1, -1, -1, -1, ! 225: -1, -1, -1, -1, -1, -1, -1, -1, ! 226: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 227: /* 0x20 */ ! 228: { KBD_SH_CAPS, { 0x75, 0x55, 0x15, -1, -1, -1, -1, -1, ! 229: -1, -1, -1, -1, -1, -1, -1, -1, ! 230: -1, -1, -1, -1, -1, -1, -1, -1, ! 231: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 232: { KBD_SH_CAPS, { 0x5B, 0x7B, -1, -1, -1, -1, -1, -1, ! 233: -1, -1, -1, -1, -1, -1, -1, -1, ! 234: -1, -1, -1, -1, -1, -1, -1, -1, ! 235: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 236: { KBD_SH_CAPS, { 0x69, 0x49, 0x09, -1, -1, -1, -1, -1, ! 237: -1, -1, -1, -1, -1, -1, -1, -1, ! 238: -1, -1, -1, -1, -1, -1, -1, -1, ! 239: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 240: { KBD_SH_CAPS, { 0x70, 0x50, 0x10, -1, -1, -1, -1, -1, ! 241: -1, -1, -1, -1, -1, -1, -1, -1, ! 242: -1, -1, -1, -1, -1, -1, -1, -1, ! 243: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 244: { KBD_MOD_MAP(0x0D), }, ! 245: { KBD_SH_CAPS, { 0x6C, 0x4C, 0x0C, -1, -1, -1, -1, -1, ! 246: -1, -1, -1, -1, -1, -1, -1, -1, ! 247: -1, -1, -1, -1, -1, -1, -1, -1, ! 248: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 249: { KBD_SH_CAPS, { 0x6A, 0x4A, 0x0A, -1, -1, -1, -1, -1, ! 250: -1, -1, -1, -1, -1, -1, -1, -1, ! 251: -1, -1, -1, -1, -1, -1, -1, -1, ! 252: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 253: { KBD_SH_CAPS, { 0x27, 0x22, -1, -1, -1, -1, -1, -1, ! 254: -1, -1, -1, -1, -1, -1, -1, -1, ! 255: -1, -1, -1, -1, -1, -1, -1, -1, ! 256: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 257: /* 0x28 */ ! 258: { KBD_SH_CAPS, { 0x6B, 0x4B, 0x0B, -1, -1, -1, -1, -1, ! 259: -1, -1, -1, -1, -1, -1, -1, -1, ! 260: -1, -1, -1, -1, -1, -1, -1, -1, ! 261: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 262: { KBD_SH_CAPS, { 0x3B, 0x3A, -1, -1, -1, -1, -1, -1, ! 263: -1, -1, -1, -1, -1, -1, -1, -1, ! 264: -1, -1, -1, -1, -1, -1, -1, -1, ! 265: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 266: { KBD_SH_CAPS, { 0x5C, 0x7C, -1, -1, -1, -1, -1, -1, ! 267: -1, -1, -1, -1, -1, -1, -1, -1, ! 268: -1, -1, -1, -1, -1, -1, -1, -1, ! 269: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 270: { KBD_SH_CAPS, { 0x2C, 0x3C, -1, -1, -1, -1, -1, -1, ! 271: -1, -1, -1, -1, -1, -1, -1, -1, ! 272: -1, -1, -1, -1, -1, -1, -1, -1, ! 273: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 274: { KBD_SH_CAPS, { 0x2F, 0x3F, -1, -1, -1, -1, -1, -1, ! 275: -1, -1, -1, -1, -1, -1, -1, -1, ! 276: -1, -1, -1, -1, -1, -1, -1, -1, ! 277: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 278: { KBD_SH_CAPS, { 0x6E, 0x4E, 0x0E, -1, -1, -1, -1, -1, ! 279: -1, -1, -1, -1, -1, -1, -1, -1, ! 280: -1, -1, -1, -1, -1, -1, -1, -1, ! 281: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 282: { KBD_SH_CAPS, { 0x6D, 0x4D, 0x0D, -1, -1, -1, -1, -1, ! 283: -1, -1, -1, -1, -1, -1, -1, -1, ! 284: -1, -1, -1, -1, -1, -1, -1, -1, ! 285: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 286: { KBD_SH_CAPS, { 0x2E, 0x3E, -1, -1, -1, -1, -1, -1, ! 287: -1, -1, -1, -1, -1, -1, -1, -1, ! 288: -1, -1, -1, -1, -1, -1, -1, -1, ! 289: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 290: /* 0x30 : tab */ ! 291: { KBD_MOD_MAP(0x09), }, ! 292: /* 0x31 : space */ ! 293: { KBD_MOD_MAP(0x20), }, ! 294: /* 0x32 : '<' '>' */ ! 295: { KBD_SH_CAPS, { 0x3C, 0x3E, -1, -1, -1, -1, -1, -1, /* ? */ ! 296: -1, -1, -1, -1, -1, -1, -1, -1, ! 297: -1, -1, -1, -1, -1, -1, -1, -1, ! 298: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 299: /* 0x33 : backspace */ ! 300: { KBD_MOD_MAP(0x08), }, ! 301: { KBD_MAP_NONE, }, ! 302: /* 0x35 : ESC */ ! 303: { KBD_MOD_MAP(0x1B), }, ! 304: /* 0x36 : control */ ! 305: { KBD_MOD_MAP_LCTRL, }, ! 306: /* 0x37 : command */ ! 307: { KBD_MOD_MAP_LCMD, }, ! 308: /* 0x38 : left shift */ ! 309: { KBD_MOD_MAP_LSHIFT, }, ! 310: /* 0x39 : caps-lock */ ! 311: { KBD_MOD_MAP_CAPS, }, ! 312: /* 0x3A : option */ ! 313: { KBD_MOD_MAP_LOPT, }, ! 314: /* 0x3B : left */ ! 315: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_LEFT)), }, ! 316: /* 0x3C : right */ ! 317: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_RIGHT)), }, ! 318: /* 0x3D : down */ ! 319: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_DOWN)), }, ! 320: /* 0x3E : up */ ! 321: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_UP)), }, ! 322: { KBD_MAP_NONE, }, ! 323: /* 0x40 */ ! 324: { KBD_MAP_NONE, }, ! 325: { KBD_SH_NUML, { 0x7F, 0x2E, -1, -1, -1, -1, -1, -1, ! 326: -1, -1, -1, -1, -1, -1, -1, -1, ! 327: -1, -1, -1, -1, -1, -1, -1, -1, ! 328: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 329: { KBD_MAP_NONE, }, ! 330: { KBD_SH_NONE, { 0x2A, 0x2A, -1, -1, -1, -1, -1, -1, ! 331: -1, -1, -1, -1, -1, -1, -1, -1, ! 332: -1, -1, -1, -1, -1, -1, -1, -1, ! 333: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 334: { KBD_MAP_NONE, }, ! 335: { KBD_SH_NONE, { 0x2B, 0x2B, -1, -1, -1, -1, -1, -1, ! 336: -1, -1, -1, -1, -1, -1, -1, -1, ! 337: -1, -1, -1, -1, -1, -1, -1, -1, ! 338: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 339: { KBD_MAP_NONE, }, ! 340: { KBD_MOD_MAP(0x7F), }, ! 341: /* 0x48 */ ! 342: { KBD_MAP_NONE, }, ! 343: { KBD_MAP_NONE, }, ! 344: { KBD_MAP_NONE, }, ! 345: { KBD_SH_NONE, { 0x2F, 0x2F, -1, -1, -1, -1, -1, -1, ! 346: -1, -1, -1, -1, -1, -1, -1, -1, ! 347: -1, -1, -1, -1, -1, -1, -1, -1, ! 348: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 349: { KBD_MOD_MAP(0x0D), }, ! 350: { KBD_MAP_NONE, }, ! 351: { KBD_SH_NONE, { 0x2D, 0x2D, -1, -1, -1, -1, -1, -1, ! 352: -1, -1, -1, -1, -1, -1, -1, -1, ! 353: -1, -1, -1, -1, -1, -1, -1, -1, ! 354: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 355: { KBD_MAP_NONE, }, ! 356: /* 0x50 */ ! 357: { KBD_MAP_NONE, }, ! 358: { KBD_SH_NONE, { 0x3D, 0x3D, -1, -1, -1, -1, -1, -1, ! 359: -1, -1, -1, -1, -1, -1, -1, -1, ! 360: -1, -1, -1, -1, -1, -1, -1, -1, ! 361: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 362: { KBD_SH_NUML, { -1, 0x30, -1, -1, -1, -1, -1, -1, ! 363: -1, -1, -1, -1, -1, -1, -1, -1, ! 364: -1, -1, -1, -1, -1, -1, -1, -1, ! 365: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 366: { KBD_SH_NUML, { -1, 0x31, -1, -1, -1, -1, -1, -1, ! 367: -1, -1, -1, -1, -1, -1, -1, -1, ! 368: -1, -1, -1, -1, -1, -1, -1, -1, ! 369: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 370: { KBD_SH_NUML, { -1, 0x32, -1, -1, -1, -1, -1, -1, ! 371: -1, -1, -1, -1, -1, -1, -1, -1, ! 372: -1, -1, -1, -1, -1, -1, -1, -1, ! 373: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 374: { KBD_SH_NUML, { -1, 0x33, -1, -1, -1, -1, -1, -1, ! 375: -1, -1, -1, -1, -1, -1, -1, -1, ! 376: -1, -1, -1, -1, -1, -1, -1, -1, ! 377: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 378: { KBD_SH_NUML, { -1, 0x34, -1, -1, -1, -1, -1, -1, ! 379: -1, -1, -1, -1, -1, -1, -1, -1, ! 380: -1, -1, -1, -1, -1, -1, -1, -1, ! 381: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 382: { KBD_SH_NUML, { -1, 0x35, -1, -1, -1, -1, -1, -1, ! 383: -1, -1, -1, -1, -1, -1, -1, -1, ! 384: -1, -1, -1, -1, -1, -1, -1, -1, ! 385: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 386: /* 0x58 */ ! 387: { KBD_SH_NUML, { -1, 0x36, -1, -1, -1, -1, -1, -1, ! 388: -1, -1, -1, -1, -1, -1, -1, -1, ! 389: -1, -1, -1, -1, -1, -1, -1, -1, ! 390: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 391: { KBD_SH_NUML, { -1, 0x37, -1, -1, -1, -1, -1, -1, ! 392: -1, -1, -1, -1, -1, -1, -1, -1, ! 393: -1, -1, -1, -1, -1, -1, -1, -1, ! 394: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 395: { KBD_MAP_NONE, }, ! 396: { KBD_SH_NUML, { -1, 0x38, -1, -1, -1, -1, -1, -1, ! 397: -1, -1, -1, -1, -1, -1, -1, -1, ! 398: -1, -1, -1, -1, -1, -1, -1, -1, ! 399: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 400: { KBD_SH_NUML, { -1, 0x39, -1, -1, -1, -1, -1, -1, ! 401: -1, -1, -1, -1, -1, -1, -1, -1, ! 402: -1, -1, -1, -1, -1, -1, -1, -1, ! 403: -1, -1, -1, -1, -1, -1, -1, -1, }, }, ! 404: { KBD_MAP_NONE, }, ! 405: { KBD_MOD_MAP(0x2F), }, ! 406: { KBD_MAP_NONE, }, ! 407: /* 0x60 : F5 */ ! 408: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F5)), }, ! 409: /* 0x61 : F6 */ ! 410: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F6)), }, ! 411: /* 0x62 : F7 */ ! 412: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F7)), }, ! 413: /* 0x63 : F3 */ ! 414: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F3)), }, ! 415: /* 0x64 : F8 */ ! 416: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F8)), }, ! 417: /* 0x65 : F9 */ ! 418: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F9)), }, ! 419: { KBD_MAP_NONE, }, ! 420: /* 0x67 : F11 */ ! 421: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F11)), }, ! 422: /* 0x68 */ ! 423: { KBD_MAP_NONE, }, ! 424: /* 0x69 : F13 */ ! 425: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F13)), }, ! 426: { KBD_MAP_NONE, }, ! 427: /* 0x6B : F14 */ ! 428: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F14)), }, ! 429: { KBD_MAP_NONE, }, ! 430: /* 0x6D : F10 */ ! 431: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F10)), }, ! 432: { KBD_MAP_NONE, }, ! 433: /* 0x6F : F12 */ ! 434: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F12)), }, ! 435: /* 0x70 */ ! 436: { KBD_MAP_NONE, }, ! 437: /* 0x71 : F15 */ ! 438: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F15)), }, ! 439: /* 0x72 : help */ ! 440: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_HELP)), }, ! 441: /* 0x73 : home */ ! 442: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_HOME)), }, ! 443: /* 0x74 : page up */ ! 444: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_PAGE_UP)), }, ! 445: /* 0x75 : del */ ! 446: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_DELETE)), }, ! 447: /* 0x76 : F4 */ ! 448: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F4)), }, ! 449: /* 0x77 : end */ ! 450: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_END)), }, ! 451: /* 0x78 : F2 */ ! 452: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F2)), }, ! 453: /* 0x79 : page down */ ! 454: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_PAGE_UP)), }, ! 455: /* 0x7A : F1 */ ! 456: { KBD_MOD_MAP(KBD_SEQUENCE(KEY_F1)), }, ! 457: /* 0x7B : right shift */ ! 458: { KBD_MOD_MAP_RSHIFT, }, ! 459: /* 0x7C : right option */ ! 460: { KBD_MOD_MAP_ROPT, }, ! 461: /* 0x7D : right control */ ! 462: { KBD_MOD_MAP_RCTRL, }, ! 463: { KBD_MAP_NONE, }, ! 464: /* 0x7F : power */ ! 465: { KBD_MAP_NONE, }, ! 466: }; ! 467: ! 468: typedef struct adb_kbd_t adb_kbd_t; ! 469: struct adb_kbd_t { ! 470: kbd_t kbd; ! 471: int next_key; ! 472: char sequence[ADB_MAX_SEQUENCE_LEN]; ! 473: int len; ! 474: }; ! 475: ! 476: static adb_dev_t *my_adb_dev = NULL; ! 477: ! 478: static int adb_kbd_read (void *private) ! 479: { ! 480: uint8_t buffer[ADB_BUF_SIZE]; ! 481: adb_dev_t *dev = private; ! 482: adb_kbd_t *kbd; ! 483: int key; ! 484: int ret; ! 485: ! 486: kbd = dev->state; ! 487: ! 488: if (kbd->len > 0) { ! 489: ret = kbd->sequence[kbd->len-- - 1]; ! 490: ADB_DPRINTF("Buffered %d (%02x)\n", ret, ret); ! 491: return ret; ! 492: } ! 493: ! 494: /* Get saved state */ ! 495: ret = -1; ! 496: for (key = -1; key == -1; ) { ! 497: if (kbd->next_key != -1) { ! 498: key = kbd->next_key; ! 499: kbd->next_key = -1; ! 500: } else { ! 501: if (adb_reg_get(dev, 0, buffer) != 2) ! 502: break; ! 503: kbd->next_key = buffer[1] == 0xFF ? -1 : buffer[1]; ! 504: key = buffer[0]; ! 505: } ! 506: ret = kbd_translate_key(&kbd->kbd, key & 0x7F, key >> 7, kbd->sequence); ! 507: if (ret > 0) { ! 508: kbd->len = ret; ! 509: ret = kbd->sequence[kbd->len-- - 1]; ! 510: } ! 511: ! 512: ADB_DPRINTF("Translated %d (%02x) into %d (%02x)\n", ! 513: key, key, ret, ret); ! 514: } ! 515: ! 516: return ret; ! 517: } ! 518: ! 519: ! 520: void *adb_kbd_new (char *path, void *private) ! 521: { ! 522: char buf[64]; ! 523: int props[1]; ! 524: phandle_t ph, aliases; ! 525: adb_kbd_t *kbd; ! 526: adb_dev_t *dev = private; ! 527: kbd = (adb_kbd_t*)malloc(sizeof(adb_kbd_t)); ! 528: if (kbd != NULL) { ! 529: memset(kbd, 0, sizeof(adb_kbd_t)); ! 530: kbd_set_keymap(&kbd->kbd, sizeof(ADB_kbd_us) / sizeof(keymap_t), ! 531: ADB_kbd_us, ADB_sequences); ! 532: kbd->next_key = -1; ! 533: kbd->len = 0; ! 534: dev->state = kbd; ! 535: my_adb_dev = dev; ! 536: } ! 537: ! 538: snprintf(buf, sizeof(buf), "%s/keyboard", path); ! 539: REGISTER_NAMED_NODE( keyboard, buf); ! 540: ! 541: ph = find_dev(buf); ! 542: ! 543: set_property(ph, "device_type", "keyboard", 9); ! 544: props[0] = __cpu_to_be32(dev->addr); ! 545: set_property(ph, "reg", (char *)&props, sizeof(props)); ! 546: ! 547: aliases = find_dev("/aliases"); ! 548: set_property(aliases, "adb-keyboard", buf, strlen(buf) + 1); ! 549: ! 550: return kbd; ! 551: } ! 552: ! 553: /* ( addr len -- actual ) */ ! 554: static void keyboard_read(void) ! 555: { ! 556: char *addr; ! 557: int len, key, i; ! 558: len=POP(); ! 559: addr=(char *)cell2pointer(POP()); ! 560: ! 561: for (i = 0; i < len; i++) { ! 562: key = adb_kbd_read(my_adb_dev); ! 563: if (key == -1 || key == -2) ! 564: break; ! 565: *addr++ = (char)key; ! 566: } ! 567: PUSH(i); ! 568: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.