Home | History | Annotate | Line # | Download | only in sun
kbdsunvar.h revision 1.1
      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