1 /* 2 * Keyboard driver - middle layer for sun keyboard off a serial line. 3 * This code is used by kbd_zs and sunkbd drivers. 4 */ 5 6 /* 7 * How many input characters we can buffer. 8 * The port-specific var.h may override this. 9 * Note: must be a power of two! 10 */ 11 #define KBD_RX_RING_SIZE 256 12 #define KBD_RX_RING_MASK (KBD_RX_RING_SIZE - 1) 13 14 /* 15 * Output buffer. Only need a few chars. 16 */ 17 #define KBD_TX_RING_SIZE 16 18 #define KBD_TX_RING_MASK (KBD_TX_RING_SIZE - 1) 19 /* 20 * Keyboard serial line speed defaults to 1200 bps. 21 */ 22 #define KBD_DEFAULT_BPS 1200 23 #define KBD_RESET_TIMO 1000 /* mS. */ 24 25 26 struct kbd_sun_softc { 27 /* upper layer (also inherits struct device) */ 28 struct kbd_softc k_kbd; 29 30 union { 31 void *ku_priv; 32 struct zs_chanstate *ku_cs; 33 } k_u; 34 #define k_priv k_u.ku_priv 35 #define k_cs k_u.ku_cs 36 37 /* 38 * The deviopen and deviclose routines are provided by the 39 * underlying lower level driver and used as a back door when 40 * opening and closing the internal device. 41 */ 42 int (*k_deviopen)(struct device *, int); 43 int (*k_deviclose)(struct device *, int); 44 45 /* 46 * Callback provided by the lower layer (actual device driver). 47 * Middle layer uses it to send commands to sun keyboard. 48 */ 49 void (*k_write_data)(struct kbd_sun_softc *, int); 50 51 /* Was initialized once. */ 52 int k_isopen; 53 54 /* 55 * Magic sequence stuff (Stop-A, aka L1-A). 56 * XXX: convert to cnmagic(9). 57 */ 58 char k_magic1_down; 59 u_char k_magic1; /* L1 */ 60 u_char k_magic2; /* A */ 61 62 /* Autorepeat for sun keyboards is handled in software */ 63 int k_repeat_start; /* initial delay */ 64 int k_repeat_step; /* inter-char delay */ 65 int k_repeatsym; /* repeating symbol */ 66 int k_repeating; /* callout is active (use callout_active?) */ 67 struct callout k_repeat_ch; 68 69 /* Expecting ID or layout byte from keyboard */ 70 int k_expect; 71 #define KBD_EXPECT_IDCODE 1 72 #define KBD_EXPECT_LAYOUT 2 73 74 /* Flags to communicate with kbd_softint() */ 75 volatile int k_intr_flags; 76 #define INTR_RX_OVERRUN 1 77 #define INTR_TX_EMPTY 2 78 #define INTR_ST_CHECK 4 79 80 /* Transmit state */ 81 volatile int k_txflags; 82 #define K_TXBUSY 1 83 #define K_TXWANT 2 84 85 /* 86 * The transmit ring buffer. 87 */ 88 volatile u_int k_tbget; /* transmit buffer `get' index */ 89 volatile u_int k_tbput; /* transmit buffer `put' index */ 90 u_char k_tbuf[KBD_TX_RING_SIZE]; /* data */ 91 92 /* 93 * The receive ring buffer. 94 */ 95 u_int k_rbget; /* ring buffer `get' index */ 96 volatile u_int k_rbput; /* ring buffer `put' index */ 97 u_short k_rbuf[KBD_RX_RING_SIZE]; /* rr1, data pairs */ 98 }; 99 100 /* Middle layer methods exported to the upper layer. */ 101 extern struct kbd_ops kbd_ops_sun; 102 103 /* Methods for lower layer to call. */ 104 extern void kbd_sun_input(struct kbd_sun_softc *k, int); 105 extern void kbd_sun_output(struct kbd_sun_softc *k, int c); 106 extern void kbd_sun_start_tx(struct kbd_sun_softc *k); 107