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