252 lines · plain
1================================================2Care and feeding of your Human Interface Devices3================================================4 5Introduction6============7 8In addition to the normal input type HID devices, USB also uses the9human interface device protocols for things that are not really human10interfaces, but have similar sorts of communication needs. The two big11examples for this are power devices (especially uninterruptible power12supplies) and monitor control on higher end monitors.13 14To support these disparate requirements, the Linux USB system provides15HID events to two separate interfaces:16* the input subsystem, which converts HID events into normal input17device interfaces (such as keyboard, mouse and joystick) and a18normalised event interface - see Documentation/input/input.rst19* the hiddev interface, which provides fairly raw HID events20 21The data flow for a HID event produced by a device is something like22the following::23 24 usb.c ---> hid-core.c ----> hid-input.c ----> [keyboard/mouse/joystick/event]25 |26 |27 --> hiddev.c ----> POWER / MONITOR CONTROL28 29In addition, other subsystems (apart from USB) can potentially feed30events into the input subsystem, but these have no effect on the HID31device interface.32 33Using the HID Device Interface34==============================35 36The hiddev interface is a char interface using the normal USB major,37with the minor numbers starting at 96 and finishing at 111. Therefore,38you need the following commands::39 40 mknod /dev/usb/hiddev0 c 180 9641 mknod /dev/usb/hiddev1 c 180 9742 mknod /dev/usb/hiddev2 c 180 9843 mknod /dev/usb/hiddev3 c 180 9944 mknod /dev/usb/hiddev4 c 180 10045 mknod /dev/usb/hiddev5 c 180 10146 mknod /dev/usb/hiddev6 c 180 10247 mknod /dev/usb/hiddev7 c 180 10348 mknod /dev/usb/hiddev8 c 180 10449 mknod /dev/usb/hiddev9 c 180 10550 mknod /dev/usb/hiddev10 c 180 10651 mknod /dev/usb/hiddev11 c 180 10752 mknod /dev/usb/hiddev12 c 180 10853 mknod /dev/usb/hiddev13 c 180 10954 mknod /dev/usb/hiddev14 c 180 11055 mknod /dev/usb/hiddev15 c 180 11156 57So you point your hiddev compliant user-space program at the correct58interface for your device, and it all just works.59 60Assuming that you have a hiddev compliant user-space program, of61course. If you need to write one, read on.62 63 64The HIDDEV API65==============66 67This description should be read in conjunction with the HID68specification, freely available from https://www.usb.org, and69conveniently linked of http://www.linux-usb.org.70 71The hiddev API uses a read() interface, and a set of ioctl() calls.72 73HID devices exchange data with the host computer using data74bundles called "reports". Each report is divided into "fields",75each of which can have one or more "usages". In the hid-core,76each one of these usages has a single signed 32-bit value.77 78read():79-------80 81This is the event interface. When the HID device's state changes,82it performs an interrupt transfer containing a report which contains83the changed value. The hid-core.c module parses the report, and84returns to hiddev.c the individual usages that have changed within85the report. In its basic mode, the hiddev will make these individual86usage changes available to the reader using a struct hiddev_event::87 88 struct hiddev_event {89 unsigned hid;90 signed int value;91 };92 93containing the HID usage identifier for the status that changed, and94the value that it was changed to. Note that the structure is defined95within <linux/hiddev.h>, along with some other useful #defines and96structures. The HID usage identifier is a composite of the HID usage97page shifted to the 16 high order bits ORed with the usage code. The98behavior of the read() function can be modified using the HIDIOCSFLAG99ioctl() described below.100 101 102ioctl():103--------104 105This is the control interface. There are a number of controls:106 107HIDIOCGVERSION108 - int (read)109 110 Gets the version code out of the hiddev driver.111 112HIDIOCAPPLICATION113 - (none)114 115This ioctl call returns the HID application usage associated with the116HID device. The third argument to ioctl() specifies which application117index to get. This is useful when the device has more than one118application collection. If the index is invalid (greater or equal to119the number of application collections this device has) the ioctl120returns -1. You can find out beforehand how many application121collections the device has from the num_applications field from the122hiddev_devinfo structure.123 124HIDIOCGCOLLECTIONINFO125 - struct hiddev_collection_info (read/write)126 127This returns a superset of the information above, providing not only128application collections, but all the collections the device has. It129also returns the level the collection lives in the hierarchy.130The user passes in a hiddev_collection_info struct with the index131field set to the index that should be returned. The ioctl fills in132the other fields. If the index is larger than the last collection133index, the ioctl returns -1 and sets errno to -EINVAL.134 135HIDIOCGDEVINFO136 - struct hiddev_devinfo (read)137 138Gets a hiddev_devinfo structure which describes the device.139 140HIDIOCGSTRING141 - struct hiddev_string_descriptor (read/write)142 143Gets a string descriptor from the device. The caller must fill in the144"index" field to indicate which descriptor should be returned.145 146HIDIOCINITREPORT147 - (none)148 149Instructs the kernel to retrieve all input and feature report values150from the device. At this point, all the usage structures will contain151current values for the device, and will maintain it as the device152changes. Note that the use of this ioctl is unnecessary in general,153since later kernels automatically initialize the reports from the154device at attach time.155 156HIDIOCGNAME157 - string (variable length)158 159Gets the device name160 161HIDIOCGREPORT162 - struct hiddev_report_info (write)163 164Instructs the kernel to get a feature or input report from the device,165in order to selectively update the usage structures (in contrast to166INITREPORT).167 168HIDIOCSREPORT169 - struct hiddev_report_info (write)170 171Instructs the kernel to send a report to the device. This report can172be filled in by the user through HIDIOCSUSAGE calls (below) to fill in173individual usage values in the report before sending the report in full174to the device.175 176HIDIOCGREPORTINFO177 - struct hiddev_report_info (read/write)178 179Fills in a hiddev_report_info structure for the user. The report is180looked up by type (input, output or feature) and id, so these fields181must be filled in by the user. The ID can be absolute -- the actual182report id as reported by the device -- or relative --183HID_REPORT_ID_FIRST for the first report, and (HID_REPORT_ID_NEXT |184report_id) for the next report after report_id. Without a priori185information about report ids, the right way to use this ioctl is to186use the relative IDs above to enumerate the valid IDs. The ioctl187returns non-zero when there is no more next ID. The real report ID is188filled into the returned hiddev_report_info structure.189 190HIDIOCGFIELDINFO191 - struct hiddev_field_info (read/write)192 193Returns the field information associated with a report in a194hiddev_field_info structure. The user must fill in report_id and195report_type in this structure, as above. The field_index should also196be filled in, which should be a number from 0 and maxfield-1, as197returned from a previous HIDIOCGREPORTINFO call.198 199HIDIOCGUCODE200 - struct hiddev_usage_ref (read/write)201 202Returns the usage_code in a hiddev_usage_ref structure, given that203its report type, report id, field index, and index within the204field have already been filled into the structure.205 206HIDIOCGUSAGE207 - struct hiddev_usage_ref (read/write)208 209Returns the value of a usage in a hiddev_usage_ref structure. The210usage to be retrieved can be specified as above, or the user can211choose to fill in the report_type field and specify the report_id as212HID_REPORT_ID_UNKNOWN. In this case, the hiddev_usage_ref will be213filled in with the report and field information associated with this214usage if it is found.215 216HIDIOCSUSAGE217 - struct hiddev_usage_ref (write)218 219Sets the value of a usage in an output report. The user fills in220the hiddev_usage_ref structure as above, but additionally fills in221the value field.222 223HIDIOGCOLLECTIONINDEX224 - struct hiddev_usage_ref (write)225 226Returns the collection index associated with this usage. This227indicates where in the collection hierarchy this usage sits.228 229HIDIOCGFLAG230 - int (read)231HIDIOCSFLAG232 - int (write)233 234These operations respectively inspect and replace the mode flags235that influence the read() call above. The flags are as follows:236 237 HIDDEV_FLAG_UREF238 - read() calls will now return239 struct hiddev_usage_ref instead of struct hiddev_event.240 This is a larger structure, but in situations where the241 device has more than one usage in its reports with the242 same usage code, this mode serves to resolve such243 ambiguity.244 245 HIDDEV_FLAG_REPORT246 - This flag can only be used in conjunction247 with HIDDEV_FLAG_UREF. With this flag set, when the device248 sends a report, a struct hiddev_usage_ref will be returned249 to read() filled in with the report_type and report_id, but250 with field_index set to FIELD_INDEX_NONE. This serves as251 additional notification when the device has sent a report.252