xref: /netbsd/sys/dev/dec/vsxxx.c (revision bf9ec67e)
1 /* $NetBSD: vsxxx.c,v 1.4 2002/03/17 19:40:55 atatat Exp $ */
2 
3 /*
4  * Copyright (c) 1999 Tohru Nishimura.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *      This product includes software developed by Tohru Nishimura.
17  *	for the NetBSD Project.
18  * 4. The name of the author may not be used to endorse or promote products
19  *    derived from this software without specific prior written permission
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #include <sys/cdefs.h>
34 __KERNEL_RCSID(0, "$NetBSD: vsxxx.c,v 1.4 2002/03/17 19:40:55 atatat Exp $");
35 
36 /*
37  * Common machinary for VSXXX mice and tablet
38  */
39 
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/device.h>
43 
44 #include <dev/wscons/wsconsio.h>
45 #include <dev/wscons/wsmousevar.h>
46 
47 #include <dev/dec/vsxxxvar.h>
48 
49 /*
50  * XXX XXX XXX
51  *
52  * collect various mice and tablet parameters/protocol design
53  * and establish vsxxx.h
54  *
55  * XXX XXX XXX
56  */
57 #define	VS_SELFTEST	'T'
58 #define	VS_INCREMENTAL	'R'
59 #define	VS_PROMPTING	'D'
60 #define	VS_REQ_POSITION	'P'
61 
62 #define	VS_MOUSE_REPSZ	3
63 #define	VS_TABLET_REPSZ	5
64 
65 /* first octet */
66 #define	VS_START_FRAME	0x80
67 #define	VS_R_BUTTON	0x01
68 #define	VS_M_BUTTON	0x02
69 #define	VS_L_BUTTON	0x04
70 #define	VS_Y_SIGN	0x08
71 #define	VS_X_SIGN	0x10
72 
73 /* low order 4 bit of the second octet in a SELFTEST reply */
74 #define	VS_MOUSE	0x2
75 #define	VS_TABLET	0x4
76 
77 extern struct cfdriver vsms_cd;
78 
79 static int  vsxxx_enable __P((void *));
80 static int  vsxxx_ioctl __P((void *, u_long, caddr_t, int, struct proc *));
81 static void vsxxx_disable __P((void *));
82 
83 struct wsmouse_accessops vsxxx_accessops = {	/* EXPORT */
84 	vsxxx_enable,				/* MD? */
85 	vsxxx_ioctl,
86 	vsxxx_disable,				/* MD? */
87 };
88 
89 static int
90 vsxxx_enable(v)
91 	void *v;
92 {
93 	/* turn on the hardware? */
94 	((struct vsxxx_softc *)v)->sc_nbyte = 0;
95 	return 0;
96 }
97 
98 static void
99 vsxxx_disable(v)
100 	void *v;
101 {
102 	/* turn off the hardware? */
103 }
104 
105 /*ARGUSED*/
106 static int
107 vsxxx_ioctl(v, cmd, data, flag, p)
108 	void *v;
109 	u_long cmd;
110 	caddr_t data;
111 	int flag;
112 	struct proc *p;
113 {
114 	if (cmd == WSMOUSEIO_GTYPE) {
115 		*(u_int *)data = WSMOUSE_TYPE_VSXXX;
116 		return 0;
117 	}
118 	return EPASSTHROUGH;
119 }
120 
121 /* EXPORT */ void
122 vsxxx_input(data)
123 	int data;
124 {
125 	struct vsxxx_softc *sc = (void *)vsms_cd.cd_devs[0];
126 	int x, y;
127 
128 	if (data & VS_START_FRAME)
129 		sc->sc_nbyte = 0;
130 
131 	sc->sc_report.raw[sc->sc_nbyte++] = data;
132 
133 	if (sc->sc_nbyte < VS_MOUSE_REPSZ)
134 		return;
135 	sc->sc_nbyte = 0;
136 
137 	x = sc->sc_report.ms.xpos;
138 	y = sc->sc_report.ms.ypos;
139 	if ((sc->sc_report.raw[0] & VS_X_SIGN) == 0)
140 		x = -x;
141 	if ((sc->sc_report.raw[0] & VS_Y_SIGN) != 0)
142 		y = -y;					/* Eeeh? */
143 	wsmouse_input(sc->sc_wsmousedev, sc->sc_report.raw[0] & 07, x, y, 0,
144 		      WSMOUSE_INPUT_DELTA);
145 }
146