xref: /freebsd/sys/dev/hid/hid.h (revision 38b67578fb4bbf568f7012ca3921a4d15cfe7c5d)
11ffa5c63SVladimir Kondratyev /*-
2b61a5730SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
31ffa5c63SVladimir Kondratyev  *
41ffa5c63SVladimir Kondratyev  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
51ffa5c63SVladimir Kondratyev  * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
61ffa5c63SVladimir Kondratyev  * Copyright (c) 1998 Lennart Augustsson. All rights reserved.
71ffa5c63SVladimir Kondratyev  *
81ffa5c63SVladimir Kondratyev  * Redistribution and use in source and binary forms, with or without
91ffa5c63SVladimir Kondratyev  * modification, are permitted provided that the following conditions
101ffa5c63SVladimir Kondratyev  * are met:
111ffa5c63SVladimir Kondratyev  * 1. Redistributions of source code must retain the above copyright
121ffa5c63SVladimir Kondratyev  *    notice, this list of conditions and the following disclaimer.
131ffa5c63SVladimir Kondratyev  * 2. Redistributions in binary form must reproduce the above copyright
141ffa5c63SVladimir Kondratyev  *    notice, this list of conditions and the following disclaimer in the
151ffa5c63SVladimir Kondratyev  *    documentation and/or other materials provided with the distribution.
161ffa5c63SVladimir Kondratyev  *
171ffa5c63SVladimir Kondratyev  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
181ffa5c63SVladimir Kondratyev  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
191ffa5c63SVladimir Kondratyev  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
201ffa5c63SVladimir Kondratyev  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
211ffa5c63SVladimir Kondratyev  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
221ffa5c63SVladimir Kondratyev  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
231ffa5c63SVladimir Kondratyev  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
241ffa5c63SVladimir Kondratyev  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
251ffa5c63SVladimir Kondratyev  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
261ffa5c63SVladimir Kondratyev  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
271ffa5c63SVladimir Kondratyev  * SUCH DAMAGE.
281ffa5c63SVladimir Kondratyev  */
291ffa5c63SVladimir Kondratyev 
3067de2db2SVladimir Kondratyev #ifndef _HID_HID_H_
3167de2db2SVladimir Kondratyev #define	_HID_HID_H_
321ffa5c63SVladimir Kondratyev 
331ffa5c63SVladimir Kondratyev /* Usage pages */
341ffa5c63SVladimir Kondratyev #define	HUP_UNDEFINED		0x0000
351ffa5c63SVladimir Kondratyev #define	HUP_GENERIC_DESKTOP	0x0001
361ffa5c63SVladimir Kondratyev #define	HUP_SIMULATION		0x0002
371ffa5c63SVladimir Kondratyev #define	HUP_VR_CONTROLS		0x0003
381ffa5c63SVladimir Kondratyev #define	HUP_SPORTS_CONTROLS	0x0004
391ffa5c63SVladimir Kondratyev #define	HUP_GAMING_CONTROLS	0x0005
401ffa5c63SVladimir Kondratyev #define	HUP_KEYBOARD		0x0007
411ffa5c63SVladimir Kondratyev #define	HUP_LEDS		0x0008
421ffa5c63SVladimir Kondratyev #define	HUP_BUTTON		0x0009
431ffa5c63SVladimir Kondratyev #define	HUP_ORDINALS		0x000a
441ffa5c63SVladimir Kondratyev #define	HUP_TELEPHONY		0x000b
451ffa5c63SVladimir Kondratyev #define	HUP_CONSUMER		0x000c
461ffa5c63SVladimir Kondratyev #define	HUP_DIGITIZERS		0x000d
471ffa5c63SVladimir Kondratyev #define	HUP_PHYSICAL_IFACE	0x000e
481ffa5c63SVladimir Kondratyev #define	HUP_UNICODE		0x0010
491ffa5c63SVladimir Kondratyev #define	HUP_ALPHANUM_DISPLAY	0x0014
501ffa5c63SVladimir Kondratyev #define	HUP_MONITOR		0x0080
511ffa5c63SVladimir Kondratyev #define	HUP_MONITOR_ENUM_VAL	0x0081
521ffa5c63SVladimir Kondratyev #define	HUP_VESA_VC		0x0082
531ffa5c63SVladimir Kondratyev #define	HUP_VESA_CMD		0x0083
541ffa5c63SVladimir Kondratyev #define	HUP_POWER		0x0084
551ffa5c63SVladimir Kondratyev #define	HUP_BATTERY_SYSTEM	0x0085
561ffa5c63SVladimir Kondratyev #define	HUP_BARCODE_SCANNER	0x008b
571ffa5c63SVladimir Kondratyev #define	HUP_SCALE		0x008c
581ffa5c63SVladimir Kondratyev #define	HUP_CAMERA_CONTROL	0x0090
591ffa5c63SVladimir Kondratyev #define	HUP_ARCADE		0x0091
601ffa5c63SVladimir Kondratyev #define	HUP_MICROSOFT		0xff00
611ffa5c63SVladimir Kondratyev 
621ffa5c63SVladimir Kondratyev /* Usages, generic desktop */
631ffa5c63SVladimir Kondratyev #define	HUG_POINTER		0x0001
641ffa5c63SVladimir Kondratyev #define	HUG_MOUSE		0x0002
651ffa5c63SVladimir Kondratyev #define	HUG_JOYSTICK		0x0004
661ffa5c63SVladimir Kondratyev #define	HUG_GAME_PAD		0x0005
671ffa5c63SVladimir Kondratyev #define	HUG_KEYBOARD		0x0006
681ffa5c63SVladimir Kondratyev #define	HUG_KEYPAD		0x0007
6919758786SVladimir Kondratyev #define	HUG_MULTIAXIS_CNTROLLER	0x0008
701ffa5c63SVladimir Kondratyev #define	HUG_X			0x0030
711ffa5c63SVladimir Kondratyev #define	HUG_Y			0x0031
721ffa5c63SVladimir Kondratyev #define	HUG_Z			0x0032
731ffa5c63SVladimir Kondratyev #define	HUG_RX			0x0033
741ffa5c63SVladimir Kondratyev #define	HUG_RY			0x0034
751ffa5c63SVladimir Kondratyev #define	HUG_RZ			0x0035
761ffa5c63SVladimir Kondratyev #define	HUG_SLIDER		0x0036
771ffa5c63SVladimir Kondratyev #define	HUG_DIAL		0x0037
781ffa5c63SVladimir Kondratyev #define	HUG_WHEEL		0x0038
791ffa5c63SVladimir Kondratyev #define	HUG_HAT_SWITCH		0x0039
801ffa5c63SVladimir Kondratyev #define	HUG_COUNTED_BUFFER	0x003a
811ffa5c63SVladimir Kondratyev #define	HUG_BYTE_COUNT		0x003b
821ffa5c63SVladimir Kondratyev #define	HUG_MOTION_WAKEUP	0x003c
831ffa5c63SVladimir Kondratyev #define	HUG_VX			0x0040
841ffa5c63SVladimir Kondratyev #define	HUG_VY			0x0041
851ffa5c63SVladimir Kondratyev #define	HUG_VZ			0x0042
861ffa5c63SVladimir Kondratyev #define	HUG_VBRX		0x0043
871ffa5c63SVladimir Kondratyev #define	HUG_VBRY		0x0044
881ffa5c63SVladimir Kondratyev #define	HUG_VBRZ		0x0045
891ffa5c63SVladimir Kondratyev #define	HUG_VNO			0x0046
901ffa5c63SVladimir Kondratyev #define	HUG_TWHEEL		0x0048	/* M$ Wireless Intellimouse Wheel */
911ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_CONTROL	0x0080
921ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_POWER_DOWN	0x0081
931ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_SLEEP	0x0082
941ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_WAKEUP	0x0083
951ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_CONTEXT_MENU	0x0084
961ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_MAIN_MENU	0x0085
971ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_APP_MENU	0x0086
981ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_MENU_HELP	0x0087
991ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_MENU_EXIT	0x0088
1001ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_MENU_SELECT	0x0089
1011ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_MENU_RIGHT	0x008a
1021ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_MENU_LEFT	0x008b
1031ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_MENU_UP	0x008c
1041ffa5c63SVladimir Kondratyev #define	HUG_SYSTEM_MENU_DOWN	0x008d
10519758786SVladimir Kondratyev #define	HUG_SYSTEM_POWER_UP	0x008e
10619758786SVladimir Kondratyev #define	HUG_SYSTEM_RESTART	0x008f
10719758786SVladimir Kondratyev #define	HUG_D_PAD_UP		0x0090
10819758786SVladimir Kondratyev #define	HUG_D_PAD_DOWN		0x0091
10919758786SVladimir Kondratyev #define	HUG_D_PAD_RIGHT		0x0092
11019758786SVladimir Kondratyev #define	HUG_D_PAD_LEFT		0x0093
1111ffa5c63SVladimir Kondratyev #define	HUG_APPLE_EJECT		0x00b8
1121ffa5c63SVladimir Kondratyev 
1131ffa5c63SVladimir Kondratyev /* Usages Digitizers */
1141ffa5c63SVladimir Kondratyev #define	HUD_UNDEFINED		0x0000
1151ffa5c63SVladimir Kondratyev #define	HUD_DIGITIZER		0x0001
1161ffa5c63SVladimir Kondratyev #define	HUD_PEN			0x0002
1171ffa5c63SVladimir Kondratyev #define	HUD_TOUCHSCREEN		0x0004
1181ffa5c63SVladimir Kondratyev #define	HUD_TOUCHPAD		0x0005
1191ffa5c63SVladimir Kondratyev #define	HUD_CONFIG		0x000e
1201ffa5c63SVladimir Kondratyev #define	HUD_FINGER		0x0022
1211ffa5c63SVladimir Kondratyev #define	HUD_TIP_PRESSURE	0x0030
1221ffa5c63SVladimir Kondratyev #define	HUD_BARREL_PRESSURE	0x0031
1231ffa5c63SVladimir Kondratyev #define	HUD_IN_RANGE		0x0032
1241ffa5c63SVladimir Kondratyev #define	HUD_TOUCH		0x0033
1251ffa5c63SVladimir Kondratyev #define	HUD_UNTOUCH		0x0034
1261ffa5c63SVladimir Kondratyev #define	HUD_TAP			0x0035
1271ffa5c63SVladimir Kondratyev #define	HUD_QUALITY		0x0036
1281ffa5c63SVladimir Kondratyev #define	HUD_DATA_VALID		0x0037
1291ffa5c63SVladimir Kondratyev #define	HUD_TRANSDUCER_INDEX	0x0038
1301ffa5c63SVladimir Kondratyev #define	HUD_TABLET_FKEYS	0x0039
1311ffa5c63SVladimir Kondratyev #define	HUD_PROGRAM_CHANGE_KEYS	0x003a
1321ffa5c63SVladimir Kondratyev #define	HUD_BATTERY_STRENGTH	0x003b
1331ffa5c63SVladimir Kondratyev #define	HUD_INVERT		0x003c
1341ffa5c63SVladimir Kondratyev #define	HUD_X_TILT		0x003d
1351ffa5c63SVladimir Kondratyev #define	HUD_Y_TILT		0x003e
1361ffa5c63SVladimir Kondratyev #define	HUD_AZIMUTH		0x003f
1371ffa5c63SVladimir Kondratyev #define	HUD_ALTITUDE		0x0040
1381ffa5c63SVladimir Kondratyev #define	HUD_TWIST		0x0041
1391ffa5c63SVladimir Kondratyev #define	HUD_TIP_SWITCH		0x0042
1401ffa5c63SVladimir Kondratyev #define	HUD_SEC_TIP_SWITCH	0x0043
1411ffa5c63SVladimir Kondratyev #define	HUD_BARREL_SWITCH	0x0044
1421ffa5c63SVladimir Kondratyev #define	HUD_ERASER		0x0045
1431ffa5c63SVladimir Kondratyev #define	HUD_TABLET_PICK		0x0046
1441ffa5c63SVladimir Kondratyev #define	HUD_CONFIDENCE		0x0047
1451ffa5c63SVladimir Kondratyev #define	HUD_WIDTH		0x0048
1461ffa5c63SVladimir Kondratyev #define	HUD_HEIGHT		0x0049
1471ffa5c63SVladimir Kondratyev #define	HUD_CONTACTID		0x0051
1481ffa5c63SVladimir Kondratyev #define	HUD_INPUT_MODE		0x0052
1491ffa5c63SVladimir Kondratyev #define	HUD_DEVICE_INDEX	0x0053
1501ffa5c63SVladimir Kondratyev #define	HUD_CONTACTCOUNT	0x0054
1511ffa5c63SVladimir Kondratyev #define	HUD_CONTACT_MAX		0x0055
1521ffa5c63SVladimir Kondratyev #define	HUD_SCAN_TIME		0x0056
1531ffa5c63SVladimir Kondratyev #define	HUD_SURFACE_SWITCH	0x0057
1541ffa5c63SVladimir Kondratyev #define	HUD_BUTTONS_SWITCH	0x0058
1551ffa5c63SVladimir Kondratyev #define	HUD_BUTTON_TYPE		0x0059
15619758786SVladimir Kondratyev #define	HUD_SEC_BARREL_SWITCH	0x005a
1571ffa5c63SVladimir Kondratyev #define	HUD_LATENCY_MODE	0x0060
1581ffa5c63SVladimir Kondratyev 
1591ffa5c63SVladimir Kondratyev /* Usages, Consumer */
16019758786SVladimir Kondratyev #define	HUC_CONTROL		0x0001
16119758786SVladimir Kondratyev #define	HUC_HEADPHONE		0x0005
1621ffa5c63SVladimir Kondratyev #define	HUC_AC_PAN		0x0238
1631ffa5c63SVladimir Kondratyev 
1641ffa5c63SVladimir Kondratyev #define	HID_USAGE2(p,u)		(((p) << 16) | (u))
16519758786SVladimir Kondratyev #define	HID_GET_USAGE(u)	((u) & 0xffff)
16619758786SVladimir Kondratyev #define	HID_GET_USAGE_PAGE(u)	(((u) >> 16) & 0xffff)
1671ffa5c63SVladimir Kondratyev 
16819758786SVladimir Kondratyev #define	HID_INPUT_REPORT	0x01
16919758786SVladimir Kondratyev #define	HID_OUTPUT_REPORT	0x02
17019758786SVladimir Kondratyev #define	HID_FEATURE_REPORT	0x03
1711ffa5c63SVladimir Kondratyev 
1721ffa5c63SVladimir Kondratyev /* Bits in the input/output/feature items */
1731ffa5c63SVladimir Kondratyev #define	HIO_CONST	0x001
1741ffa5c63SVladimir Kondratyev #define	HIO_VARIABLE	0x002
1751ffa5c63SVladimir Kondratyev #define	HIO_RELATIVE	0x004
1761ffa5c63SVladimir Kondratyev #define	HIO_WRAP	0x008
1771ffa5c63SVladimir Kondratyev #define	HIO_NONLINEAR	0x010
1781ffa5c63SVladimir Kondratyev #define	HIO_NOPREF	0x020
1791ffa5c63SVladimir Kondratyev #define	HIO_NULLSTATE	0x040
1801ffa5c63SVladimir Kondratyev #define	HIO_VOLATILE	0x080
1811ffa5c63SVladimir Kondratyev #define	HIO_BUFBYTES	0x100
1821ffa5c63SVladimir Kondratyev 
1831ffa5c63SVladimir Kondratyev /* Units of Measure */
1841ffa5c63SVladimir Kondratyev #define	HUM_CENTIMETER	0x11
1851ffa5c63SVladimir Kondratyev #define	HUM_RADIAN	0x12
1861ffa5c63SVladimir Kondratyev #define	HUM_INCH	0x13
187be75951aSVladimir Kondratyev #define	HUM_INCH_EGALAX	0x33
1881ffa5c63SVladimir Kondratyev #define	HUM_DEGREE	0x14
1891ffa5c63SVladimir Kondratyev 
1901ffa5c63SVladimir Kondratyev #if defined(_KERNEL) || defined(_STANDALONE)
1911ffa5c63SVladimir Kondratyev 
192db2f5123SWarner Losh #define	HID_ITEM_MAXUSAGE	8
19319758786SVladimir Kondratyev #define	HID_MAX_AUTO_QUIRK	8	/* maximum number of dynamic quirks */
19419758786SVladimir Kondratyev #define	HID_PNP_ID_SIZE		20	/* includes null terminator */
19519758786SVladimir Kondratyev 
19619758786SVladimir Kondratyev /* Declare global HID debug variable. */
19719758786SVladimir Kondratyev extern int hid_debug;
19819758786SVladimir Kondratyev 
19919758786SVladimir Kondratyev /* Check if HID debugging is enabled. */
20019758786SVladimir Kondratyev #ifdef HID_DEBUG_VAR
20119758786SVladimir Kondratyev #ifdef HID_DEBUG
20219758786SVladimir Kondratyev #define DPRINTFN(n,fmt,...) do {			\
20319758786SVladimir Kondratyev 	if ((HID_DEBUG_VAR) >= (n)) {			\
20419758786SVladimir Kondratyev 		printf("%s: " fmt,			\
20519758786SVladimir Kondratyev 		    __FUNCTION__ ,##__VA_ARGS__);	\
20619758786SVladimir Kondratyev 	}						\
20719758786SVladimir Kondratyev } while (0)
20819758786SVladimir Kondratyev #define DPRINTF(...)	DPRINTFN(1, __VA_ARGS__)
20919758786SVladimir Kondratyev #else
21019758786SVladimir Kondratyev #define DPRINTF(...)	do { } while (0)
21119758786SVladimir Kondratyev #define DPRINTFN(...)	do { } while (0)
21219758786SVladimir Kondratyev #endif
21319758786SVladimir Kondratyev #endif
21419758786SVladimir Kondratyev 
21519758786SVladimir Kondratyev /* Declare parent SYSCTL HID node. */
21619758786SVladimir Kondratyev #ifdef SYSCTL_DECL
21719758786SVladimir Kondratyev SYSCTL_DECL(_hw_hid);
21819758786SVladimir Kondratyev #endif
21919758786SVladimir Kondratyev 
22019758786SVladimir Kondratyev typedef uint32_t hid_size_t;
22119758786SVladimir Kondratyev 
22219758786SVladimir Kondratyev #define	HID_IN_POLLING_MODE()	(SCHEDULER_STOPPED() || kdb_active)
2231ffa5c63SVladimir Kondratyev 
2241ffa5c63SVladimir Kondratyev enum hid_kind {
2251ffa5c63SVladimir Kondratyev 	hid_input, hid_output, hid_feature, hid_collection, hid_endcollection
2261ffa5c63SVladimir Kondratyev };
2271ffa5c63SVladimir Kondratyev 
2281ffa5c63SVladimir Kondratyev struct hid_location {
2291ffa5c63SVladimir Kondratyev 	uint32_t size;
2301ffa5c63SVladimir Kondratyev 	uint32_t count;
2311ffa5c63SVladimir Kondratyev 	uint32_t pos;
2321ffa5c63SVladimir Kondratyev };
2331ffa5c63SVladimir Kondratyev 
2341ffa5c63SVladimir Kondratyev struct hid_item {
2351ffa5c63SVladimir Kondratyev 	/* Global */
236*38b67578SVladimir Kondratyev 	uint32_t _usage_page;
2371ffa5c63SVladimir Kondratyev 	int32_t	logical_minimum;
2381ffa5c63SVladimir Kondratyev 	int32_t	logical_maximum;
2391ffa5c63SVladimir Kondratyev 	int32_t	physical_minimum;
2401ffa5c63SVladimir Kondratyev 	int32_t	physical_maximum;
241*38b67578SVladimir Kondratyev 	uint32_t unit_exponent;
242*38b67578SVladimir Kondratyev 	uint32_t unit;
243*38b67578SVladimir Kondratyev 	uint32_t report_ID;
2441ffa5c63SVladimir Kondratyev 	/* Local */
2451ffa5c63SVladimir Kondratyev 	int	nusages;
2461ffa5c63SVladimir Kondratyev 	union {
247*38b67578SVladimir Kondratyev 		uint32_t usage;
248*38b67578SVladimir Kondratyev 		uint32_t usages[HID_ITEM_MAXUSAGE];
2491ffa5c63SVladimir Kondratyev 	};
250*38b67578SVladimir Kondratyev 	uint32_t usage_minimum;
251*38b67578SVladimir Kondratyev 	uint32_t usage_maximum;
252*38b67578SVladimir Kondratyev 	uint32_t designator_index;
253*38b67578SVladimir Kondratyev 	uint32_t designator_minimum;
254*38b67578SVladimir Kondratyev 	uint32_t designator_maximum;
255*38b67578SVladimir Kondratyev 	uint32_t string_index;
256*38b67578SVladimir Kondratyev 	uint32_t string_minimum;
257*38b67578SVladimir Kondratyev 	uint32_t string_maximum;
258*38b67578SVladimir Kondratyev 	uint32_t set_delimiter;
2591ffa5c63SVladimir Kondratyev 	/* Misc */
260*38b67578SVladimir Kondratyev 	uint32_t collection;
2611ffa5c63SVladimir Kondratyev 	int	collevel;
2621ffa5c63SVladimir Kondratyev 	enum hid_kind kind;
2631ffa5c63SVladimir Kondratyev 	uint32_t flags;
2641ffa5c63SVladimir Kondratyev 	/* Location */
2651ffa5c63SVladimir Kondratyev 	struct hid_location loc;
2661ffa5c63SVladimir Kondratyev };
2671ffa5c63SVladimir Kondratyev 
26819758786SVladimir Kondratyev struct hid_absinfo {
26919758786SVladimir Kondratyev 	int32_t min;
27019758786SVladimir Kondratyev 	int32_t max;
27119758786SVladimir Kondratyev 	int32_t res;
27219758786SVladimir Kondratyev };
27319758786SVladimir Kondratyev 
27419758786SVladimir Kondratyev struct hid_device_info {
27519758786SVladimir Kondratyev 	char		name[80];
27619758786SVladimir Kondratyev 	char		serial[80];
27719758786SVladimir Kondratyev 	char		idPnP[HID_PNP_ID_SIZE];
27819758786SVladimir Kondratyev 	uint16_t	idBus;
27919758786SVladimir Kondratyev 	uint16_t	idVendor;
28019758786SVladimir Kondratyev 	uint16_t	idProduct;
28119758786SVladimir Kondratyev 	uint16_t	idVersion;
28219758786SVladimir Kondratyev 	hid_size_t	rdescsize;	/* Report descriptor size */
28319758786SVladimir Kondratyev 	uint8_t		autoQuirk[HID_MAX_AUTO_QUIRK];
28419758786SVladimir Kondratyev };
28519758786SVladimir Kondratyev 
28619758786SVladimir Kondratyev struct hid_rdesc_info {
28719758786SVladimir Kondratyev 	void		*data;
28819758786SVladimir Kondratyev 	hid_size_t	len;
28919758786SVladimir Kondratyev 	hid_size_t	isize;
29019758786SVladimir Kondratyev 	hid_size_t	osize;
29119758786SVladimir Kondratyev 	hid_size_t	fsize;
29219758786SVladimir Kondratyev 	uint8_t		iid;
29319758786SVladimir Kondratyev 	uint8_t		oid;
29419758786SVladimir Kondratyev 	uint8_t		fid;
29519758786SVladimir Kondratyev 	/* Max sizes for HID requests supported by transport backend */
29619758786SVladimir Kondratyev 	hid_size_t	rdsize;
29719758786SVladimir Kondratyev 	hid_size_t	wrsize;
29819758786SVladimir Kondratyev 	hid_size_t	grsize;
29919758786SVladimir Kondratyev 	hid_size_t	srsize;
30019758786SVladimir Kondratyev };
30119758786SVladimir Kondratyev 
30219758786SVladimir Kondratyev typedef void hid_intr_t(void *context, void *data, hid_size_t len);
30319758786SVladimir Kondratyev typedef bool hid_test_quirk_t(const struct hid_device_info *dev_info,
30419758786SVladimir Kondratyev     uint16_t quirk);
30519758786SVladimir Kondratyev 
30619758786SVladimir Kondratyev extern hid_test_quirk_t *hid_test_quirk_p;
30719758786SVladimir Kondratyev 
3081ffa5c63SVladimir Kondratyev /* prototypes from "usb_hid.c" */
3091ffa5c63SVladimir Kondratyev 
31019758786SVladimir Kondratyev struct hid_data *hid_start_parse(const void *d, hid_size_t len, int kindset);
3111ffa5c63SVladimir Kondratyev void	hid_end_parse(struct hid_data *s);
3121ffa5c63SVladimir Kondratyev int	hid_get_item(struct hid_data *s, struct hid_item *h);
31319758786SVladimir Kondratyev int	hid_report_size(const void *buf, hid_size_t len, enum hid_kind k,
31419758786SVladimir Kondratyev 	    uint8_t id);
31519758786SVladimir Kondratyev int	hid_report_size_max(const void *buf, hid_size_t len, enum hid_kind k,
3161ffa5c63SVladimir Kondratyev 	    uint8_t *id);
31719758786SVladimir Kondratyev int	hid_locate(const void *desc, hid_size_t size, int32_t usage,
3181ffa5c63SVladimir Kondratyev 	    enum hid_kind kind, uint8_t index, struct hid_location *loc,
3191ffa5c63SVladimir Kondratyev 	    uint32_t *flags, uint8_t *id);
32019758786SVladimir Kondratyev int32_t hid_get_data(const uint8_t *buf, hid_size_t len,
3211ffa5c63SVladimir Kondratyev 	    struct hid_location *loc);
32219758786SVladimir Kondratyev uint32_t hid_get_udata(const uint8_t *buf, hid_size_t len,
3231ffa5c63SVladimir Kondratyev 	    struct hid_location *loc);
32419758786SVladimir Kondratyev void	hid_put_udata(uint8_t *buf, hid_size_t len,
3251ffa5c63SVladimir Kondratyev 	    struct hid_location *loc, unsigned int value);
32619758786SVladimir Kondratyev int	hid_is_collection(const void *desc, hid_size_t size, int32_t usage);
3271ffa5c63SVladimir Kondratyev int32_t	hid_item_resolution(struct hid_item *hi);
3281ffa5c63SVladimir Kondratyev int	hid_is_mouse(const void *d_ptr, uint16_t d_len);
3291ffa5c63SVladimir Kondratyev int	hid_is_keyboard(const void *d_ptr, uint16_t d_len);
33019758786SVladimir Kondratyev bool	hid_test_quirk(const struct hid_device_info *dev_info, uint16_t quirk);
33119758786SVladimir Kondratyev int	hid_add_dynamic_quirk(struct hid_device_info *dev_info,
33219758786SVladimir Kondratyev 	    uint16_t quirk);
33319758786SVladimir Kondratyev void	hid_quirk_unload(void *arg);
334961a3535SVladimir Kondratyev 
3354151ac9fSVladimir Kondratyev int	hid_intr_start(device_t);
3364151ac9fSVladimir Kondratyev int	hid_intr_stop(device_t);
3374151ac9fSVladimir Kondratyev void	hid_intr_poll(device_t);
338961a3535SVladimir Kondratyev int	hid_get_rdesc(device_t, void *, hid_size_t);
339961a3535SVladimir Kondratyev int	hid_read(device_t, void *, hid_size_t, hid_size_t *);
340961a3535SVladimir Kondratyev int	hid_write(device_t, const void *, hid_size_t);
341961a3535SVladimir Kondratyev int	hid_get_report(device_t, void *, hid_size_t, hid_size_t *, uint8_t,
342961a3535SVladimir Kondratyev 	    uint8_t);
343961a3535SVladimir Kondratyev int	hid_set_report(device_t, const void *, hid_size_t, uint8_t, uint8_t);
344961a3535SVladimir Kondratyev int	hid_set_idle(device_t, uint16_t, uint8_t);
345961a3535SVladimir Kondratyev int	hid_set_protocol(device_t, uint16_t);
3465f47c5a3SVladimir Kondratyev int	hid_ioctl(device_t, unsigned long, uintptr_t);
3471ffa5c63SVladimir Kondratyev #endif	/* _KERNEL || _STANDALONE */
34867de2db2SVladimir Kondratyev #endif	/* _HID_HID_H_ */
349