Annotation of sys/arch/vax/dec/dzkbd.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: dzkbd.c,v 1.12 2006/08/27 16:50:43 miod Exp $ */
2: /* $NetBSD: dzkbd.c,v 1.1 2000/12/02 17:03:55 ragge Exp $ */
3:
4: /*
5: * Copyright (c) 1992, 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * This software was developed by the Computer Systems Engineering group
9: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
10: * contributed to Berkeley.
11: *
12: * All advertising materials mentioning features or use of this software
13: * must display the following acknowledgement:
14: * This product includes software developed by the University of
15: * California, Lawrence Berkeley Laboratory.
16: *
17: * Redistribution and use in source and binary forms, with or without
18: * modification, are permitted provided that the following conditions
19: * are met:
20: * 1. Redistributions of source code must retain the above copyright
21: * notice, this list of conditions and the following disclaimer.
22: * 2. Redistributions in binary form must reproduce the above copyright
23: * notice, this list of conditions and the following disclaimer in the
24: * documentation and/or other materials provided with the distribution.
25: * 3. Neither the name of the University nor the names of its contributors
26: * may be used to endorse or promote products derived from this software
27: * without specific prior written permission.
28: *
29: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39: * SUCH DAMAGE.
40: *
41: * @(#)kbd.c 8.2 (Berkeley) 10/30/93
42: */
43:
44: /*
45: * LK200/LK400 keyboard attached to line 0 of the DZ*-11
46: */
47:
48: #include <sys/param.h>
49: #include <sys/systm.h>
50: #include <sys/device.h>
51: #include <sys/ioctl.h>
52: #include <sys/syslog.h>
53: #include <sys/malloc.h>
54: #include <sys/timeout.h>
55:
56: #include <dev/wscons/wsconsio.h>
57: #include <dev/wscons/wskbdvar.h>
58: #include <dev/wscons/wsksymdef.h>
59: #include <dev/wscons/wsksymvar.h>
60: #include <vax/dec/wskbdmap_lk201.h>
61:
62: #include <machine/bus.h>
63:
64: #include <vax/qbus/dzreg.h>
65: #include <vax/qbus/dzvar.h>
66:
67: #include <vax/dec/dzkbdvar.h>
68: #include <vax/dec/lk201reg.h>
69: #include <vax/dec/lk201var.h>
70:
71: struct dzkbd_internal {
72: struct dz_linestate *dzi_ls;
73: struct lk201_state dzi_ks;
74: };
75:
76: struct dzkbd_internal dzkbd_console_internal;
77:
78: struct dzkbd_softc {
79: struct device dzkbd_dev; /* required first: base device */
80:
81: struct dzkbd_internal *sc_itl;
82: int sc_enabled;
83: struct device *sc_wskbddev;
84: };
85:
86: int dzkbd_match(struct device *, struct cfdata *, void *);
87: void dzkbd_attach(struct device *, struct device *, void *);
88:
89: struct cfattach dzkbd_ca = {
90: sizeof(struct dzkbd_softc), (cfmatch_t)dzkbd_match, dzkbd_attach,
91: };
92:
93: int dzkbd_enable(void *, int);
94: void dzkbd_set_leds(void *, int);
95: int dzkbd_ioctl(void *, u_long, caddr_t, int, struct proc *);
96:
97: const struct wskbd_accessops dzkbd_accessops = {
98: dzkbd_enable,
99: dzkbd_set_leds,
100: dzkbd_ioctl,
101: };
102:
103: void dzkbd_cngetc(void *, u_int *, int *);
104: void dzkbd_cnpollc(void *, int);
105:
106: const struct wskbd_consops dzkbd_consops = {
107: dzkbd_cngetc,
108: dzkbd_cnpollc,
109: };
110:
111: const struct wskbd_mapdata dzkbd_keymapdata = {
112: lkkbd_keydesctab,
113: #ifdef LKKBD_LAYOUT
114: LKKBD_LAYOUT,
115: #else
116: KB_US,
117: #endif
118: };
119:
120: int dzkbd_input(void *, int);
121: int dzkbd_sendchar(void *, int);
122:
123: /*
124: * kbd_match: how is this dz line configured?
125: */
126: int
127: dzkbd_match(struct device *parent, struct cfdata *cf, void *aux)
128: {
129: struct dzkm_attach_args *daa = aux;
130:
131: #define DZCF_LINE 0
132: #define DZCF_LINE_DEFAULT 0
133:
134: /* Exact match is better than wildcard. */
135: if (cf->cf_loc[DZCF_LINE] == daa->daa_line)
136: return 2;
137:
138: /* This driver accepts wildcard. */
139: if (cf->cf_loc[DZCF_LINE] == DZCF_LINE_DEFAULT)
140: return 1;
141:
142: return 0;
143: }
144:
145: void
146: dzkbd_attach(struct device *parent, struct device *self, void *aux)
147: {
148: struct dz_softc *dz = (void *)parent;
149: struct dzkbd_softc *dzkbd = (void *)self;
150: struct dzkm_attach_args *daa = aux;
151: struct dz_linestate *ls;
152: struct dzkbd_internal *dzi;
153: struct wskbddev_attach_args a;
154: int isconsole;
155:
156: dz->sc_dz[daa->daa_line].dz_catch = dzkbd_input;
157: dz->sc_dz[daa->daa_line].dz_private = dzkbd;
158: ls = &dz->sc_dz[daa->daa_line];
159:
160: isconsole = (daa->daa_flags & DZKBD_CONSOLE);
161:
162: if (isconsole) {
163: dzi = &dzkbd_console_internal;
164: dzkbd->sc_enabled = 1;
165: } else {
166: dzi = malloc(sizeof(struct dzkbd_internal), M_DEVBUF, M_NOWAIT);
167: if (dzi == NULL) {
168: printf(": out of memory\n");
169: return;
170: }
171: dzi->dzi_ks.attmt.sendchar = dzkbd_sendchar;
172: dzi->dzi_ks.attmt.cookie = ls;
173: }
174: dzi->dzi_ks.device = self;
175: dzi->dzi_ls = ls;
176: dzkbd->sc_itl = dzi;
177:
178: printf("\n");
179:
180: if (!isconsole)
181: lk201_init(&dzi->dzi_ks);
182:
183: a.console = dzi == &dzkbd_console_internal;
184: a.keymap = &dzkbd_keymapdata;
185: a.accessops = &dzkbd_accessops;
186: a.accesscookie = dzkbd;
187:
188: dzkbd->sc_wskbddev = config_found(self, &a, wskbddevprint);
189: }
190:
191: int
192: dzkbd_cnattach(struct dz_linestate *ls)
193: {
194:
195: dzkbd_console_internal.dzi_ks.attmt.sendchar = dzkbd_sendchar;
196: dzkbd_console_internal.dzi_ks.attmt.cookie = ls;
197: lk201_init(&dzkbd_console_internal.dzi_ks);
198: dzkbd_console_internal.dzi_ls = ls;
199:
200: wskbd_cnattach(&dzkbd_consops, &dzkbd_console_internal,
201: &dzkbd_keymapdata);
202:
203: return 0;
204: }
205:
206: int
207: dzkbd_enable(void *v, int on)
208: {
209: struct dzkbd_softc *sc = v;
210:
211: sc->sc_enabled = on;
212: return 0;
213: }
214:
215: void
216: dzkbd_cngetc(void *v, u_int *type, int *data)
217: {
218: struct dzkbd_internal *dzi = v;
219: int c;
220:
221: do {
222: c = dzgetc(dzi->dzi_ls);
223: } while (lk201_decode(&dzi->dzi_ks, 1, 0, c, type, data) == LKD_NODATA);
224: }
225:
226: void
227: dzkbd_cnpollc(void *v, int on)
228: {
229: #if 0
230: struct dzkbd_internal *dzi = v;
231: #endif
232: }
233:
234: void
235: dzkbd_set_leds(void *v, int leds)
236: {
237: struct dzkbd_softc *sc = (struct dzkbd_softc *)v;
238:
239: lk201_set_leds(&sc->sc_itl->dzi_ks, leds);
240: }
241:
242: int
243: dzkbd_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
244: {
245: struct dzkbd_softc *sc = (struct dzkbd_softc *)v;
246:
247: switch (cmd) {
248: case WSKBDIO_GTYPE:
249: *(int *)data = lk201_get_type(&sc->sc_itl->dzi_ks);
250: return 0;
251: case WSKBDIO_SETLEDS:
252: lk201_set_leds(&sc->sc_itl->dzi_ks, *(int *)data);
253: return 0;
254: case WSKBDIO_GETLEDS:
255: *(int *)data = lk201_get_leds(&sc->sc_itl->dzi_ks);
256: return 0;
257: case WSKBDIO_COMPLEXBELL:
258: lk201_bell(&sc->sc_itl->dzi_ks,
259: (struct wskbd_bell_data *)data);
260: return 0;
261: }
262: return -1;
263: }
264:
265: int
266: dzkbd_input(void *v, int data)
267: {
268: struct dzkbd_softc *sc = (struct dzkbd_softc *)v;
269: u_int type;
270: int val;
271: int decode;
272:
273: /*
274: * We want to run through lk201_decode always, so that a late plugged
275: * keyboard will get configured correctly.
276: */
277: do {
278: decode = lk201_decode(&sc->sc_itl->dzi_ks, sc->sc_enabled, 1,
279: data, &type, &val);
280: if (decode != LKD_NODATA)
281: wskbd_input(sc->sc_wskbddev, type, val);
282: } while (decode == LKD_MORE);
283:
284: return(1);
285: }
286:
287: int
288: dzkbd_sendchar(void *v, int c)
289: {
290: dzputc((struct dz_linestate *)v, c);
291: return (0);
292: }
CVSweb