1 /* $NetBSD: kbdvar.h,v 1.8 2001/12/09 12:03:32 pk Exp $ */ 2 3 /* 4 * Copyright (c) 1992, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This software was developed by the Computer Systems Engineering group 8 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 9 * contributed to Berkeley. 10 * 11 * All advertising materials mentioning features or use of this software 12 * must display the following acknowledgement: 13 * This product includes software developed by the University of 14 * California, Lawrence Berkeley Laboratory. 15 * 16 * Redistribution and use in source and binary forms, with or without 17 * modification, are permitted provided that the following conditions 18 * are met: 19 * 1. Redistributions of source code must retain the above copyright 20 * notice, this list of conditions and the following disclaimer. 21 * 2. Redistributions in binary form must reproduce the above copyright 22 * notice, this list of conditions and the following disclaimer in the 23 * documentation and/or other materials provided with the distribution. 24 * 3. All advertising materials mentioning features or use of this software 25 * must display the following acknowledgement: 26 * This product includes software developed by the University of 27 * California, Berkeley and its contributors. 28 * 4. Neither the name of the University nor the names of its contributors 29 * may be used to endorse or promote products derived from this software 30 * without specific prior written permission. 31 * 32 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 33 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 34 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 35 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 36 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 40 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 41 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 42 * SUCH DAMAGE. 43 * 44 * @(#)kbd.c 8.2 (Berkeley) 10/30/93 45 */ 46 47 #include <sys/callout.h> 48 49 /* 50 * How many input characters we can buffer. 51 * The port-specific var.h may override this. 52 * Note: must be a power of two! 53 */ 54 #define KBD_RX_RING_SIZE 256 55 #define KBD_RX_RING_MASK (KBD_RX_RING_SIZE-1) 56 /* 57 * Output buffer. Only need a few chars. 58 */ 59 #define KBD_TX_RING_SIZE 16 60 #define KBD_TX_RING_MASK (KBD_TX_RING_SIZE-1) 61 /* 62 * Keyboard serial line speed defaults to 1200 bps. 63 */ 64 #define KBD_DEFAULT_BPS 1200 65 #define KBD_RESET_TIMO 1000 /* mS. */ 66 67 /* 68 * XXX - Historical comment - no longer quite right... 69 * Keyboard driver state. The ascii and kbd links go up and down and 70 * we just sit in the middle doing translation. Note that it is possible 71 * to get just one of the two links, in which case /dev/kbd is unavailable. 72 * The downlink supplies us with `internal' open and close routines which 73 * will enable dataflow across the downlink. We promise to call open when 74 * we are willing to take keystrokes, and to call close when we are not. 75 * If /dev/kbd is not the console tty input source, we do this whenever 76 * /dev/kbd is in use; otherwise we just leave it open forever. 77 */ 78 struct zs_chanstate; 79 struct ucom_softc; 80 81 struct kbd_softc { 82 struct device k_dev; /* required first: base device */ 83 84 /* Stuff our parent setup */ 85 union { 86 struct zs_chanstate *ku_cs; 87 struct ucom_softc *ku_usc; 88 void *ku_priv; 89 } k_u; 90 #define k_cs k_u.ku_cs 91 #define k_usc k_u.ku_usc 92 #define k_priv k_u.ku_priv 93 94 /* 95 * The deviopen and deviclose routines are provided 96 * by the lower level driver and used as a back door 97 * when opening and closing the internal device. 98 */ 99 int (*k_deviopen) __P((struct device *, int)); 100 int (*k_deviclose) __P((struct device *, int)); 101 void (*k_write_data) __P((struct kbd_softc *, int)); 102 103 /* Flags to communicate with kbd_softint() */ 104 volatile int k_intr_flags; 105 #define INTR_RX_OVERRUN 1 106 #define INTR_TX_EMPTY 2 107 #define INTR_ST_CHECK 4 108 109 /* Transmit state */ 110 volatile int k_txflags; 111 #define K_TXBUSY 1 112 #define K_TXWANT 2 113 114 /* 115 * State of upper interface. 116 */ 117 int k_isopen; /* set if open has been done */ 118 int k_evmode; /* set if we should produce events */ 119 struct evvar k_events; /* event queue state */ 120 121 /* 122 * ACSI translation state 123 */ 124 int k_repeat_start; /* initial delay */ 125 int k_repeat_step; /* inter-char delay */ 126 int k_repeatsym; /* repeating symbol */ 127 int k_repeating; /* we've called timeout() */ 128 struct kbd_state k_state; /* ASCII translation state */ 129 130 struct callout k_repeat_ch; 131 132 /* Console hooks */ 133 char k_isconsole; 134 struct cons_channel *k_cc; 135 136 /* 137 * Magic sequence stuff (L1-A) 138 */ 139 char k_magic1_down; 140 u_char k_magic1; /* L1 */ 141 u_char k_magic2; /* A */ 142 143 /* 144 * The transmit ring buffer. 145 */ 146 volatile u_int k_tbget; /* transmit buffer `get' index */ 147 volatile u_int k_tbput; /* transmit buffer `put' index */ 148 u_char k_tbuf[KBD_TX_RING_SIZE]; /* data */ 149 150 /* 151 * The receive ring buffer. 152 */ 153 u_int k_rbget; /* ring buffer `get' index */ 154 volatile u_int k_rbput; /* ring buffer `put' index */ 155 u_short k_rbuf[KBD_RX_RING_SIZE]; /* rr1, data pairs */ 156 157 }; 158 159 /* functions used between backend/frontend keyboard drivers */ 160 void kbd_input_raw __P((struct kbd_softc *k, int)); 161 void kbd_output(struct kbd_softc *k, int c); 162 void kbd_start_tx(struct kbd_softc *k); 163 int kbd_cc_open __P((struct cons_channel *)); 164 int kbd_cc_close __P((struct cons_channel *)); 165 166 /* 167 * kbd console input channel interface. 168 * XXX - does not belong in this header; but for now, kbd is the only user.. 169 */ 170 struct cons_channel { 171 /* Provided by lower driver */ 172 void *cc_dev; /* Lower device private data */ 173 struct callout cc_callout; 174 int (*cc_iopen) /* Open lower device */ 175 __P((struct cons_channel *)); 176 int (*cc_iclose) /* Close lower device */ 177 __P((struct cons_channel *)); 178 179 /* Provided by upper driver */ 180 void (*cc_upstream)__P((int)); /* Send a character upstream */ 181 }; 182 183 /* Special hook to attach the keyboard driver to the console */ 184 void cons_attach_input __P((struct cons_channel *, struct consdev *)); 185