1*01698658SMarkus Pfeiffer /* $FreeBSD: head/sys/dev/usb/usbhid.h 246122 2013-01-30 15:26:04Z hselasky $ */ 212bd3c8bSSascha Wildner /*- 312bd3c8bSSascha Wildner * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 412bd3c8bSSascha Wildner * Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved. 512bd3c8bSSascha Wildner * Copyright (c) 1998 Lennart Augustsson. All rights reserved. 612bd3c8bSSascha Wildner * 712bd3c8bSSascha Wildner * Redistribution and use in source and binary forms, with or without 812bd3c8bSSascha Wildner * modification, are permitted provided that the following conditions 912bd3c8bSSascha Wildner * are met: 1012bd3c8bSSascha Wildner * 1. Redistributions of source code must retain the above copyright 1112bd3c8bSSascha Wildner * notice, this list of conditions and the following disclaimer. 1212bd3c8bSSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 1312bd3c8bSSascha Wildner * notice, this list of conditions and the following disclaimer in the 1412bd3c8bSSascha Wildner * documentation and/or other materials provided with the distribution. 1512bd3c8bSSascha Wildner * 1612bd3c8bSSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1712bd3c8bSSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1812bd3c8bSSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1912bd3c8bSSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2012bd3c8bSSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2112bd3c8bSSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2212bd3c8bSSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2312bd3c8bSSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2412bd3c8bSSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2512bd3c8bSSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2612bd3c8bSSascha Wildner * SUCH DAMAGE. 2712bd3c8bSSascha Wildner */ 2812bd3c8bSSascha Wildner 2912bd3c8bSSascha Wildner #ifndef _USB_HID_H_ 3012bd3c8bSSascha Wildner #define _USB_HID_H_ 3112bd3c8bSSascha Wildner 323186c89eSSascha Wildner #include <bus/u4b/usb_endian.h> 3312bd3c8bSSascha Wildner 3412bd3c8bSSascha Wildner #define UR_GET_HID_DESCRIPTOR 0x06 3512bd3c8bSSascha Wildner #define UDESC_HID 0x21 3612bd3c8bSSascha Wildner #define UDESC_REPORT 0x22 3712bd3c8bSSascha Wildner #define UDESC_PHYSICAL 0x23 3812bd3c8bSSascha Wildner #define UR_SET_HID_DESCRIPTOR 0x07 3912bd3c8bSSascha Wildner #define UR_GET_REPORT 0x01 4012bd3c8bSSascha Wildner #define UR_SET_REPORT 0x09 4112bd3c8bSSascha Wildner #define UR_GET_IDLE 0x02 4212bd3c8bSSascha Wildner #define UR_SET_IDLE 0x0a 4312bd3c8bSSascha Wildner #define UR_GET_PROTOCOL 0x03 4412bd3c8bSSascha Wildner #define UR_SET_PROTOCOL 0x0b 4512bd3c8bSSascha Wildner 4612bd3c8bSSascha Wildner struct usb_hid_descriptor { 4712bd3c8bSSascha Wildner uByte bLength; 4812bd3c8bSSascha Wildner uByte bDescriptorType; 4912bd3c8bSSascha Wildner uWord bcdHID; 5012bd3c8bSSascha Wildner uByte bCountryCode; 5112bd3c8bSSascha Wildner uByte bNumDescriptors; 5212bd3c8bSSascha Wildner struct { 5312bd3c8bSSascha Wildner uByte bDescriptorType; 5412bd3c8bSSascha Wildner uWord wDescriptorLength; 5512bd3c8bSSascha Wildner } descrs[1]; 5612bd3c8bSSascha Wildner } __packed; 5712bd3c8bSSascha Wildner 5812bd3c8bSSascha Wildner #define USB_HID_DESCRIPTOR_SIZE(n) (9+((n)*3)) 5912bd3c8bSSascha Wildner 6012bd3c8bSSascha Wildner /* Usage pages */ 6112bd3c8bSSascha Wildner #define HUP_UNDEFINED 0x0000 6212bd3c8bSSascha Wildner #define HUP_GENERIC_DESKTOP 0x0001 6312bd3c8bSSascha Wildner #define HUP_SIMULATION 0x0002 6412bd3c8bSSascha Wildner #define HUP_VR_CONTROLS 0x0003 6512bd3c8bSSascha Wildner #define HUP_SPORTS_CONTROLS 0x0004 6612bd3c8bSSascha Wildner #define HUP_GAMING_CONTROLS 0x0005 6712bd3c8bSSascha Wildner #define HUP_KEYBOARD 0x0007 6812bd3c8bSSascha Wildner #define HUP_LEDS 0x0008 6912bd3c8bSSascha Wildner #define HUP_BUTTON 0x0009 7012bd3c8bSSascha Wildner #define HUP_ORDINALS 0x000a 7112bd3c8bSSascha Wildner #define HUP_TELEPHONY 0x000b 7212bd3c8bSSascha Wildner #define HUP_CONSUMER 0x000c 7312bd3c8bSSascha Wildner #define HUP_DIGITIZERS 0x000d 7412bd3c8bSSascha Wildner #define HUP_PHYSICAL_IFACE 0x000e 7512bd3c8bSSascha Wildner #define HUP_UNICODE 0x0010 7612bd3c8bSSascha Wildner #define HUP_ALPHANUM_DISPLAY 0x0014 7712bd3c8bSSascha Wildner #define HUP_MONITOR 0x0080 7812bd3c8bSSascha Wildner #define HUP_MONITOR_ENUM_VAL 0x0081 7912bd3c8bSSascha Wildner #define HUP_VESA_VC 0x0082 8012bd3c8bSSascha Wildner #define HUP_VESA_CMD 0x0083 8112bd3c8bSSascha Wildner #define HUP_POWER 0x0084 8212bd3c8bSSascha Wildner #define HUP_BATTERY_SYSTEM 0x0085 8312bd3c8bSSascha Wildner #define HUP_BARCODE_SCANNER 0x008b 8412bd3c8bSSascha Wildner #define HUP_SCALE 0x008c 8512bd3c8bSSascha Wildner #define HUP_CAMERA_CONTROL 0x0090 8612bd3c8bSSascha Wildner #define HUP_ARCADE 0x0091 8712bd3c8bSSascha Wildner #define HUP_MICROSOFT 0xff00 8812bd3c8bSSascha Wildner 8912bd3c8bSSascha Wildner /* Usages, generic desktop */ 9012bd3c8bSSascha Wildner #define HUG_POINTER 0x0001 9112bd3c8bSSascha Wildner #define HUG_MOUSE 0x0002 9212bd3c8bSSascha Wildner #define HUG_JOYSTICK 0x0004 9312bd3c8bSSascha Wildner #define HUG_GAME_PAD 0x0005 9412bd3c8bSSascha Wildner #define HUG_KEYBOARD 0x0006 9512bd3c8bSSascha Wildner #define HUG_KEYPAD 0x0007 9612bd3c8bSSascha Wildner #define HUG_X 0x0030 9712bd3c8bSSascha Wildner #define HUG_Y 0x0031 9812bd3c8bSSascha Wildner #define HUG_Z 0x0032 9912bd3c8bSSascha Wildner #define HUG_RX 0x0033 10012bd3c8bSSascha Wildner #define HUG_RY 0x0034 10112bd3c8bSSascha Wildner #define HUG_RZ 0x0035 10212bd3c8bSSascha Wildner #define HUG_SLIDER 0x0036 10312bd3c8bSSascha Wildner #define HUG_DIAL 0x0037 10412bd3c8bSSascha Wildner #define HUG_WHEEL 0x0038 10512bd3c8bSSascha Wildner #define HUG_HAT_SWITCH 0x0039 10612bd3c8bSSascha Wildner #define HUG_COUNTED_BUFFER 0x003a 10712bd3c8bSSascha Wildner #define HUG_BYTE_COUNT 0x003b 10812bd3c8bSSascha Wildner #define HUG_MOTION_WAKEUP 0x003c 10912bd3c8bSSascha Wildner #define HUG_VX 0x0040 11012bd3c8bSSascha Wildner #define HUG_VY 0x0041 11112bd3c8bSSascha Wildner #define HUG_VZ 0x0042 11212bd3c8bSSascha Wildner #define HUG_VBRX 0x0043 11312bd3c8bSSascha Wildner #define HUG_VBRY 0x0044 11412bd3c8bSSascha Wildner #define HUG_VBRZ 0x0045 11512bd3c8bSSascha Wildner #define HUG_VNO 0x0046 11612bd3c8bSSascha Wildner #define HUG_TWHEEL 0x0048 /* M$ Wireless Intellimouse Wheel */ 11712bd3c8bSSascha Wildner #define HUG_SYSTEM_CONTROL 0x0080 11812bd3c8bSSascha Wildner #define HUG_SYSTEM_POWER_DOWN 0x0081 11912bd3c8bSSascha Wildner #define HUG_SYSTEM_SLEEP 0x0082 12012bd3c8bSSascha Wildner #define HUG_SYSTEM_WAKEUP 0x0083 12112bd3c8bSSascha Wildner #define HUG_SYSTEM_CONTEXT_MENU 0x0084 12212bd3c8bSSascha Wildner #define HUG_SYSTEM_MAIN_MENU 0x0085 12312bd3c8bSSascha Wildner #define HUG_SYSTEM_APP_MENU 0x0086 12412bd3c8bSSascha Wildner #define HUG_SYSTEM_MENU_HELP 0x0087 12512bd3c8bSSascha Wildner #define HUG_SYSTEM_MENU_EXIT 0x0088 12612bd3c8bSSascha Wildner #define HUG_SYSTEM_MENU_SELECT 0x0089 12712bd3c8bSSascha Wildner #define HUG_SYSTEM_MENU_RIGHT 0x008a 12812bd3c8bSSascha Wildner #define HUG_SYSTEM_MENU_LEFT 0x008b 12912bd3c8bSSascha Wildner #define HUG_SYSTEM_MENU_UP 0x008c 13012bd3c8bSSascha Wildner #define HUG_SYSTEM_MENU_DOWN 0x008d 13112bd3c8bSSascha Wildner #define HUG_APPLE_EJECT 0x00b8 13212bd3c8bSSascha Wildner 13312bd3c8bSSascha Wildner /* Usages Digitizers */ 13412bd3c8bSSascha Wildner #define HUD_UNDEFINED 0x0000 13512bd3c8bSSascha Wildner #define HUD_TIP_PRESSURE 0x0030 13612bd3c8bSSascha Wildner #define HUD_BARREL_PRESSURE 0x0031 13712bd3c8bSSascha Wildner #define HUD_IN_RANGE 0x0032 13812bd3c8bSSascha Wildner #define HUD_TOUCH 0x0033 13912bd3c8bSSascha Wildner #define HUD_UNTOUCH 0x0034 14012bd3c8bSSascha Wildner #define HUD_TAP 0x0035 14112bd3c8bSSascha Wildner #define HUD_QUALITY 0x0036 14212bd3c8bSSascha Wildner #define HUD_DATA_VALID 0x0037 14312bd3c8bSSascha Wildner #define HUD_TRANSDUCER_INDEX 0x0038 14412bd3c8bSSascha Wildner #define HUD_TABLET_FKEYS 0x0039 14512bd3c8bSSascha Wildner #define HUD_PROGRAM_CHANGE_KEYS 0x003a 14612bd3c8bSSascha Wildner #define HUD_BATTERY_STRENGTH 0x003b 14712bd3c8bSSascha Wildner #define HUD_INVERT 0x003c 14812bd3c8bSSascha Wildner #define HUD_X_TILT 0x003d 14912bd3c8bSSascha Wildner #define HUD_Y_TILT 0x003e 15012bd3c8bSSascha Wildner #define HUD_AZIMUTH 0x003f 15112bd3c8bSSascha Wildner #define HUD_ALTITUDE 0x0040 15212bd3c8bSSascha Wildner #define HUD_TWIST 0x0041 15312bd3c8bSSascha Wildner #define HUD_TIP_SWITCH 0x0042 15412bd3c8bSSascha Wildner #define HUD_SEC_TIP_SWITCH 0x0043 15512bd3c8bSSascha Wildner #define HUD_BARREL_SWITCH 0x0044 15612bd3c8bSSascha Wildner #define HUD_ERASER 0x0045 15712bd3c8bSSascha Wildner #define HUD_TABLET_PICK 0x0046 15812bd3c8bSSascha Wildner 15912bd3c8bSSascha Wildner /* Usages, Consumer */ 16012bd3c8bSSascha Wildner #define HUC_AC_PAN 0x0238 16112bd3c8bSSascha Wildner 16212bd3c8bSSascha Wildner #define HID_USAGE2(p,u) (((p) << 16) | (u)) 16312bd3c8bSSascha Wildner 16412bd3c8bSSascha Wildner #define UHID_INPUT_REPORT 0x01 16512bd3c8bSSascha Wildner #define UHID_OUTPUT_REPORT 0x02 16612bd3c8bSSascha Wildner #define UHID_FEATURE_REPORT 0x03 16712bd3c8bSSascha Wildner 16812bd3c8bSSascha Wildner /* Bits in the input/output/feature items */ 16912bd3c8bSSascha Wildner #define HIO_CONST 0x001 17012bd3c8bSSascha Wildner #define HIO_VARIABLE 0x002 17112bd3c8bSSascha Wildner #define HIO_RELATIVE 0x004 17212bd3c8bSSascha Wildner #define HIO_WRAP 0x008 17312bd3c8bSSascha Wildner #define HIO_NONLINEAR 0x010 17412bd3c8bSSascha Wildner #define HIO_NOPREF 0x020 17512bd3c8bSSascha Wildner #define HIO_NULLSTATE 0x040 17612bd3c8bSSascha Wildner #define HIO_VOLATILE 0x080 17712bd3c8bSSascha Wildner #define HIO_BUFBYTES 0x100 17812bd3c8bSSascha Wildner 17912bd3c8bSSascha Wildner #ifdef _KERNEL 18012bd3c8bSSascha Wildner struct usb_config_descriptor; 18112bd3c8bSSascha Wildner 18212bd3c8bSSascha Wildner enum hid_kind { 18312bd3c8bSSascha Wildner hid_input, hid_output, hid_feature, hid_collection, hid_endcollection 18412bd3c8bSSascha Wildner }; 18512bd3c8bSSascha Wildner 18612bd3c8bSSascha Wildner struct hid_location { 18712bd3c8bSSascha Wildner uint32_t size; 18812bd3c8bSSascha Wildner uint32_t count; 18912bd3c8bSSascha Wildner uint32_t pos; 19012bd3c8bSSascha Wildner }; 19112bd3c8bSSascha Wildner 19212bd3c8bSSascha Wildner struct hid_item { 19312bd3c8bSSascha Wildner /* Global */ 19412bd3c8bSSascha Wildner int32_t _usage_page; 19512bd3c8bSSascha Wildner int32_t logical_minimum; 19612bd3c8bSSascha Wildner int32_t logical_maximum; 19712bd3c8bSSascha Wildner int32_t physical_minimum; 19812bd3c8bSSascha Wildner int32_t physical_maximum; 19912bd3c8bSSascha Wildner int32_t unit_exponent; 20012bd3c8bSSascha Wildner int32_t unit; 20112bd3c8bSSascha Wildner int32_t report_ID; 20212bd3c8bSSascha Wildner /* Local */ 20312bd3c8bSSascha Wildner int32_t usage; 20412bd3c8bSSascha Wildner int32_t usage_minimum; 20512bd3c8bSSascha Wildner int32_t usage_maximum; 20612bd3c8bSSascha Wildner int32_t designator_index; 20712bd3c8bSSascha Wildner int32_t designator_minimum; 20812bd3c8bSSascha Wildner int32_t designator_maximum; 20912bd3c8bSSascha Wildner int32_t string_index; 21012bd3c8bSSascha Wildner int32_t string_minimum; 21112bd3c8bSSascha Wildner int32_t string_maximum; 21212bd3c8bSSascha Wildner int32_t set_delimiter; 21312bd3c8bSSascha Wildner /* Misc */ 21412bd3c8bSSascha Wildner int32_t collection; 21512bd3c8bSSascha Wildner int collevel; 21612bd3c8bSSascha Wildner enum hid_kind kind; 21712bd3c8bSSascha Wildner uint32_t flags; 21812bd3c8bSSascha Wildner /* Location */ 21912bd3c8bSSascha Wildner struct hid_location loc; 22012bd3c8bSSascha Wildner }; 22112bd3c8bSSascha Wildner 22212bd3c8bSSascha Wildner /* prototypes from "usb_hid.c" */ 22312bd3c8bSSascha Wildner 22412bd3c8bSSascha Wildner struct hid_data *hid_start_parse(const void *d, usb_size_t len, int kindset); 22512bd3c8bSSascha Wildner void hid_end_parse(struct hid_data *s); 22612bd3c8bSSascha Wildner int hid_get_item(struct hid_data *s, struct hid_item *h); 22712bd3c8bSSascha Wildner int hid_report_size(const void *buf, usb_size_t len, enum hid_kind k, 22812bd3c8bSSascha Wildner uint8_t *id); 22957bed822SMarkus Pfeiffer int hid_locate(const void *desc, usb_size_t size, int32_t usage, 23012bd3c8bSSascha Wildner enum hid_kind kind, uint8_t index, struct hid_location *loc, 23112bd3c8bSSascha Wildner uint32_t *flags, uint8_t *id); 23212bd3c8bSSascha Wildner int32_t hid_get_data(const uint8_t *buf, usb_size_t len, 23312bd3c8bSSascha Wildner struct hid_location *loc); 23412bd3c8bSSascha Wildner uint32_t hid_get_data_unsigned(const uint8_t *buf, usb_size_t len, 23512bd3c8bSSascha Wildner struct hid_location *loc); 23612bd3c8bSSascha Wildner void hid_put_data_unsigned(uint8_t *buf, usb_size_t len, 23712bd3c8bSSascha Wildner struct hid_location *loc, unsigned int value); 23857bed822SMarkus Pfeiffer int hid_is_collection(const void *desc, usb_size_t size, int32_t usage); 23912bd3c8bSSascha Wildner struct usb_hid_descriptor *hid_get_descriptor_from_usb( 24012bd3c8bSSascha Wildner struct usb_config_descriptor *cd, 24112bd3c8bSSascha Wildner struct usb_interface_descriptor *id); 242722d05c3SSascha Wildner usb_error_t usbd_req_get_hid_desc(struct usb_device *udev, struct lock *lock, 24312bd3c8bSSascha Wildner void **descp, uint16_t *sizep, struct malloc_type *mem, 24412bd3c8bSSascha Wildner uint8_t iface_index); 24557bed822SMarkus Pfeiffer int hid_is_mouse(const void *d_ptr, uint16_t d_len); 24657bed822SMarkus Pfeiffer int hid_is_keyboard(const void *d_ptr, uint16_t d_len); 24712bd3c8bSSascha Wildner #endif /* _KERNEL */ 24812bd3c8bSSascha Wildner #endif /* _USB_HID_H_ */ 249