1b2535c44Smckusick /*
2*c02ddb16Sbostic  * Copyright (c) 1992, 1993
3*c02ddb16Sbostic  *	The Regents of the University of California.  All rights reserved.
4b2535c44Smckusick  *
5b2535c44Smckusick  * This code is derived from software contributed to Berkeley by
6b2535c44Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
7b2535c44Smckusick  *
8b2535c44Smckusick  * %sccs.include.redist.c%
9b2535c44Smckusick  *
10*c02ddb16Sbostic  *	@(#)kbms_if.c	8.1 (Berkeley) 06/11/93
11b2535c44Smckusick  */
12b2535c44Smckusick 
13b2535c44Smckusick /* Keyboard Mouse Gate-array control routine */
14b2535c44Smckusick 
15a4eab072Sutashiro #include <machine/adrsmap.h>
16b2535c44Smckusick 
17b2535c44Smckusick #include "ms.h"
18b2535c44Smckusick #include "bm.h"
19b2535c44Smckusick 
20a4eab072Sutashiro #include <sys/param.h>
21a4eab072Sutashiro #include <news3400/sio/scc.h>
22b2535c44Smckusick 
23d9eca660Sutashiro #if defined(news3200)
24a4eab072Sutashiro #include <sys/time.h>
25a4eab072Sutashiro #include <news3400/iop/mouse.h>
26b2535c44Smckusick #endif
27b2535c44Smckusick 
28b2535c44Smckusick typedef struct kbm_sw {
29b2535c44Smckusick 	u_char *stat_port;	/* Status port */
30b2535c44Smckusick 	u_char *data_port;	/* Data port */
31b2535c44Smckusick 	u_char *intr_port;	/* Interrupt port */
32b2535c44Smckusick 	u_char *reset_port;	/* Reset port */
33b2535c44Smckusick 	u_char *init1_port;	/* Initialize port 1 */
34b2535c44Smckusick 	u_char *init2_port;	/* Initialize port 2 */
35b2535c44Smckusick 	u_char *buzz_port;	/* Buzzer port */
36b2535c44Smckusick 	u_char *buzzf_port;	/* Buzzer frequency port */
37b2535c44Smckusick 	u_char intr_en;		/* Data for Interrupt Enable */
38b2535c44Smckusick 	u_char intr_in;		/* Interrupt Occur flag */
39b2535c44Smckusick 	u_char data_rdy;	/* Data Ready flag */
40b2535c44Smckusick 	u_char init1;		/* Speed */
41b2535c44Smckusick 	u_char init2;		/* Clock */
42b2535c44Smckusick 	u_char buzzf;		/* Buzzer frequency */
43b2535c44Smckusick } Kbm_sw;
44b2535c44Smckusick 
45b2535c44Smckusick #define OFF 0x80
46b2535c44Smckusick struct kbm_sw Kbm_port[] = {
47b2535c44Smckusick 	{
48b2535c44Smckusick #ifdef news3400
49b2535c44Smckusick 		(u_char *) MOUSE_STAT,
50b2535c44Smckusick #else
51b2535c44Smckusick 		(u_char *) KEYB_STAT,
52b2535c44Smckusick #endif
53b2535c44Smckusick 		(u_char *) MOUSE_DATA,
54b2535c44Smckusick 		(u_char *) MOUSE_INTE,
55b2535c44Smckusick 		(u_char *) MOUSE_RESET,
56b2535c44Smckusick 		(u_char *) MOUSE_INIT1,
57b2535c44Smckusick 		(u_char *) MOUSE_INIT2,
58b2535c44Smckusick 		(u_char *) KEYB_BUZZ,
59b2535c44Smckusick 		(u_char *) KEYB_BUZZF,
60b2535c44Smckusick 		RX_MSINTE,
61b2535c44Smckusick 		RX_MSINT,
62b2535c44Smckusick 		RX_MSRDY,
63b2535c44Smckusick #ifdef news3400
64b2535c44Smckusick 		0x80,	/* 1200 bps */
65b2535c44Smckusick 		0,
66b2535c44Smckusick 		0
67b2535c44Smckusick #else
68b2535c44Smckusick 		1,
69b2535c44Smckusick 		0xe0,
70b2535c44Smckusick 		0x0a
71b2535c44Smckusick #endif
72b2535c44Smckusick 	},
73b2535c44Smckusick 	{
74b2535c44Smckusick 		(u_char *) KEYB_STAT,
75b2535c44Smckusick 		(u_char *) KEYB_DATA,
76b2535c44Smckusick 		(u_char *) KEYB_INTE,
77b2535c44Smckusick 		(u_char *) KEYB_RESET,
78b2535c44Smckusick 		(u_char *) KEYB_INIT1,
79b2535c44Smckusick 		(u_char *) KEYB_INIT2,
80b2535c44Smckusick 		(u_char *) KEYB_BUZZ,
81b2535c44Smckusick 		(u_char *) KEYB_BUZZF,
82b2535c44Smckusick 		RX_KBINTE,
83b2535c44Smckusick 		RX_KBINT,
84b2535c44Smckusick 		RX_KBRDY,
85b2535c44Smckusick #ifdef news3400
86b2535c44Smckusick 		0xf0,	/* 9600 bps */
87b2535c44Smckusick 		0,
88b2535c44Smckusick 		0
89b2535c44Smckusick #else
90b2535c44Smckusick 		0,
91b2535c44Smckusick 		0xc0,
92b2535c44Smckusick 		0x0a
93b2535c44Smckusick #endif
94b2535c44Smckusick 	}
95b2535c44Smckusick };
96b2535c44Smckusick 
kbm_open(chan)97b2535c44Smckusick kbm_open(chan)
98b2535c44Smckusick 	int chan;
99b2535c44Smckusick {
100b2535c44Smckusick 	register Kbm_sw *kbm = &Kbm_port[chan];
101b2535c44Smckusick 
102b2535c44Smckusick #ifdef news3400
103b2535c44Smckusick 	/*
104b2535c44Smckusick 	 * Reset KB I/F.
105b2535c44Smckusick 	 * Disable KB interrupt.
106b2535c44Smckusick 	 * Clear KB overrun flag.
107b2535c44Smckusick 	 */
108b2535c44Smckusick 	*(volatile u_char *)kbm->reset_port = (u_char)0x01;
109b2535c44Smckusick 	*(volatile u_char *)kbm->init1_port = kbm->init1;
110b2535c44Smckusick 	if (chan == SCC_MOUSE)
111b2535c44Smckusick 		*(volatile u_char *)kbm->intr_port |= kbm->intr_en;
112b2535c44Smckusick #else
113b2535c44Smckusick 	*kbm->reset_port = (u_char)0;
114b2535c44Smckusick 	*kbm->intr_port = (u_char)1;
115b2535c44Smckusick #endif
116b2535c44Smckusick 	kbd_flush();
117b2535c44Smckusick }
118b2535c44Smckusick 
kbm_close(chan)119b2535c44Smckusick kbm_close(chan)
120b2535c44Smckusick 	int chan;
121b2535c44Smckusick {
122b2535c44Smckusick 	register Kbm_sw *kbm = &Kbm_port[chan];
123b2535c44Smckusick 
124b2535c44Smckusick #ifdef news3400
125b2535c44Smckusick 	*(volatile u_char *)kbm->reset_port = (u_char)0x01;
126b2535c44Smckusick #else
127b2535c44Smckusick 	*kbm->reset_port = (u_char)0;
128b2535c44Smckusick 	*kbm->intr_port = (u_char)0;
129b2535c44Smckusick #endif
130b2535c44Smckusick }
131b2535c44Smckusick 
kbm_rint(chan)132b2535c44Smckusick kbm_rint(chan)
133b2535c44Smckusick 	int chan;
134b2535c44Smckusick {
135b2535c44Smckusick #ifdef news3400
136b2535c44Smckusick 	volatile u_char *port = (volatile u_char *)Kbm_port[chan].data_port;
137b2535c44Smckusick 	volatile u_char *stat = (volatile u_char *)Kbm_port[chan].stat_port;
138b2535c44Smckusick 	volatile u_char *inte = (volatile u_char *)Kbm_port[chan].intr_port;
139b2535c44Smckusick #else
140b2535c44Smckusick 	register u_char *port = Kbm_port[chan].data_port;
141b2535c44Smckusick 	register u_char *stat = Kbm_port[chan].stat_port;
142b2535c44Smckusick 	register u_char *inte = Kbm_port[chan].intr_port;
143b2535c44Smckusick #endif
144b2535c44Smckusick 	int rdy = Kbm_port[chan].data_rdy;
145b2535c44Smckusick 	u_char code;
146b2535c44Smckusick 
147b2535c44Smckusick #ifdef news3400
148b2535c44Smckusick 	*inte &= ~Kbm_port[chan].intr_en;
149b2535c44Smckusick #endif
150b2535c44Smckusick 
151b2535c44Smckusick 	while (*stat & rdy) {
152b2535c44Smckusick 		code = *port;
153b2535c44Smckusick 		switch (chan) {
154b2535c44Smckusick 		    case SCC_MOUSE: {
155b2535c44Smckusick #if NMS > 0
156b2535c44Smckusick 			extern int _ms_helper();
157b2535c44Smckusick 
158b2535c44Smckusick 			if (xputc(code, SCC_MOUSE) < 0)
159b2535c44Smckusick 				printf("mouse queue overflow\n");
160b2535c44Smckusick 			/* KU:XXX softcall? */
161b2535c44Smckusick 			timeout(_ms_helper, (caddr_t)0, 0);
162b2535c44Smckusick #endif
163b2535c44Smckusick 			break;
164b2535c44Smckusick 		    }
165b2535c44Smckusick 		    case SCC_KEYBOARD: {
166b2535c44Smckusick #if NBM > 0
167b2535c44Smckusick 			extern int kb_softint();
168b2535c44Smckusick 
169b2535c44Smckusick 			if (xputc(code, SCC_KEYBOARD) < 0)
170b2535c44Smckusick 				printf("keyboard queue overflow\n");
171b2535c44Smckusick 			/* KU:XXX softcall? */
172b2535c44Smckusick 			timeout(kb_softint, (caddr_t)0, 0);
173b2535c44Smckusick #endif
174b2535c44Smckusick 			break;
175b2535c44Smckusick 		    }
176b2535c44Smckusick 		    default:
177b2535c44Smckusick 			printf("kb or ms stray intr\n");
178b2535c44Smckusick 			break;
179b2535c44Smckusick 		}
180b2535c44Smckusick 	}
181b2535c44Smckusick 
182b2535c44Smckusick #ifdef news3400
183b2535c44Smckusick 	*inte |= Kbm_port[chan].intr_en;
184b2535c44Smckusick #else
185b2535c44Smckusick 	*inte = 1;
186b2535c44Smckusick #endif
187b2535c44Smckusick }
188b2535c44Smckusick 
189b2535c44Smckusick 
kbm_write(chan,buf,count)190b2535c44Smckusick kbm_write(chan, buf, count)
191b2535c44Smckusick 	int chan;
192b2535c44Smckusick 	char *buf;
193b2535c44Smckusick 	register int count;
194b2535c44Smckusick {
195b2535c44Smckusick 	register u_char *port = Kbm_port[chan].buzz_port;
196b2535c44Smckusick 	int c_save = count;
197b2535c44Smckusick 
198b2535c44Smckusick #ifdef news3400
199b2535c44Smckusick 	*port = count / 3;
200b2535c44Smckusick #endif
201b2535c44Smckusick 
202b2535c44Smckusick 	return (c_save);
203b2535c44Smckusick }
204b2535c44Smckusick 
205b2535c44Smckusick int
kbm_getc(chan)206b2535c44Smckusick kbm_getc(chan)
207b2535c44Smckusick 	int chan;
208b2535c44Smckusick {
209b2535c44Smckusick #ifdef news3400
210b2535c44Smckusick 	volatile u_char *port = (volatile u_char *)Kbm_port[chan].data_port;
211b2535c44Smckusick 	volatile u_char *stat = (volatile u_char *)Kbm_port[chan].stat_port;
212b2535c44Smckusick #else
213b2535c44Smckusick 	register u_char *port = Kbm_port[chan].data_port;
214b2535c44Smckusick 	register u_char *stat = Kbm_port[chan].stat_port;
215b2535c44Smckusick #endif
216b2535c44Smckusick 	int rdy = Kbm_port[chan].data_rdy;
217b2535c44Smckusick 
218b2535c44Smckusick 	if (*stat & rdy)
219b2535c44Smckusick 		return (*port & 0xff);
220b2535c44Smckusick 	else
221b2535c44Smckusick 		return (-1);
222b2535c44Smckusick }
223