NetBSD-5.0.2/sys/compat/darwin/darwin_iohidsystem.h

/*	$NetBSD: darwin_iohidsystem.h,v 1.16 2008/04/28 20:23:41 martin Exp $ */

/*-
 * Copyright (c) 2003 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Emmanuel Dreyfus
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef	_DARWIN_IOHIDSYSTEM_H_
#define	_DARWIN_IOHIDSYSTEM_H_

extern struct mach_iokit_devclass darwin_iohidsystem_devclass;
extern struct mach_iokit_devclass darwin_iokbd_devclass;
extern struct mach_iokit_devclass darwin_iomouse_devclass;
extern struct mach_iokit_devclass darwin_ioresources_devclass;

/* Events and event queue */
#define DARWIN_NX_NULLEVENT	0
#define DARWIN_NX_LMOUSEDOWN	1
#define DARWIN_NX_LMOUSEUP	2
#define DARWIN_NX_RMOUSEDOWN	3
#define DARWIN_NX_RMOUSEUP	4
#define DARWIN_NX_MOUSEMOVED	5
#define DARWIN_NX_LMOUSEDRAGGED	6
#define DARWIN_NX_RMOUSEDRAGGED	7
#define DARWIN_NX_MOUSEENTERED	8
#define DARWIN_NX_MOUSEEXITED	9
#define DARWIN_NX_KEYDOWN	10
#define DARWIN_NX_KEYUP		11
#define DARWIN_NX_FLAGSCHANGED	12

#define DARWIN_NX_LMOUSEDOWN_MASK	(1 << DARWIN_NX_LMOUSEDOWN)
#define DARWIN_NX_LMOUSEUP_MASK		(1 << DARWIN_NX_LMOUSEUP)
#define DARWIN_NX_RMOUSEDOWN_MASK	(1 << DARWIN_NX_RMOUSEDOWN)
#define DARWIN_NX_RMOUSEUP_MASK		(1 << DARWIN_NX_RMOUSEUP)
#define DARWIN_NX_MOUSEMOVED_MASK	(1 << DARWIN_NX_MOUSEMOVED)
#define DARWIN_NX_LMOUSEDRAGGED_MASK	(1 << DARWIN_NX_LMOUSEDRAGGED)
#define DARWIN_NX_RMOUSEDRAGGED_MASK	(1 << DARWIN_NX_RMOUSEDRAGGED)
#define DARWIN_NX_MOUSEENTERED_MASK	(1 << DARWIN_NX_MOUSEENTERED)
#define DARWIN_NX_MOUSEEXITED_MASK	(1 << DARWIN_NX_MOUSEEXITED)
#define DARWIN_NX_KEYDOWN_MASK		(1 << DARWIN_NX_KEYDOWN)
#define DARWIN_NX_KEYUP_MASK		(1 << DARWIN_NX_KEYUP)
#define DARWIN_NX_FLAGSCHANGED_MASK	(1 << DARWIN_NX_FLAGSCHANGED)

typedef struct {
	uint16_t tabletid;
	uint16_t pointerid;
	uint16_t deviceid;
	uint16_t system_tabletid;
	uint16_t vendor_pointertype;
	uint32_t pointer_serialnum;
	uint64_t uniqueid;
	uint32_t cap_mask;
	uint8_t ptrtype;
	uint8_t enter_proximity;
	int16_t reserved1;
} darwin_iohidsystem_tabletproxymity;

typedef struct {
	int32_t x;
	int32_t y;
	int32_t z;
	uint16_t buttons;
	uint16_t pressure;
	struct {
		int16_t x;
		int16_t y;
	} tilt;
	uint16_t rotation;
	uint16_t tanpressure;
	uint16_t devid;
	uint16_t vendor1;
	uint16_t vendor2;
	uint16_t vendor3;
} darwin_iohidsystem_tabletpoint;

typedef union {
	struct {
		uint8_t subx;
		uint8_t suby;
		int16_t buttonid;
		int32_t click;
		uint8_t pressure;
		uint8_t reserved1;
		uint8_t subtype;
		uint8_t reserved2;
		uint32_t reserved3;
		union {
			darwin_iohidsystem_tabletpoint point;
			darwin_iohidsystem_tabletproxymity proximity;
		} tablet;
	} mouse;
	struct {
		int32_t dx;
		int32_t dy;
		uint8_t subx;
		uint8_t suby;
		uint8_t subtype;
		uint8_t reserved1;
		int32_t reserved2;
		union {
			darwin_iohidsystem_tabletpoint point;
			darwin_iohidsystem_tabletproxymity proximity;
		} tablet;
	} mouse_move;
	struct {
		uint16_t orig_charset;
		int16_t repeat;
		uint16_t charset;
		uint16_t charcode;
		uint16_t keycode;
		uint16_t orig_charcode;
		int32_t reserved1;
		int32_t keyboardtype;
		int32_t reserved2[7];
	} key;
	struct {
		int16_t reserved;
		int16_t eventnum;
		int32_t trackingnum;
		int32_t userdata;
		int32_t reserved5[9];
	} tracking;
	struct {
		int16_t da1;
		int16_t da2;
		int16_t da3;
		int16_t reserved1;
		int32_t reserved2[10];
	} scrollwheel;
	struct {
		int16_t reserved;
		int16_t subtype;
		union {
			float	F[11];
			long	L[11];
			short	S[22];
			char	C[44];
		} misc;
	} compound;
	struct {
		int32_t x;
		int32_t y;
		int32_t z;
		uint16_t buttons;
		uint16_t pressure;
		struct {
			int16_t x;
			int16_t y;
		} tilt;
		uint16_t rotation;
		int16_t tanpressure;
		uint16_t devid;
		int16_t vendor1;
		int16_t vendor2;
		int16_t vendor3;
		int32_t reserved[4];
	} tablet;
	struct {
		uint16_t vendorid;
		uint16_t tabletid;
		uint16_t pointerid;
		uint16_t deviceid;
		uint16_t systemtabletid;
		uint16_t vendor_pointertype;
		uint32_t pointer_serialnum;
		uint64_t uniqueid;
		uint32_t cap_mask;
		uint8_t ptr_type;
		uint8_t enter_proximity;
		int16_t reserved[9];
	} proximity;
} darwin_iohidsystem_event_data;

typedef struct {
	int dne_setcursor;
	int dne_type;
	darwin_iogpoint dne_location;
	darwin_iohidsystem_event_data dne_data;
	int dne_setflags;
	int dne_flags;
} darwin_nxll_event;

typedef struct {
	int die_type;
	int die_location_x;
	int die_location_y;
	unsigned long die_time_hi;
	unsigned long die_time_lo;
	int die_flags;
	unsigned int die_window;
	darwin_iohidsystem_event_data die_data;
} darwin_iohidsystem_event;

typedef struct {
	int diei_next;
	darwin_ev_lock_data_t diei_sem;
	/*
	 * Avoid automatic alignement, this should be
	 * darwin_iohidsystem_event, we declare it as a char array.
	 */
	unsigned char diei_event[76];
} darwin_iohidsystem_event_item;

#define DARWIN_IOHIDSYSTEM_EVENTQUEUE_LEN 240

struct darwin_iohidsystem_evglobals {
	darwin_ev_lock_data_t evg_cursor_sem;
	int evg_event_head;
	int evg_event_tail;
	int evg_event_last;
	int evg_uniq_mouseid;
	int evg_buttons;
	int evg_event_flags;
	int evg_event_time;
	darwin_iogpoint evg_cursor_loc;
	int evg_cursor_frame;
	darwin_iogbounds evg_all_screen;
	darwin_iogbounds evg_mouse_rect;
	int evg_version;
	int evg_struct_size;
	int evg_last_frame;
	unsigned int evg_reserved1[31];
	unsigned evg_reserved2:27;
	unsigned evg_want_pressure:1;
	unsigned evg_want_precision:1;
	unsigned evg_dontwant_coalesce:1;
	unsigned evg_dont_coalesce:1;
	unsigned evg_mouserect_valid:1;
	int evg_moved_mask;
	int evg_lastevent_sent;
	int evg_lastevent_consumed;
	darwin_ev_lock_data_t evg_waitcursor_sem;
	int evg_waitcursor;
	char evg_waitcursor_timeout;
	char evg_waitcursor_enabled;
	char evg_globalwaitcursor_enabled;
	int evg_waitcursor_threshold;
	darwin_iohidsystem_event_item
	    evg_evqueue[DARWIN_IOHIDSYSTEM_EVENTQUEUE_LEN];
};

/* Shared memory between the IOHIDSystem driver and userland */
struct  darwin_iohidsystem_shmem {
	int dis_global_offset;	/* Offset to global zone, usually 8 */
	int dis_private_offset;	/* Offset to private memory. Don't care. */
	struct darwin_iohidsystem_evglobals dis_evglobals;
};

/* I/O selectors for io_connect_method_{scalar|struct}i_{scalar|struct}o */
#define DARWIN_IOHIDCREATESHMEM		0
#define DARWIN_IOHIDSETEVENTSENABLE	1
#define DARWIN_IOHIDSETCURSORENABLE	2
#define DARWIN_IOHIDPOSTEVENT		3
#define DARWIN_IOHIDSETMOUSELOCATION	4
#define DARWIN_IOHIDGETBUTTONEVENTNUM	5


int darwin_iohidsystem_connect_method_scalari_scalaro(struct mach_trap_args *);
int darwin_iohidsystem_connect_method_structi_structo(struct mach_trap_args *);
int darwin_iohidsystem_connect_map_memory(struct mach_trap_args *);
void darwin_iohidsystem_postfake(struct lwp *);

/* I/O notifications: XXX not checked on Darwin */

typedef struct {
	mach_msg_header_t req_msgh;
	mach_msg_trailer_t req_trailer;
} mach_notify_iohidsystem_request_t;

#endif /* _DARWIN_IOHIDSYSTEM_H_ */