1/* $OpenBSD: wsmousevar.h,v 1.15 2017/06/18 13:21:48 bru Exp $ */
2/* $NetBSD: wsmousevar.h,v 1.4 2000/01/08 02:57:24 takemura Exp $ */
3
4/*
5 * Copyright (c) 1996, 1997 Christopher G. Demetriou.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *      This product includes software developed by Christopher G. Demetriou
18 *	for the NetBSD Project.
19 * 4. The name of the author may not be used to endorse or promote products
20 *    derived from this software without specific prior written permission
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/*
35 * Copyright (c) 2015, 2016 Ulf Brosziewski
36 *
37 * Permission to use, copy, modify, and distribute this software for any
38 * purpose with or without fee is hereby granted, provided that the above
39 * copyright notice and this permission notice appear in all copies.
40 *
41 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
42 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
43 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
44 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
45 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
46 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
47 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
48 */
49
50#ifndef _WSMOUSEVAR_H_
51#define _WSMOUSEVAR_H_
52
53#ifdef _KERNEL
54
55/*
56 * WSMOUSE interfaces.
57 */
58
59/*
60 * Mouse access functions (must be provided by all mice).
61 *
62 * There is a "void *" cookie provided by the mouse driver associated
63 * with these functions, which is passed to them when they are invoked.
64 */
65struct wsmouse_accessops {
66	int	(*enable)(void *);
67	int	(*ioctl)(void *v, u_long cmd, caddr_t data, int flag,
68		    struct proc *p);
69	void	(*disable)(void *);
70};
71
72/*
73 * Attachment information provided by wsmousedev devices when attaching
74 * wsmouse units.
75 */
76struct wsmousedev_attach_args {
77	const struct wsmouse_accessops *accessops;	/* access ops */
78	void	*accesscookie;				/* access cookie */
79};
80
81#define	wsmousedevcf_mux	cf_loc[WSMOUSEDEVCF_MUX]
82
83/*
84 * Autoconfiguration helper functions.
85 */
86int	wsmousedevprint(void *, const char *);
87
88
89/* Process standard mouse input. */
90#define WSMOUSE_INPUT(sc_wsmousedev, btns, dx, dy, dz, dw)		\
91	do {								\
92		wsmouse_buttons((sc_wsmousedev), (btns));		\
93		wsmouse_motion((sc_wsmousedev), (dx), (dy), (dz), (dw));\
94		wsmouse_input_sync(sc_wsmousedev);			\
95	} while (0)
96
97
98/* Process standard touchpad input. */
99#define WSMOUSE_TOUCH(sc_wsmousedev, btns, x, y, pressure, contacts)	\
100	do {								\
101		wsmouse_buttons((sc_wsmousedev), (btns));		\
102		wsmouse_position((sc_wsmousedev), (x), (y));		\
103		wsmouse_touch((sc_wsmousedev), (pressure), (contacts));	\
104		wsmouse_input_sync(sc_wsmousedev);			\
105	} while (0)
106
107
108/*
109 * Drivers for touchpads that don't report pressure values can pass
110 * WSMOUSE_DEFAULT_PRESSURE to wsmouse_touch or wsmouse_mtstate.
111 *
112 * A pressure value of 0 signals that a touch has been released (coordinates
113 * will be ignored). Based on its pressure argument, wsmouse_touch will
114 * normalize the contact count (drivers for touch devices that don't
115 * recognize multiple contacts can always pass 0 as contact count to
116 * wsmouse_touch).
117 */
118/* Use a synaptics-compatible value. */
119#define WSMOUSE_DEFAULT_PRESSURE	45
120
121
122struct device;
123
124/*
125 * Type codes for wsmouse_set. REL_X/Y, MT_REL_X/Y, and TOUCH_WIDTH
126 * cannot be reported by other functions. Please note that REL_X/Y
127 * values are deltas to be applied to the absolute coordinates and
128 * don't represent "pure" relative motion.
129 */
130enum wsmouseval {
131	WSMOUSE_REL_X,
132	WSMOUSE_ABS_X,
133	WSMOUSE_REL_Y,
134	WSMOUSE_ABS_Y,
135	WSMOUSE_PRESSURE,
136	WSMOUSE_CONTACTS,
137	WSMOUSE_TOUCH_WIDTH,
138	WSMOUSE_MT_REL_X,
139	WSMOUSE_MT_ABS_X,
140	WSMOUSE_MT_REL_Y,
141	WSMOUSE_MT_ABS_Y,
142	WSMOUSE_MT_PRESSURE
143};
144
145#define WSMOUSE_IS_MT_CODE(code) \
146    ((code) >= WSMOUSE_MT_REL_X && (code) <= WSMOUSE_MT_PRESSURE)
147
148struct mtpoint {
149	int x;
150	int y;
151	int pressure;
152	int slot;		/* An output field, set by wsmouse_mtframe. */
153};
154
155/* Report button state. */
156void wsmouse_buttons(struct device *, u_int);
157
158/* Report motion deltas (dx, dy, dz, dw). */
159void wsmouse_motion(struct device *, int, int, int, int);
160
161/* Report absolute coordinates (x, y). */
162void wsmouse_position(struct device *, int, int);
163
164/* Report (single-)touch input (pressure, contacts). */
165void wsmouse_touch(struct device *, int, int);
166
167/* Report slot-based multitouch input (slot, x, y, pressure). */
168void wsmouse_mtstate(struct device *, int, int, int, int);
169
170/* Report multitouch input (mtpoints, size). */
171void wsmouse_mtframe(struct device *, struct mtpoint *, int);
172
173/* Report a single value (type, value, aux). */
174void wsmouse_set(struct device *, enum wsmouseval, int, int);
175
176/* Assign or look up a slot number for a tracking ID (id). */
177int wsmouse_id_to_slot(struct device *, int);
178
179
180/* Synchronize (generate wscons events) */
181void wsmouse_input_sync(struct device *);
182
183
184/* Initialize MT structures (num_slots, tracking). */
185int wsmouse_mt_init(struct device *, int, int);
186
187#define WSMOUSE_MT_SLOTS_MAX 10
188#define WSMOUSE_MT_INIT_TRACKING 1
189
190/* Switch between compatibility mode and native mode. */
191int wsmouse_set_mode(struct device *, int);
192
193/* Read/Set parameter values. */
194int wsmouse_get_params(struct device *, struct wsmouse_param *, u_int);
195int wsmouse_set_params(struct device *, const struct wsmouse_param *, u_int);
196
197
198enum wsmousehw_type {
199	WSMOUSEHW_RAW,
200	WSMOUSEHW_MOUSE,
201	WSMOUSEHW_TOUCHPAD,
202	WSMOUSEHW_CLICKPAD,
203	WSMOUSEHW_TPANEL,
204};
205
206/*
207 * wsmousehw.flags
208 */
209/* Invert Y-coordinates */
210#define WSMOUSEHW_LR_DOWN 	(1 << 0)
211/* Allocate the buffers for wsmouse_mtframe(). */
212#define WSMOUSEHW_MT_TRACKING	(1 << 1)
213
214
215/*
216 * The more or less minimal hardware description for the default
217 * configuration.
218 *
219 * Drivers that report coordinates with a downward orientation
220 * must set the flag WSMOUSEHW_LR_DOWN. Drivers for MT hardware
221 * must provide the number of slots. If they use wsmouse_mtframe(),
222 * WSMOUSEHW_MT_TRACKING must be set.
223 *
224 * The resolution values are optional.
225 */
226struct wsmousehw {
227	int type;		/* WSMOUSE_TYPE_*, cf. wsconsio.h */
228	enum wsmousehw_type hw_type;
229	int x_min;
230	int x_max;
231	int y_min;
232	int y_max;
233	int h_res;
234	int v_res;
235
236	int flags;
237	int mt_slots;
238
239	int contacts_max;	/* inclusive (not needed for MT touchpads) */
240};
241
242struct wsmousehw *wsmouse_get_hw(struct device*);
243
244/* Configure the input context. */
245int wsmouse_configure(struct device *, struct wsmouse_param *, u_int);
246
247#endif /* _KERNEL */
248
249#endif /* _WSMOUSEVAR_H_ */
250