|
|
1.1 ! root 1: /* @(#)kbd.h 1.1 86/02/03 SMI */ ! 2: ! 3: /* (C) Copyright 1983 by Sun Microsystems, Inc. */ ! 4: ! 5: /* ! 6: * Header file for Sun Microsystems keyboard routines ! 7: * which is disgustingly similar to ../mon/keyboard.h. ! 8: * Since the Sun kernel uses these constants to decode ! 9: * at least the keybid passed by the monitor, these files ! 10: * must be kept in sync, or merged. ! 11: * ! 12: * The keyboard is a standard Micro Switch, or otherwise, keyboard, ! 13: * with an 8048/8748 on the board. This has been modified to produce ! 14: * up/down keycodes. ! 15: * ! 16: * On Sun-1 keyboards these keycodes are output on 8 parallel output lines. ! 17: * Each keycode is held stable on these lines for a minimum of 2.5 ms in ! 18: * order that the main processor can read it during its refresh ! 19: * routine, which executes every 2 ms or so. ! 20: * ! 21: * On Sun-2 keyboards, the keycodes are transmitted on a serial line ! 22: * at 1200 baud. ! 23: * ! 24: * When no physical keys are depressed, the keyboard transmits a keycode of ! 25: * "IDLE" (7F hex), to indicate that. Thus, when the last key is released, ! 26: * a keycode for its release is sent, then an IDLE. Note that virtual ! 27: * keys on the VT100 kbd (eg CAPS LOCK) can be down when the IDLE code ! 28: * is received. ! 29: * ! 30: * The Sun-1 VT100 keyboard will follow each of its IDLE's with a ! 31: * keyboard id code, identifying the key layout or other factors ! 32: * which host programs might want to automatically determine. ! 33: * ! 34: * The low 4 bits of the id byte contain the keyboard ID (currently ! 35: * 1 for VT100 keyboard); the high order bit is set (to make sure ! 36: * there's a transition between the IDLE (7F) and the identification ! 37: * byte); the -XXX---- bits contain state information about the keyboard. ! 38: * These bits are allocated from opposite ends in case we need to shift ! 39: * the boundary. The only state bit currently defined is 0x40, which is ! 40: * the current state of the CAPS LOCK LED. ! 41: * ! 42: * The Sun-2 keyboard also transmits two other "special" keycodes: ! 43: * ! 44: * RESETKEY upon power-up, when no errors are detected, ! 45: * this code is sent and followed by the keyboard id, ! 46: * a byte containing 0x02. ! 47: * ! 48: * ERRORKEY upon power-up, when errors are detected, ! 49: * this code is sent and followed by a "cause" byte ! 50: * giving more details. There is only one cause byte ! 51: * defined so far -- checksum error on PROM. ! 52: */ ! 53: ! 54: /* ! 55: * Various special characters that might show up on the port ! 56: */ ! 57: /* Both of these are followed by 1 byte of parameters. */ ! 58: #define RESETKEY 0xFF /* Keyboard was just reset */ ! 59: #define ERRORKEY 0x7E /* Keyboard detected an error */ ! 60: #define NOTPRESENT 0xFF /* Keyboard is not plugged in */ ! 61: ! 62: #define IDLEKEY 0x7F /* Keyboard is idle; no keys down */ ! 63: #define PRESSED 0x00 /* 0x80 bit off: key was pressed */ ! 64: #define RELEASED 0x80 /* 0x80 bit on : key was released */ ! 65: ! 66: /* ! 67: * Keyboard ID codes...transmitted by the various keyboards ! 68: * after the IDLEKEY code. See top of file for more details. ! 69: * The value of KB_UNKNOWN above must not match any of these, ! 70: * if KBDID is set. ! 71: */ ! 72: #define KB_KLUNK 0x00 /* Micro Switch 103SD32-2 */ ! 73: #define KB_VT100 0x01 /* Keytronics VT100 compatible */ ! 74: #define KB_SUN2 0x02 /* Sun-2 custom keyboard */ ! 75: #define KB_SUN3 0x03 /* Sun-3 custom keyboard */ ! 76: #define KB_ASCII 0x0F /* Ascii terminal masquerading as kbd */ ! 77: ! 78: /* ! 79: * Commands to the Sun-2 keyboard. ! 80: */ ! 81: #define KBD_CMD_RESET 0x01 /* Reset keyboard as if power-up */ ! 82: #define KBD_CMD_BELL 0x02 /* Turn on the bell */ ! 83: #define KBD_CMD_NOBELL 0x03 /* Turn off the bell */ ! 84: #define KBD_CMD_LED1 0x04 /* Turn on LED 1 */ ! 85: #define KBD_CMD_NOLED1 0x05 /* Turn off LED 1 */ ! 86: #define KBD_CMD_LED2 0x06 /* Turn on LED 2 */ ! 87: #define KBD_CMD_NOLED2 0x07 /* Turn off LED 2 */ ! 88: ! 89: /* ! 90: * Commands to the Sun-3 keyboard. KBD_CMD_BELL & KBD_CMD_NOBELL work ! 91: * as well. ! 92: */ ! 93: #define KBD_CMD_CLICK 0x0A /* Turn on the click annunciator */ ! 94: #define KBD_CMD_NOCLICK 0x0B /* Turn off the click annunciator */ ! 95: ! 96: /* ! 97: * Software related definitions ! 98: */ ! 99: /* ! 100: * These are the states that the keyboard scanner can be in. ! 101: * ! 102: * It starts out in NORMAL state. ! 103: */ ! 104: #define NORMAL 0 /* The usual (ho, hum) */ ! 105: #define ABORT1 1 /* Got KEYABORT1 */ ! 106: #define IDLE1 2 /* Got IDLE */ ! 107: #define IDLE2 3 /* Got id byte, IDLE probably follows */ ! 108: ! 109: /* ! 110: * These are how you can have your input translated. ! 111: * TR_EVENT means that each keystroke is sent as a firm event. ! 112: */ ! 113: #define TR_NONE 0 ! 114: #define TR_ASCII 1 ! 115: #define TR_EVENT 2 ! 116: ! 117: /* ! 118: * These bits can appear in the result of TR_NONE getkey()s. ! 119: */ ! 120: #define STATEOF(key) ((key) & 0x80) /* 0 = key down, 0x80 = key up */ ! 121: #define KEYOF(key) ((key) & 0x7F) /* The key number that moved */ ! 122: #define NOKEY (-1) /* The argument was 0, and no key was ! 123: depressed. They were all elated. */ ! 124: ! 125: /* ! 126: * These bits can appear in the result of TR_ASCII getkey()s. ! 127: * (NOKEY can also appear if no keypress was queued up.) ! 128: */ ! 129: #define METABIT 0 /* Meta key depressed with key */ ! 130: #define METAMASK 0x000080 ! 131: #define SYSTEMBIT 1 /* Upper left key was down w/key */ ! 132: #define SYSTEMMASK 0x000100 ! 133: /* other "bucky" bits can be defined at will. See "BUCKYBITS" below. */ ! 134: ! 135: /* ! 136: * This defines the bit positions used within "shiftmask" to ! 137: * indicate the "pressed" (1) or "released" (0) state of shift keys. ! 138: * Both the bit numbers, and the aggregate masks, are defined. ! 139: * ! 140: * The "UPMASK" is a minor kludge. Since whether the key is going ! 141: * up or down determines the translation table (just as the shift ! 142: * keys' positions do), we OR it with "shiftmask" to get "tempmask", ! 143: * which is the mask which is actually used to determine the ! 144: * translation table to use. Don't reassign 0x0080 for anything ! 145: * else, or we'll have to shift and such to squeeze in UPMASK, ! 146: * since it comes in from the hardware as 0x80. ! 147: */ ! 148: #ifndef CAPSLOCK /* Same as sunwindow/win_input.h */ ! 149: #define CAPSLOCK 0 /* Caps Lock key */ ! 150: #define CAPSMASK 0x0001 ! 151: #define SHIFTLOCK 1 /* Shift Lock key */ ! 152: #define LEFTSHIFT 2 /* Left-hand shift key */ ! 153: #define RIGHTSHIFT 3 /* Right-hand shift key */ ! 154: #define SHIFTMASK 0x000E ! 155: #define LEFTCTRL 4 /* Left-hand (or only) control key */ ! 156: #define RIGHTCTRL 5 /* Right-hand control key */ ! 157: #define CTRLMASK 0x0030 ! 158: #endif CAPSLOCK ! 159: /* unused... 0x0040 */ ! 160: #define UPMASK 0x0080 ! 161: #define CTLSMASK 0x0100 /* Set if ^S was last keyed of ^S, ^Q; ! 162: determines which NOSCOLL sends. */ ! 163: #define ALT 6 /* ALT key on Sun-3 keyboard */ ! 164: ! 165: /* ! 166: * This defines the format of translation tables. ! 167: * ! 168: * A translation table is 128 bytes of "entries", which are bytes ! 169: * (unsigned chars). The top 4 bits of each entry are decoded by ! 170: * a case statement in getkey.c. If the entry is less than 0x80, it ! 171: * is sent out as an ASCII character (possibly with bucky bits ! 172: * OR-ed in). "Special" entries are 0x80 or greater, and ! 173: * invoke more complicated actions. ! 174: */ ! 175: struct keymap { ! 176: unsigned char keymap[128]; /* maps keycodes to actions */ ! 177: }; ! 178: ! 179: /* ! 180: * A keyboard is defined by its keymaps and what state it resets at idle. ! 181: * ! 182: * The masks k_idleshifts and k_idlebuckys are AND-ed with the current ! 183: * state of shiftmask and buckybits when a "keyboard idle" code ! 184: * is received. This ensures that where we "think" the shift & bucky ! 185: * keys are, more accurately reflects where they really are, since the ! 186: * keyboard knows better than us. However, some keyboards don't know ! 187: * about shift states that should be remembered across idles. Such ! 188: * shifts are described by k_toggleshifts. k_toggleshifts are used to ! 189: * identify such shifts. A toggle shift state is maintained separately ! 190: * from the general shift state. The toggle shift state is OR-ed ! 191: * with the state general shift state when an idle is received. ! 192: * k_toggleshifts should not appear in the k_up table. ! 193: */ ! 194: struct keyboard { ! 195: struct keymap *k_normal; /* Unshifted */ ! 196: struct keymap *k_shifted; /* Shifted */ ! 197: struct keymap *k_caps; /* Caps locked */ ! 198: struct keymap *k_control; /* Controlled */ ! 199: struct keymap *k_up; /* Key went up */ ! 200: int k_idleshifts; /* Shifts that keep across idle */ ! 201: int k_idlebuckys; /* Bucky bits that keep across idle */ ! 202: unsigned char k_abort1; /* 1st key of abort sequence */ ! 203: unsigned char k_abort2; /* 2nd key of abort sequence */ ! 204: int k_toggleshifts; /* Shifts that toggle on down from kbd ! 205: * and keep across idle */ ! 206: }; ! 207: ! 208: ! 209: /* ! 210: * The "special" entries' top 4 bits are defined below. Generally they are ! 211: * used with a 4-bit parameter (such as a bit number) in the low 4 bits. ! 212: * The bytes whose top 4 bits are 0x0 thru 0x7 happen to be ascii ! 213: * characters. They are not special cased, but just normal cased. ! 214: */ ! 215: ! 216: #define SHIFTKEYS 0x80 /* thru 0x8F. This key helps to determine the ! 217: translation table used. The bit ! 218: position of its bit in "shiftmask" ! 219: is added to the entry, eg ! 220: SHIFTKEYS+LEFTCTRL. When this entry is ! 221: invoked, the bit in "shiftmask" is ! 222: toggled. Depending which tables you put ! 223: it in, this works well for hold-down ! 224: keys or press-on, press-off keys. */ ! 225: #define BUCKYBITS 0x90 /* thru 0x9F. This key determines the state of ! 226: one of the "bucky" bits above the ! 227: returned ASCII character. This is ! 228: basically a way to pass mode-key-up/down ! 229: information back to the caller with each ! 230: "real" key depressed. The concept, and ! 231: name "bucky" (derivation unknown) comes ! 232: from the MIT/SAIL "TV" system...they had ! 233: TOP, META, CTRL, and a few other bucky ! 234: bits. The bit position of its bit in ! 235: "buckybits", minus 7, is added to the ! 236: entry; eg bit 0x00000400 is BUCKYBITS+3. ! 237: The "-7" prevents us from messing up the ! 238: ASCII char, and gives us 16 useful bucky ! 239: bits. When this entry is invoked, ! 240: the designated bit in "buckybits" is ! 241: toggled. Depending which tables you put ! 242: it in, this works well for hold-down ! 243: keys or press-on, press-off keys. */ ! 244: #define FUNNY 0xA0 /* thru 0xAF. This key does one of 16 funny ! 245: things based on the low 4 bits: */ ! 246: #define NOP 0xA0 /* This key does nothing. */ ! 247: #define OOPS 0xA1 /* This key exists but is undefined. */ ! 248: #define HOLE 0xA2 /* This key does not exist on the keyboard. ! 249: Its position code should never be ! 250: generated. This indicates a software/ ! 251: hardware mismatch, or bugs. */ ! 252: #define NOSCROLL 0xA3 /* This key alternately sends ^S or ^Q */ ! 253: #define CTRLS 0xA4 /* This sends ^S and lets NOSCROLL know */ ! 254: #define CTRLQ 0xA5 /* This sends ^Q and lets NOSCROLL know */ ! 255: #define RESET 0xA6 /* Kbd was just reset */ ! 256: #define ERROR 0xA7 /* Kbd just detected an internal error */ ! 257: #define IDLE 0xA8 /* Kbd is idle (no keys down) */ ! 258: /* Combinations 0xA9 to 0xAF are reserved for non-parameterized functions */ ! 259: ! 260: #define STRING 0xB0 /* thru 0xBF. The low-order 4 bits index ! 261: a table select a string to be returned, ! 262: char by char. Each entry the table is ! 263: null terminated. */ ! 264: #define KTAB_STRLEN 10 /* Maximum string length (including null) */ ! 265: /* Definitions for the individual string numbers: */ ! 266: #define HOMEARROW 0x00 ! 267: #define UPARROW 0x01 ! 268: #define DOWNARROW 0x02 ! 269: #define LEFTARROW 0x03 ! 270: #define RIGHTARROW 0x04 ! 271: /* string numbers 5 thru F are available to users making custom entries */ ! 272: ! 273: /* In the following function key groupings, the low-order 4 bits indicate ! 274: the function key number with in the group. */ ! 275: #define LEFTFUNC 0xC0 /* thru 0xCF. The "left" group. */ ! 276: #define RIGHTFUNC 0xD0 /* thru 0xDF. The "right" group. */ ! 277: #define TOPFUNC 0xE0 /* thru 0xEF. The "top" group. */ ! 278: #define BOTTOMFUNC 0xF0 /* thru 0xFF. The "bottom" group. */ ! 279: #define LF(n) (LEFTFUNC+(n)-1) ! 280: #define RF(n) (RIGHTFUNC+(n)-1) ! 281: #define TF(n) (TOPFUNC+(n)-1) ! 282: #define BF(n) (BOTTOMFUNC+(n)-1) ! 283: /* The actual keyboard positions may not be on the left/right/top/bottom ! 284: of the physical keyboard (although they usually are). ! 285: What is important is that we have reserved 64 keys for function keys. ! 286: ! 287: Normally, striking a function key will cause the following escape sequence ! 288: to be sent through the character stream: ! 289: ESC[0..9z ! 290: where ESC is a single escape character and 0..9 indicate some number of ! 291: digits needed to encode the function key as a decimal number. */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.