/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_USB_USBMS_H
#define _SYS_USB_USBMS_H
#ifdef __cplusplus
extern "C" {
#endif
struct usbmouseinfo {
int mi_x; /* current X coordinate */
int mi_y; /* current Y coordinate */
int mi_z; /* current wheel */
int mi_buttons; /* current button status */
struct timeval32 mi_time; /* timestamp */
};
struct usbmousebuf {
ushort_t mb_size; /* size (in usbmouseinfo units) of buf */
ushort_t mb_off; /* current offset in buffer */
struct usbmouseinfo *mb_info; /* current usbmouseinfo */
};
typedef struct usbms_input {
uint_t xpos; /* X position in the sample info */
uint_t xlen; /* length of X coordinate */
uint_t xattr; /* attribute of X coordinate */
uint_t ypos; /* Y position in the sample info */
uint_t ylen; /* length of Y coordinate */
uint_t yattr; /* attribute of Y coordinate */
uint_t zpos; /* wheel data position in the sample info */
uint_t zlen; /* length of wheel data */
uint_t zattr; /* attribute of wheel data */
uint_t bpos; /* button data position in the sample info */
uint_t tlen; /* length of the sample info */
} usbms_idf;
typedef struct usbms_state {
queue_t *usbms_rq_ptr; /* pointer to read queue */
queue_t *usbms_wq_ptr; /* pointer to write queue */
/* Flag for mouse open/qwait status */
int usbms_flags;
/*
* Is an ioctl fails because an mblk wasn't
* available, the mlbk is saved here.
*/
mblk_t *usbms_iocpending;
/* mouse software structure from msreg.h */
struct ms_softc usbms_softc;
/* Previous button byte */
char usbms_oldbutt;
/* Report descriptor handle received from hid */
hidparser_handle_t usbms_report_descr_handle;
/*
* Max pixel delta of jitter controlled. As this number increases
* the jumpiness of the msd increases, i.e., the coarser the motion
* for mediumm speeds.
* jitter_thresh is the maximum number of jitters suppressed. Thus,
* hz/jitter_thresh is the maximum interval of jitters suppressed. As
* jitter_thresh increases, a wider range of jitter is suppressed.
* However, the more inertia the mouse seems to have, i.e., the slower
* the mouse is to react.
*/
int usbms_jitter_thresh;
/* Timeout used when mstimeout in effect */
clock_t usbms_jittertimeout;
/*
* Measure how many (speed_count) msd deltas exceed threshold
* (speedlimit). If speedlaw then throw away deltas over speedlimit.
* This is to keep really bad mice that jump around from getting
* too far.
*/
/* Threshold above which deltas are thrown out */
int usbms_speedlimit;
int usbms_speedlaw; /* Whether to throw away deltas */
/* No. of deltas exceeding spd. limit */
int usbms_speed_count;
int usbms_iocid; /* ID of "ioctl" being waited for */
short usbms_state; /* button state at last sample */
short usbms_jitter; /* state counter for input routine */
timeout_id_t usbms_timeout_id; /* id returned by timeout() */
bufcall_id_t usbms_reioctl_id; /* id returned by bufcall() */
bufcall_id_t usbms_resched_id; /* id returned by bufcall() */
int32_t usbms_num_buttons; /* No. of buttons */
int32_t usbms_num_wheels; /* No. of wheels */
uchar_t usbms_protoerr; /* Error set proto */
ushort_t usbms_wheel_state_bf; /* Wheel state bit field */
ushort_t usbms_wheel_orient_bf; /* Wheel orientation */
int32_t usbms_rptid; /* Report id of mouse app */
int32_t usbms_logical_Xmax; /* X logical maximum */
int32_t usbms_logical_Ymax; /* Y logical maximum */
/* Screen resolution for absolute mouse */
Ms_screen_resolution usbms_resolution;
/* report the abs mouse event to upper level once */
boolean_t usbms_rpt_abs;
usbms_idf usbms_idf;
struct usbmousebuf *usbms_buf;
} usbms_state_t;
#define USBMS_OPEN 0x00000001 /* mouse is open for business */
#define USBMS_QWAIT 0x00000002 /* mouse is waiting for a response */
/* Macro to find absolute value */
#define USB_ABS(x) ((x) < 0 ? -(x) : (x))
/*
* Macro to restrict the value of x to lie between 127 & -127 :
* if x > 127 return 127
* else if x < -127 return -127
* else return x
*/
#define USB_BYTECLIP(x) (char)((x) > 127 ? 127 : ((x) < -127 ? -127 : (x)))
/*
* Default and MAX (supported) number of buttons
*/
#define USB_MS_DEFAULT_BUTTON_NO 3
#define USB_MS_MAX_BUTTON_NO 8
/*
* Input routine states. See usbms_input().
*/
#define USBMS_WAIT_BUTN 0 /* Button byte */
#define USBMS_WAIT_X 1 /* Delta X byte */
#define USBMS_WAIT_Y 2 /* Delta Y byte */
#define USBMS_WAIT_WHEEL 3 /* Wheel Byte */
/*
* default resolution, 1024x768.
*/
#define USBMS_DEFAULT_RES_HEIGHT 768
#define USBMS_DEFAULT_RES_WIDTH 1024
/*
* USB buttons:
* How the device sends it:
* 0x01 - Left button position
* 0x02 - Right button position
* 0x04 - Middle button position
*/
#define USBMS_BUT(i) 1 << (i - 1)
/*
* These defines are for converting USB button information to the
* format that Type 5 mouse sends upstream, which is what the xserver
* expects.
*/
#define USB_NO_BUT_PRESSED 0xFF
#define USB_LEFT_BUT_PRESSED 0xFB
#define USB_RIGHT_BUT_PRESSED 0xFE
#define USB_MIDDLE_BUT_PRESSED 0xFD
#define USB_BUT_PRESSED(i) ~(1 << (i - 1))
/*
* State structure used for transparent ioctls
*/
typedef struct usbms_iocstate {
int ioc_state;
caddr_t u_addr;
} usbms_iocstate_t;
/*
* Transparent ioctl states
*/
#define USBMS_GETSTRUCT 1
#define USBMS_GETRESULT 2
/*
* Private data are initialized to these values
*/
#define USBMS_JITTER_THRESH 0 /* Max no. of jitters suppressed */
#define USBMS_SPEEDLIMIT 48 /* Threshold for msd deltas */
#define USBMS_SPEEDLAW 0 /* Whether to throw away deltas */
#define USBMS_SPEED_COUNT 0 /* No. of deltas exceeding spd. limit */
#define USBMS_BUF_BYTES 4096 /* Mouse buffer size */
#define USBMS_USAGE_PAGE_BUTTON 0x9 /* Usage Page data value : Button */
#define JITTERRATE 12 /* No of jitters before timeout */
/* Jitter Timeout while initialization */
#define JITTER_TIMEOUT (hz/JITTERRATE)
/*
* Masks for debug printing
*/
#define PRINT_MASK_ATTA 0x00000001
#define PRINT_MASK_OPEN 0x00000002
#define PRINT_MASK_CLOSE 0x00000004
#define PRINT_MASK_SERV 0x00000008
#define PRINT_MASK_IOCTL 0x00000010
#define PRINT_MASK_INPUT_INCR 0x00000020
#define PRINT_MASK_ALL 0xFFFFFFFF
#ifdef __cplusplus
}
#endif
#endif /* _SYS_USB_USBMS_H */