1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_USB_HID_H
27 #define	_SYS_USB_HID_H
28 
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 #define	USB_DESCR_TYPE_HID	0x21
35 #define	USB_HID_DESCR_SIZE	10	/* Hid descriptor length */
36 
37 /*
38  * HID : This header file defines the interface between the hid
39  * module and the hid driver.
40  */
41 
42 /*
43  * There is an M_CTL command per class specific HID command defined in
44  * section 7.2 of the specification.
45  */
46 
47 #define	HID_GET_REPORT		0x0001		/* receive report */
48 #define	HID_GET_IDLE		0x0002		/* find the idle value */
49 #define	HID_GET_PROTOCOL	0x0003		/* get the protocol */
50 #define	HID_SET_REPORT		0x0009		/* send a report to device */
51 #define	HID_SET_IDLE		0x000a		/* set the idle value */
52 #define	HID_SET_PROTOCOL	0x000b		/* set the protocol */
53 
54 /*
55  * Hid descriptor
56  */
57 typedef struct usb_hid_descr {
58 	uchar_t		bLength;		/* Size of this descriptor */
59 	uchar_t		bDescriptorType;	/* HID descriptor */
60 	ushort_t	bcdHID;			/* HID spec release */
61 	uchar_t		bCountryCode;		/* Country code */
62 	uchar_t		bNumDescriptors;	/* No. class descriptors */
63 	uchar_t		bReportDescriptorType;	/* Class descr. type */
64 	ushort_t	wReportDescriptorLength; /* size of report descr */
65 } usb_hid_descr_t;
66 
67 /*
68  * Hid device information
69  */
70 typedef struct hid_vid_pid {
71 	uint16_t	VendorId;		/* vendor ID */
72 	uint16_t	ProductId;		/* product ID */
73 } hid_vid_pid_t;
74 
75 /*
76  * Hid will turn the M_CTL request into a request control request on the
77  * default pipe.  Hid needs the following information in the hid_req_t
78  * structure.  See the details below for specific values for each command.
79  * hid_req_data is a 256-byte buffer, which is used to transfer input, output
80  * and feature report(hid specification 6.2.2.3 long items).
81  */
82 
83 #define	MAX_REPORT_DATA 256
84 
85 typedef struct hid_req_struct {
86 	uint16_t	hid_req_version_no;	/* Version number */
87 	uint16_t	hid_req_wValue;		/* wValue field of request */
88 	uint16_t	hid_req_wLength;	/* wLength of request */
89 	uchar_t		hid_req_data[MAX_REPORT_DATA];	/* data for send case */
90 } hid_req_t;
91 _NOTE(SCHEME_PROTECTS_DATA("unique per call", hid_req_t))
92 
93 /*
94  * hid_req_wValue values HID_GET_REPORT and HID_SET_REPORT
95  */
96 #define	REPORT_TYPE_INPUT	0x0100			/* Input report */
97 #define	REPORT_TYPE_OUTPUT	0x0200			/* Output report */
98 #define	REPORT_TYPE_FEATURE	0x0300			/* Feature report */
99 
100 
101 /*
102  * hid_req_wLength value for HID_GET_IDLE and HID_SET_IDLE
103  */
104 #define	GET_IDLE_LENGTH		0x0001
105 #define	SET_IDLE_LENGTH		0x0000
106 
107 /*
108  * hid_req_wValue values for SET_PROTOCOL
109  */
110 #define	SET_BOOT_PROTOCOL	0x0000			/* Boot protocol */
111 #define	SET_REPORT_PROTOCOL	0x0001			/* Report protocol */
112 
113 /*
114  * return values for GET_PROTOCOL
115  */
116 #define	BOOT_PROTOCOL		0x00		/* Returned boot protocol */
117 #define	REPORT_PROTOCOL		0x01		/* Returned report protocol */
118 
119 /*
120  * There is an additional M_CTL command for obtaining the
121  * hid parser handle.  This M_CTL returns a pointer to  the handle.
122  * The type of the pointer is intpr_t because this type is large enough to
123  * hold any data pointer.
124  */
125 #define	HID_GET_PARSER_HANDLE	0x0100		/* obtain parser handle */
126 
127 /*
128  * The M_CTL command is to get the device vendor ID and product ID.
129  */
130 #define	HID_GET_VID_PID		0x0200		/* obtain device info */
131 
132 /*
133  * M_CTL commands for event notifications
134  */
135 #define	HID_POWER_OFF		0x00DC
136 #define	HID_FULL_POWER		0x00DD
137 #define	HID_DISCONNECT_EVENT	0x00DE
138 #define	HID_CONNECT_EVENT	0x00DF
139 
140 /*
141  * To get the report descriptor,
142  * This is the wValue
143  */
144 #define	USB_CLASS_DESCR_TYPE_REPORT	0x2200
145 
146 
147 /* Version numbers */
148 #define	HID_VERSION_V_0		0
149 
150 #ifdef __cplusplus
151 }
152 #endif
153 
154 #endif	/* _SYS_USB_HID_H */
155