xref: /freebsd/sys/dev/hid/hid.h (revision 67de2db2623a10dc4edec1642b2f8685d5587d7f)
11ffa5c63SVladimir Kondratyev /* $FreeBSD$ */
21ffa5c63SVladimir Kondratyev /*-
31ffa5c63SVladimir Kondratyev  * SPDX-License-Identifier: BSD-2-Clause-NetBSD
41ffa5c63SVladimir Kondratyev  *
51ffa5c63SVladimir Kondratyev  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
61ffa5c63SVladimir Kondratyev  * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
71ffa5c63SVladimir Kondratyev  * Copyright (c) 1998 Lennart Augustsson. All rights reserved.
81ffa5c63SVladimir Kondratyev  *
91ffa5c63SVladimir Kondratyev  * Redistribution and use in source and binary forms, with or without
101ffa5c63SVladimir Kondratyev  * modification, are permitted provided that the following conditions
111ffa5c63SVladimir Kondratyev  * are met:
121ffa5c63SVladimir Kondratyev  * 1. Redistributions of source code must retain the above copyright
131ffa5c63SVladimir Kondratyev  *    notice, this list of conditions and the following disclaimer.
141ffa5c63SVladimir Kondratyev  * 2. Redistributions in binary form must reproduce the above copyright
151ffa5c63SVladimir Kondratyev  *    notice, this list of conditions and the following disclaimer in the
161ffa5c63SVladimir Kondratyev  *    documentation and/or other materials provided with the distribution.
171ffa5c63SVladimir Kondratyev  *
181ffa5c63SVladimir Kondratyev  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
191ffa5c63SVladimir Kondratyev  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
201ffa5c63SVladimir Kondratyev  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
211ffa5c63SVladimir Kondratyev  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
221ffa5c63SVladimir Kondratyev  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
231ffa5c63SVladimir Kondratyev  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
241ffa5c63SVladimir Kondratyev  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
251ffa5c63SVladimir Kondratyev  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
261ffa5c63SVladimir Kondratyev  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
271ffa5c63SVladimir Kondratyev  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
281ffa5c63SVladimir Kondratyev  * SUCH DAMAGE.
291ffa5c63SVladimir Kondratyev  */
301ffa5c63SVladimir Kondratyev 
31*67de2db2SVladimir Kondratyev #ifndef _HID_HID_H_
32*67de2db2SVladimir Kondratyev #define	_HID_HID_H_
331ffa5c63SVladimir Kondratyev 
341ffa5c63SVladimir Kondratyev /* Usage pages */
351ffa5c63SVladimir Kondratyev #define	HUP_UNDEFINED		0x0000
361ffa5c63SVladimir Kondratyev #define	HUP_GENERIC_DESKTOP	0x0001
371ffa5c63SVladimir Kondratyev #define	HUP_SIMULATION		0x0002
381ffa5c63SVladimir Kondratyev #define	HUP_VR_CONTROLS		0x0003
391ffa5c63SVladimir Kondratyev #define	HUP_SPORTS_CONTROLS	0x0004
401ffa5c63SVladimir Kondratyev #define	HUP_GAMING_CONTROLS	0x0005
411ffa5c63SVladimir Kondratyev #define	HUP_KEYBOARD		0x0007
421ffa5c63SVladimir Kondratyev #define	HUP_LEDS		0x0008
431ffa5c63SVladimir Kondratyev #define	HUP_BUTTON		0x0009
441ffa5c63SVladimir Kondratyev #define	HUP_ORDINALS		0x000a
451ffa5c63SVladimir Kondratyev #define	HUP_TELEPHONY		0x000b
461ffa5c63SVladimir Kondratyev #define	HUP_CONSUMER		0x000c
471ffa5c63SVladimir Kondratyev #define	HUP_DIGITIZERS		0x000d
481ffa5c63SVladimir Kondratyev #define	HUP_PHYSICAL_IFACE	0x000e
491ffa5c63SVladimir Kondratyev #define	HUP_UNICODE		0x0010
501ffa5c63SVladimir Kondratyev #define	HUP_ALPHANUM_DISPLAY	0x0014
511ffa5c63SVladimir Kondratyev #define	HUP_MONITOR		0x0080
521ffa5c63SVladimir Kondratyev #define	HUP_MONITOR_ENUM_VAL	0x0081
531ffa5c63SVladimir Kondratyev #define	HUP_VESA_VC		0x0082
541ffa5c63SVladimir Kondratyev #define	HUP_VESA_CMD		0x0083
551ffa5c63SVladimir Kondratyev #define	HUP_POWER		0x0084
561ffa5c63SVladimir Kondratyev #define	HUP_BATTERY_SYSTEM	0x0085
571ffa5c63SVladimir Kondratyev #define	HUP_BARCODE_SCANNER	0x008b
581ffa5c63SVladimir Kondratyev #define	HUP_SCALE		0x008c
591ffa5c63SVladimir Kondratyev #define	HUP_CAMERA_CONTROL	0x0090
601ffa5c63SVladimir Kondratyev #define	HUP_ARCADE		0x0091
611ffa5c63SVladimir Kondratyev #define	HUP_MICROSOFT		0xff00
621ffa5c63SVladimir Kondratyev 
631ffa5c63SVladimir Kondratyev /* Usages, generic desktop */
641ffa5c63SVladimir Kondratyev #define	HUG_POINTER		0x0001
651ffa5c63SVladimir Kondratyev #define	HUG_MOUSE		0x0002
661ffa5c63SVladimir Kondratyev #define	HUG_JOYSTICK		0x0004
671ffa5c63SVladimir Kondratyev #define	HUG_GAME_PAD		0x0005
681ffa5c63SVladimir Kondratyev #define	HUG_KEYBOARD		0x0006
691ffa5c63SVladimir Kondratyev #define	HUG_KEYPAD		0x0007
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
1051ffa5c63SVladimir Kondratyev #define	HUG_APPLE_EJECT		0x00b8
1061ffa5c63SVladimir Kondratyev 
1071ffa5c63SVladimir Kondratyev /* Usages Digitizers */
1081ffa5c63SVladimir Kondratyev #define	HUD_UNDEFINED		0x0000
1091ffa5c63SVladimir Kondratyev #define	HUD_DIGITIZER		0x0001
1101ffa5c63SVladimir Kondratyev #define	HUD_PEN			0x0002
1111ffa5c63SVladimir Kondratyev #define	HUD_TOUCHSCREEN		0x0004
1121ffa5c63SVladimir Kondratyev #define	HUD_TOUCHPAD		0x0005
1131ffa5c63SVladimir Kondratyev #define	HUD_CONFIG		0x000e
1141ffa5c63SVladimir Kondratyev #define	HUD_FINGER		0x0022
1151ffa5c63SVladimir Kondratyev #define	HUD_TIP_PRESSURE	0x0030
1161ffa5c63SVladimir Kondratyev #define	HUD_BARREL_PRESSURE	0x0031
1171ffa5c63SVladimir Kondratyev #define	HUD_IN_RANGE		0x0032
1181ffa5c63SVladimir Kondratyev #define	HUD_TOUCH		0x0033
1191ffa5c63SVladimir Kondratyev #define	HUD_UNTOUCH		0x0034
1201ffa5c63SVladimir Kondratyev #define	HUD_TAP			0x0035
1211ffa5c63SVladimir Kondratyev #define	HUD_QUALITY		0x0036
1221ffa5c63SVladimir Kondratyev #define	HUD_DATA_VALID		0x0037
1231ffa5c63SVladimir Kondratyev #define	HUD_TRANSDUCER_INDEX	0x0038
1241ffa5c63SVladimir Kondratyev #define	HUD_TABLET_FKEYS	0x0039
1251ffa5c63SVladimir Kondratyev #define	HUD_PROGRAM_CHANGE_KEYS	0x003a
1261ffa5c63SVladimir Kondratyev #define	HUD_BATTERY_STRENGTH	0x003b
1271ffa5c63SVladimir Kondratyev #define	HUD_INVERT		0x003c
1281ffa5c63SVladimir Kondratyev #define	HUD_X_TILT		0x003d
1291ffa5c63SVladimir Kondratyev #define	HUD_Y_TILT		0x003e
1301ffa5c63SVladimir Kondratyev #define	HUD_AZIMUTH		0x003f
1311ffa5c63SVladimir Kondratyev #define	HUD_ALTITUDE		0x0040
1321ffa5c63SVladimir Kondratyev #define	HUD_TWIST		0x0041
1331ffa5c63SVladimir Kondratyev #define	HUD_TIP_SWITCH		0x0042
1341ffa5c63SVladimir Kondratyev #define	HUD_SEC_TIP_SWITCH	0x0043
1351ffa5c63SVladimir Kondratyev #define	HUD_BARREL_SWITCH	0x0044
1361ffa5c63SVladimir Kondratyev #define	HUD_ERASER		0x0045
1371ffa5c63SVladimir Kondratyev #define	HUD_TABLET_PICK		0x0046
1381ffa5c63SVladimir Kondratyev #define	HUD_CONFIDENCE		0x0047
1391ffa5c63SVladimir Kondratyev #define	HUD_WIDTH		0x0048
1401ffa5c63SVladimir Kondratyev #define	HUD_HEIGHT		0x0049
1411ffa5c63SVladimir Kondratyev #define	HUD_CONTACTID		0x0051
1421ffa5c63SVladimir Kondratyev #define	HUD_INPUT_MODE		0x0052
1431ffa5c63SVladimir Kondratyev #define	HUD_DEVICE_INDEX	0x0053
1441ffa5c63SVladimir Kondratyev #define	HUD_CONTACTCOUNT	0x0054
1451ffa5c63SVladimir Kondratyev #define	HUD_CONTACT_MAX		0x0055
1461ffa5c63SVladimir Kondratyev #define	HUD_SCAN_TIME		0x0056
1471ffa5c63SVladimir Kondratyev #define	HUD_SURFACE_SWITCH	0x0057
1481ffa5c63SVladimir Kondratyev #define	HUD_BUTTONS_SWITCH	0x0058
1491ffa5c63SVladimir Kondratyev #define	HUD_BUTTON_TYPE		0x0059
1501ffa5c63SVladimir Kondratyev #define	HUD_LATENCY_MODE	0x0060
1511ffa5c63SVladimir Kondratyev 
1521ffa5c63SVladimir Kondratyev /* Usages, Consumer */
1531ffa5c63SVladimir Kondratyev #define	HUC_AC_PAN		0x0238
1541ffa5c63SVladimir Kondratyev 
1551ffa5c63SVladimir Kondratyev #define	HID_USAGE2(p,u) (((p) << 16) | (u))
1561ffa5c63SVladimir Kondratyev 
1571ffa5c63SVladimir Kondratyev #define	UHID_INPUT_REPORT 0x01
1581ffa5c63SVladimir Kondratyev #define	UHID_OUTPUT_REPORT 0x02
1591ffa5c63SVladimir Kondratyev #define	UHID_FEATURE_REPORT 0x03
1601ffa5c63SVladimir Kondratyev 
1611ffa5c63SVladimir Kondratyev /* Bits in the input/output/feature items */
1621ffa5c63SVladimir Kondratyev #define	HIO_CONST	0x001
1631ffa5c63SVladimir Kondratyev #define	HIO_VARIABLE	0x002
1641ffa5c63SVladimir Kondratyev #define	HIO_RELATIVE	0x004
1651ffa5c63SVladimir Kondratyev #define	HIO_WRAP	0x008
1661ffa5c63SVladimir Kondratyev #define	HIO_NONLINEAR	0x010
1671ffa5c63SVladimir Kondratyev #define	HIO_NOPREF	0x020
1681ffa5c63SVladimir Kondratyev #define	HIO_NULLSTATE	0x040
1691ffa5c63SVladimir Kondratyev #define	HIO_VOLATILE	0x080
1701ffa5c63SVladimir Kondratyev #define	HIO_BUFBYTES	0x100
1711ffa5c63SVladimir Kondratyev 
1721ffa5c63SVladimir Kondratyev /* Units of Measure */
1731ffa5c63SVladimir Kondratyev #define	HUM_CENTIMETER	0x11
1741ffa5c63SVladimir Kondratyev #define	HUM_RADIAN	0x12
1751ffa5c63SVladimir Kondratyev #define	HUM_INCH	0x13
1761ffa5c63SVladimir Kondratyev #define	HUM_DEGREE	0x14
1771ffa5c63SVladimir Kondratyev 
1781ffa5c63SVladimir Kondratyev #if defined(_KERNEL) || defined(_STANDALONE)
1791ffa5c63SVladimir Kondratyev 
1801ffa5c63SVladimir Kondratyev #define	HID_ITEM_MAXUSAGE	4
1811ffa5c63SVladimir Kondratyev 
1821ffa5c63SVladimir Kondratyev enum hid_kind {
1831ffa5c63SVladimir Kondratyev 	hid_input, hid_output, hid_feature, hid_collection, hid_endcollection
1841ffa5c63SVladimir Kondratyev };
1851ffa5c63SVladimir Kondratyev 
1861ffa5c63SVladimir Kondratyev struct hid_location {
1871ffa5c63SVladimir Kondratyev 	uint32_t size;
1881ffa5c63SVladimir Kondratyev 	uint32_t count;
1891ffa5c63SVladimir Kondratyev 	uint32_t pos;
1901ffa5c63SVladimir Kondratyev };
1911ffa5c63SVladimir Kondratyev 
1921ffa5c63SVladimir Kondratyev struct hid_item {
1931ffa5c63SVladimir Kondratyev 	/* Global */
1941ffa5c63SVladimir Kondratyev 	int32_t	_usage_page;
1951ffa5c63SVladimir Kondratyev 	int32_t	logical_minimum;
1961ffa5c63SVladimir Kondratyev 	int32_t	logical_maximum;
1971ffa5c63SVladimir Kondratyev 	int32_t	physical_minimum;
1981ffa5c63SVladimir Kondratyev 	int32_t	physical_maximum;
1991ffa5c63SVladimir Kondratyev 	int32_t	unit_exponent;
2001ffa5c63SVladimir Kondratyev 	int32_t	unit;
2011ffa5c63SVladimir Kondratyev 	int32_t	report_ID;
2021ffa5c63SVladimir Kondratyev 	/* Local */
2031ffa5c63SVladimir Kondratyev 	int	nusages;
2041ffa5c63SVladimir Kondratyev 	union {
2051ffa5c63SVladimir Kondratyev 		int32_t	usage;
2061ffa5c63SVladimir Kondratyev 		int32_t usages[HID_ITEM_MAXUSAGE];
2071ffa5c63SVladimir Kondratyev 	};
2081ffa5c63SVladimir Kondratyev 	int32_t	usage_minimum;
2091ffa5c63SVladimir Kondratyev 	int32_t	usage_maximum;
2101ffa5c63SVladimir Kondratyev 	int32_t	designator_index;
2111ffa5c63SVladimir Kondratyev 	int32_t	designator_minimum;
2121ffa5c63SVladimir Kondratyev 	int32_t	designator_maximum;
2131ffa5c63SVladimir Kondratyev 	int32_t	string_index;
2141ffa5c63SVladimir Kondratyev 	int32_t	string_minimum;
2151ffa5c63SVladimir Kondratyev 	int32_t	string_maximum;
2161ffa5c63SVladimir Kondratyev 	int32_t	set_delimiter;
2171ffa5c63SVladimir Kondratyev 	/* Misc */
2181ffa5c63SVladimir Kondratyev 	int32_t	collection;
2191ffa5c63SVladimir Kondratyev 	int	collevel;
2201ffa5c63SVladimir Kondratyev 	enum hid_kind kind;
2211ffa5c63SVladimir Kondratyev 	uint32_t flags;
2221ffa5c63SVladimir Kondratyev 	/* Location */
2231ffa5c63SVladimir Kondratyev 	struct hid_location loc;
2241ffa5c63SVladimir Kondratyev };
2251ffa5c63SVladimir Kondratyev 
2261ffa5c63SVladimir Kondratyev /* prototypes from "usb_hid.c" */
2271ffa5c63SVladimir Kondratyev 
2281ffa5c63SVladimir Kondratyev struct hid_data *hid_start_parse(const void *d, usb_size_t len, int kindset);
2291ffa5c63SVladimir Kondratyev void	hid_end_parse(struct hid_data *s);
2301ffa5c63SVladimir Kondratyev int	hid_get_item(struct hid_data *s, struct hid_item *h);
2311ffa5c63SVladimir Kondratyev int	hid_report_size(const void *buf, usb_size_t len, enum hid_kind k,
2321ffa5c63SVladimir Kondratyev 	    uint8_t *id);
2331ffa5c63SVladimir Kondratyev int	hid_locate(const void *desc, usb_size_t size, int32_t usage,
2341ffa5c63SVladimir Kondratyev 	    enum hid_kind kind, uint8_t index, struct hid_location *loc,
2351ffa5c63SVladimir Kondratyev 	    uint32_t *flags, uint8_t *id);
2361ffa5c63SVladimir Kondratyev int32_t hid_get_data(const uint8_t *buf, usb_size_t len,
2371ffa5c63SVladimir Kondratyev 	    struct hid_location *loc);
2381ffa5c63SVladimir Kondratyev uint32_t hid_get_data_unsigned(const uint8_t *buf, usb_size_t len,
2391ffa5c63SVladimir Kondratyev 	    struct hid_location *loc);
2401ffa5c63SVladimir Kondratyev void hid_put_data_unsigned(uint8_t *buf, usb_size_t len,
2411ffa5c63SVladimir Kondratyev 	    struct hid_location *loc, unsigned int value);
2421ffa5c63SVladimir Kondratyev int	hid_is_collection(const void *desc, usb_size_t size, int32_t usage);
2431ffa5c63SVladimir Kondratyev int32_t	hid_item_resolution(struct hid_item *hi);
2441ffa5c63SVladimir Kondratyev int	hid_is_mouse(const void *d_ptr, uint16_t d_len);
2451ffa5c63SVladimir Kondratyev int	hid_is_keyboard(const void *d_ptr, uint16_t d_len);
2461ffa5c63SVladimir Kondratyev #endif	/* _KERNEL || _STANDALONE */
247*67de2db2SVladimir Kondratyev #endif	/* _HID_HID_H_ */
248