xref: /netbsd-src/sys/dev/sun/kbdsunvar.h (revision 37b34d511dea595d3ba03a661cf3b775038ea5f8)
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