Commit 1a978c50c6cff743c3516ffa6d2ce44382e7b70b
Committed by
Jiri Kosina
1 parent
c54ea4918c
Exists in
master
and in
20 other branches
HID: Move hiddev.txt to the new Documentation/hid directory
With the new Documentation/hid directory, it makes sense to have hiddev.txt here as well. Signed-off-by: Alan Ott <alan@signal11.us> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Showing 2 changed files with 205 additions and 205 deletions Side-by-side Diff
Documentation/hid/hiddev.txt
1 | +Care and feeding of your Human Interface Devices | |
2 | + | |
3 | +INTRODUCTION | |
4 | + | |
5 | +In addition to the normal input type HID devices, USB also uses the | |
6 | +human interface device protocols for things that are not really human | |
7 | +interfaces, but have similar sorts of communication needs. The two big | |
8 | +examples for this are power devices (especially uninterruptable power | |
9 | +supplies) and monitor control on higher end monitors. | |
10 | + | |
11 | +To support these disparate requirements, the Linux USB system provides | |
12 | +HID events to two separate interfaces: | |
13 | +* the input subsystem, which converts HID events into normal input | |
14 | +device interfaces (such as keyboard, mouse and joystick) and a | |
15 | +normalised event interface - see Documentation/input/input.txt | |
16 | +* the hiddev interface, which provides fairly raw HID events | |
17 | + | |
18 | +The data flow for a HID event produced by a device is something like | |
19 | +the following : | |
20 | + | |
21 | + usb.c ---> hid-core.c ----> hid-input.c ----> [keyboard/mouse/joystick/event] | |
22 | + | | |
23 | + | | |
24 | + --> hiddev.c ----> POWER / MONITOR CONTROL | |
25 | + | |
26 | +In addition, other subsystems (apart from USB) can potentially feed | |
27 | +events into the input subsystem, but these have no effect on the hid | |
28 | +device interface. | |
29 | + | |
30 | +USING THE HID DEVICE INTERFACE | |
31 | + | |
32 | +The hiddev interface is a char interface using the normal USB major, | |
33 | +with the minor numbers starting at 96 and finishing at 111. Therefore, | |
34 | +you need the following commands: | |
35 | +mknod /dev/usb/hiddev0 c 180 96 | |
36 | +mknod /dev/usb/hiddev1 c 180 97 | |
37 | +mknod /dev/usb/hiddev2 c 180 98 | |
38 | +mknod /dev/usb/hiddev3 c 180 99 | |
39 | +mknod /dev/usb/hiddev4 c 180 100 | |
40 | +mknod /dev/usb/hiddev5 c 180 101 | |
41 | +mknod /dev/usb/hiddev6 c 180 102 | |
42 | +mknod /dev/usb/hiddev7 c 180 103 | |
43 | +mknod /dev/usb/hiddev8 c 180 104 | |
44 | +mknod /dev/usb/hiddev9 c 180 105 | |
45 | +mknod /dev/usb/hiddev10 c 180 106 | |
46 | +mknod /dev/usb/hiddev11 c 180 107 | |
47 | +mknod /dev/usb/hiddev12 c 180 108 | |
48 | +mknod /dev/usb/hiddev13 c 180 109 | |
49 | +mknod /dev/usb/hiddev14 c 180 110 | |
50 | +mknod /dev/usb/hiddev15 c 180 111 | |
51 | + | |
52 | +So you point your hiddev compliant user-space program at the correct | |
53 | +interface for your device, and it all just works. | |
54 | + | |
55 | +Assuming that you have a hiddev compliant user-space program, of | |
56 | +course. If you need to write one, read on. | |
57 | + | |
58 | + | |
59 | +THE HIDDEV API | |
60 | +This description should be read in conjunction with the HID | |
61 | +specification, freely available from http://www.usb.org, and | |
62 | +conveniently linked of http://www.linux-usb.org. | |
63 | + | |
64 | +The hiddev API uses a read() interface, and a set of ioctl() calls. | |
65 | + | |
66 | +HID devices exchange data with the host computer using data | |
67 | +bundles called "reports". Each report is divided into "fields", | |
68 | +each of which can have one or more "usages". In the hid-core, | |
69 | +each one of these usages has a single signed 32 bit value. | |
70 | + | |
71 | +read(): | |
72 | +This is the event interface. When the HID device's state changes, | |
73 | +it performs an interrupt transfer containing a report which contains | |
74 | +the changed value. The hid-core.c module parses the report, and | |
75 | +returns to hiddev.c the individual usages that have changed within | |
76 | +the report. In its basic mode, the hiddev will make these individual | |
77 | +usage changes available to the reader using a struct hiddev_event: | |
78 | + | |
79 | + struct hiddev_event { | |
80 | + unsigned hid; | |
81 | + signed int value; | |
82 | + }; | |
83 | + | |
84 | +containing the HID usage identifier for the status that changed, and | |
85 | +the value that it was changed to. Note that the structure is defined | |
86 | +within <linux/hiddev.h>, along with some other useful #defines and | |
87 | +structures. The HID usage identifier is a composite of the HID usage | |
88 | +page shifted to the 16 high order bits ORed with the usage code. The | |
89 | +behavior of the read() function can be modified using the HIDIOCSFLAG | |
90 | +ioctl() described below. | |
91 | + | |
92 | + | |
93 | +ioctl(): | |
94 | +This is the control interface. There are a number of controls: | |
95 | + | |
96 | +HIDIOCGVERSION - int (read) | |
97 | +Gets the version code out of the hiddev driver. | |
98 | + | |
99 | +HIDIOCAPPLICATION - (none) | |
100 | +This ioctl call returns the HID application usage associated with the | |
101 | +hid device. The third argument to ioctl() specifies which application | |
102 | +index to get. This is useful when the device has more than one | |
103 | +application collection. If the index is invalid (greater or equal to | |
104 | +the number of application collections this device has) the ioctl | |
105 | +returns -1. You can find out beforehand how many application | |
106 | +collections the device has from the num_applications field from the | |
107 | +hiddev_devinfo structure. | |
108 | + | |
109 | +HIDIOCGCOLLECTIONINFO - struct hiddev_collection_info (read/write) | |
110 | +This returns a superset of the information above, providing not only | |
111 | +application collections, but all the collections the device has. It | |
112 | +also returns the level the collection lives in the hierarchy. | |
113 | +The user passes in a hiddev_collection_info struct with the index | |
114 | +field set to the index that should be returned. The ioctl fills in | |
115 | +the other fields. If the index is larger than the last collection | |
116 | +index, the ioctl returns -1 and sets errno to -EINVAL. | |
117 | + | |
118 | +HIDIOCGDEVINFO - struct hiddev_devinfo (read) | |
119 | +Gets a hiddev_devinfo structure which describes the device. | |
120 | + | |
121 | +HIDIOCGSTRING - struct hiddev_string_descriptor (read/write) | |
122 | +Gets a string descriptor from the device. The caller must fill in the | |
123 | +"index" field to indicate which descriptor should be returned. | |
124 | + | |
125 | +HIDIOCINITREPORT - (none) | |
126 | +Instructs the kernel to retrieve all input and feature report values | |
127 | +from the device. At this point, all the usage structures will contain | |
128 | +current values for the device, and will maintain it as the device | |
129 | +changes. Note that the use of this ioctl is unnecessary in general, | |
130 | +since later kernels automatically initialize the reports from the | |
131 | +device at attach time. | |
132 | + | |
133 | +HIDIOCGNAME - string (variable length) | |
134 | +Gets the device name | |
135 | + | |
136 | +HIDIOCGREPORT - struct hiddev_report_info (write) | |
137 | +Instructs the kernel to get a feature or input report from the device, | |
138 | +in order to selectively update the usage structures (in contrast to | |
139 | +INITREPORT). | |
140 | + | |
141 | +HIDIOCSREPORT - struct hiddev_report_info (write) | |
142 | +Instructs the kernel to send a report to the device. This report can | |
143 | +be filled in by the user through HIDIOCSUSAGE calls (below) to fill in | |
144 | +individual usage values in the report before sending the report in full | |
145 | +to the device. | |
146 | + | |
147 | +HIDIOCGREPORTINFO - struct hiddev_report_info (read/write) | |
148 | +Fills in a hiddev_report_info structure for the user. The report is | |
149 | +looked up by type (input, output or feature) and id, so these fields | |
150 | +must be filled in by the user. The ID can be absolute -- the actual | |
151 | +report id as reported by the device -- or relative -- | |
152 | +HID_REPORT_ID_FIRST for the first report, and (HID_REPORT_ID_NEXT | | |
153 | +report_id) for the next report after report_id. Without a-priori | |
154 | +information about report ids, the right way to use this ioctl is to | |
155 | +use the relative IDs above to enumerate the valid IDs. The ioctl | |
156 | +returns non-zero when there is no more next ID. The real report ID is | |
157 | +filled into the returned hiddev_report_info structure. | |
158 | + | |
159 | +HIDIOCGFIELDINFO - struct hiddev_field_info (read/write) | |
160 | +Returns the field information associated with a report in a | |
161 | +hiddev_field_info structure. The user must fill in report_id and | |
162 | +report_type in this structure, as above. The field_index should also | |
163 | +be filled in, which should be a number from 0 and maxfield-1, as | |
164 | +returned from a previous HIDIOCGREPORTINFO call. | |
165 | + | |
166 | +HIDIOCGUCODE - struct hiddev_usage_ref (read/write) | |
167 | +Returns the usage_code in a hiddev_usage_ref structure, given that | |
168 | +given its report type, report id, field index, and index within the | |
169 | +field have already been filled into the structure. | |
170 | + | |
171 | +HIDIOCGUSAGE - struct hiddev_usage_ref (read/write) | |
172 | +Returns the value of a usage in a hiddev_usage_ref structure. The | |
173 | +usage to be retrieved can be specified as above, or the user can | |
174 | +choose to fill in the report_type field and specify the report_id as | |
175 | +HID_REPORT_ID_UNKNOWN. In this case, the hiddev_usage_ref will be | |
176 | +filled in with the report and field information associated with this | |
177 | +usage if it is found. | |
178 | + | |
179 | +HIDIOCSUSAGE - struct hiddev_usage_ref (write) | |
180 | +Sets the value of a usage in an output report. The user fills in | |
181 | +the hiddev_usage_ref structure as above, but additionally fills in | |
182 | +the value field. | |
183 | + | |
184 | +HIDIOGCOLLECTIONINDEX - struct hiddev_usage_ref (write) | |
185 | +Returns the collection index associated with this usage. This | |
186 | +indicates where in the collection hierarchy this usage sits. | |
187 | + | |
188 | +HIDIOCGFLAG - int (read) | |
189 | +HIDIOCSFLAG - int (write) | |
190 | +These operations respectively inspect and replace the mode flags | |
191 | +that influence the read() call above. The flags are as follows: | |
192 | + | |
193 | + HIDDEV_FLAG_UREF - read() calls will now return | |
194 | + struct hiddev_usage_ref instead of struct hiddev_event. | |
195 | + This is a larger structure, but in situations where the | |
196 | + device has more than one usage in its reports with the | |
197 | + same usage code, this mode serves to resolve such | |
198 | + ambiguity. | |
199 | + | |
200 | + HIDDEV_FLAG_REPORT - This flag can only be used in conjunction | |
201 | + with HIDDEV_FLAG_UREF. With this flag set, when the device | |
202 | + sends a report, a struct hiddev_usage_ref will be returned | |
203 | + to read() filled in with the report_type and report_id, but | |
204 | + with field_index set to FIELD_INDEX_NONE. This serves as | |
205 | + additional notification when the device has sent a report. |
Documentation/usb/hiddev.txt
1 | -Care and feeding of your Human Interface Devices | |
2 | - | |
3 | -INTRODUCTION | |
4 | - | |
5 | -In addition to the normal input type HID devices, USB also uses the | |
6 | -human interface device protocols for things that are not really human | |
7 | -interfaces, but have similar sorts of communication needs. The two big | |
8 | -examples for this are power devices (especially uninterruptable power | |
9 | -supplies) and monitor control on higher end monitors. | |
10 | - | |
11 | -To support these disparate requirements, the Linux USB system provides | |
12 | -HID events to two separate interfaces: | |
13 | -* the input subsystem, which converts HID events into normal input | |
14 | -device interfaces (such as keyboard, mouse and joystick) and a | |
15 | -normalised event interface - see Documentation/input/input.txt | |
16 | -* the hiddev interface, which provides fairly raw HID events | |
17 | - | |
18 | -The data flow for a HID event produced by a device is something like | |
19 | -the following : | |
20 | - | |
21 | - usb.c ---> hid-core.c ----> hid-input.c ----> [keyboard/mouse/joystick/event] | |
22 | - | | |
23 | - | | |
24 | - --> hiddev.c ----> POWER / MONITOR CONTROL | |
25 | - | |
26 | -In addition, other subsystems (apart from USB) can potentially feed | |
27 | -events into the input subsystem, but these have no effect on the hid | |
28 | -device interface. | |
29 | - | |
30 | -USING THE HID DEVICE INTERFACE | |
31 | - | |
32 | -The hiddev interface is a char interface using the normal USB major, | |
33 | -with the minor numbers starting at 96 and finishing at 111. Therefore, | |
34 | -you need the following commands: | |
35 | -mknod /dev/usb/hiddev0 c 180 96 | |
36 | -mknod /dev/usb/hiddev1 c 180 97 | |
37 | -mknod /dev/usb/hiddev2 c 180 98 | |
38 | -mknod /dev/usb/hiddev3 c 180 99 | |
39 | -mknod /dev/usb/hiddev4 c 180 100 | |
40 | -mknod /dev/usb/hiddev5 c 180 101 | |
41 | -mknod /dev/usb/hiddev6 c 180 102 | |
42 | -mknod /dev/usb/hiddev7 c 180 103 | |
43 | -mknod /dev/usb/hiddev8 c 180 104 | |
44 | -mknod /dev/usb/hiddev9 c 180 105 | |
45 | -mknod /dev/usb/hiddev10 c 180 106 | |
46 | -mknod /dev/usb/hiddev11 c 180 107 | |
47 | -mknod /dev/usb/hiddev12 c 180 108 | |
48 | -mknod /dev/usb/hiddev13 c 180 109 | |
49 | -mknod /dev/usb/hiddev14 c 180 110 | |
50 | -mknod /dev/usb/hiddev15 c 180 111 | |
51 | - | |
52 | -So you point your hiddev compliant user-space program at the correct | |
53 | -interface for your device, and it all just works. | |
54 | - | |
55 | -Assuming that you have a hiddev compliant user-space program, of | |
56 | -course. If you need to write one, read on. | |
57 | - | |
58 | - | |
59 | -THE HIDDEV API | |
60 | -This description should be read in conjunction with the HID | |
61 | -specification, freely available from http://www.usb.org, and | |
62 | -conveniently linked of http://www.linux-usb.org. | |
63 | - | |
64 | -The hiddev API uses a read() interface, and a set of ioctl() calls. | |
65 | - | |
66 | -HID devices exchange data with the host computer using data | |
67 | -bundles called "reports". Each report is divided into "fields", | |
68 | -each of which can have one or more "usages". In the hid-core, | |
69 | -each one of these usages has a single signed 32 bit value. | |
70 | - | |
71 | -read(): | |
72 | -This is the event interface. When the HID device's state changes, | |
73 | -it performs an interrupt transfer containing a report which contains | |
74 | -the changed value. The hid-core.c module parses the report, and | |
75 | -returns to hiddev.c the individual usages that have changed within | |
76 | -the report. In its basic mode, the hiddev will make these individual | |
77 | -usage changes available to the reader using a struct hiddev_event: | |
78 | - | |
79 | - struct hiddev_event { | |
80 | - unsigned hid; | |
81 | - signed int value; | |
82 | - }; | |
83 | - | |
84 | -containing the HID usage identifier for the status that changed, and | |
85 | -the value that it was changed to. Note that the structure is defined | |
86 | -within <linux/hiddev.h>, along with some other useful #defines and | |
87 | -structures. The HID usage identifier is a composite of the HID usage | |
88 | -page shifted to the 16 high order bits ORed with the usage code. The | |
89 | -behavior of the read() function can be modified using the HIDIOCSFLAG | |
90 | -ioctl() described below. | |
91 | - | |
92 | - | |
93 | -ioctl(): | |
94 | -This is the control interface. There are a number of controls: | |
95 | - | |
96 | -HIDIOCGVERSION - int (read) | |
97 | -Gets the version code out of the hiddev driver. | |
98 | - | |
99 | -HIDIOCAPPLICATION - (none) | |
100 | -This ioctl call returns the HID application usage associated with the | |
101 | -hid device. The third argument to ioctl() specifies which application | |
102 | -index to get. This is useful when the device has more than one | |
103 | -application collection. If the index is invalid (greater or equal to | |
104 | -the number of application collections this device has) the ioctl | |
105 | -returns -1. You can find out beforehand how many application | |
106 | -collections the device has from the num_applications field from the | |
107 | -hiddev_devinfo structure. | |
108 | - | |
109 | -HIDIOCGCOLLECTIONINFO - struct hiddev_collection_info (read/write) | |
110 | -This returns a superset of the information above, providing not only | |
111 | -application collections, but all the collections the device has. It | |
112 | -also returns the level the collection lives in the hierarchy. | |
113 | -The user passes in a hiddev_collection_info struct with the index | |
114 | -field set to the index that should be returned. The ioctl fills in | |
115 | -the other fields. If the index is larger than the last collection | |
116 | -index, the ioctl returns -1 and sets errno to -EINVAL. | |
117 | - | |
118 | -HIDIOCGDEVINFO - struct hiddev_devinfo (read) | |
119 | -Gets a hiddev_devinfo structure which describes the device. | |
120 | - | |
121 | -HIDIOCGSTRING - struct hiddev_string_descriptor (read/write) | |
122 | -Gets a string descriptor from the device. The caller must fill in the | |
123 | -"index" field to indicate which descriptor should be returned. | |
124 | - | |
125 | -HIDIOCINITREPORT - (none) | |
126 | -Instructs the kernel to retrieve all input and feature report values | |
127 | -from the device. At this point, all the usage structures will contain | |
128 | -current values for the device, and will maintain it as the device | |
129 | -changes. Note that the use of this ioctl is unnecessary in general, | |
130 | -since later kernels automatically initialize the reports from the | |
131 | -device at attach time. | |
132 | - | |
133 | -HIDIOCGNAME - string (variable length) | |
134 | -Gets the device name | |
135 | - | |
136 | -HIDIOCGREPORT - struct hiddev_report_info (write) | |
137 | -Instructs the kernel to get a feature or input report from the device, | |
138 | -in order to selectively update the usage structures (in contrast to | |
139 | -INITREPORT). | |
140 | - | |
141 | -HIDIOCSREPORT - struct hiddev_report_info (write) | |
142 | -Instructs the kernel to send a report to the device. This report can | |
143 | -be filled in by the user through HIDIOCSUSAGE calls (below) to fill in | |
144 | -individual usage values in the report before sending the report in full | |
145 | -to the device. | |
146 | - | |
147 | -HIDIOCGREPORTINFO - struct hiddev_report_info (read/write) | |
148 | -Fills in a hiddev_report_info structure for the user. The report is | |
149 | -looked up by type (input, output or feature) and id, so these fields | |
150 | -must be filled in by the user. The ID can be absolute -- the actual | |
151 | -report id as reported by the device -- or relative -- | |
152 | -HID_REPORT_ID_FIRST for the first report, and (HID_REPORT_ID_NEXT | | |
153 | -report_id) for the next report after report_id. Without a-priori | |
154 | -information about report ids, the right way to use this ioctl is to | |
155 | -use the relative IDs above to enumerate the valid IDs. The ioctl | |
156 | -returns non-zero when there is no more next ID. The real report ID is | |
157 | -filled into the returned hiddev_report_info structure. | |
158 | - | |
159 | -HIDIOCGFIELDINFO - struct hiddev_field_info (read/write) | |
160 | -Returns the field information associated with a report in a | |
161 | -hiddev_field_info structure. The user must fill in report_id and | |
162 | -report_type in this structure, as above. The field_index should also | |
163 | -be filled in, which should be a number from 0 and maxfield-1, as | |
164 | -returned from a previous HIDIOCGREPORTINFO call. | |
165 | - | |
166 | -HIDIOCGUCODE - struct hiddev_usage_ref (read/write) | |
167 | -Returns the usage_code in a hiddev_usage_ref structure, given that | |
168 | -given its report type, report id, field index, and index within the | |
169 | -field have already been filled into the structure. | |
170 | - | |
171 | -HIDIOCGUSAGE - struct hiddev_usage_ref (read/write) | |
172 | -Returns the value of a usage in a hiddev_usage_ref structure. The | |
173 | -usage to be retrieved can be specified as above, or the user can | |
174 | -choose to fill in the report_type field and specify the report_id as | |
175 | -HID_REPORT_ID_UNKNOWN. In this case, the hiddev_usage_ref will be | |
176 | -filled in with the report and field information associated with this | |
177 | -usage if it is found. | |
178 | - | |
179 | -HIDIOCSUSAGE - struct hiddev_usage_ref (write) | |
180 | -Sets the value of a usage in an output report. The user fills in | |
181 | -the hiddev_usage_ref structure as above, but additionally fills in | |
182 | -the value field. | |
183 | - | |
184 | -HIDIOGCOLLECTIONINDEX - struct hiddev_usage_ref (write) | |
185 | -Returns the collection index associated with this usage. This | |
186 | -indicates where in the collection hierarchy this usage sits. | |
187 | - | |
188 | -HIDIOCGFLAG - int (read) | |
189 | -HIDIOCSFLAG - int (write) | |
190 | -These operations respectively inspect and replace the mode flags | |
191 | -that influence the read() call above. The flags are as follows: | |
192 | - | |
193 | - HIDDEV_FLAG_UREF - read() calls will now return | |
194 | - struct hiddev_usage_ref instead of struct hiddev_event. | |
195 | - This is a larger structure, but in situations where the | |
196 | - device has more than one usage in its reports with the | |
197 | - same usage code, this mode serves to resolve such | |
198 | - ambiguity. | |
199 | - | |
200 | - HIDDEV_FLAG_REPORT - This flag can only be used in conjunction | |
201 | - with HIDDEV_FLAG_UREF. With this flag set, when the device | |
202 | - sends a report, a struct hiddev_usage_ref will be returned | |
203 | - to read() filled in with the report_type and report_id, but | |
204 | - with field_index set to FIELD_INDEX_NONE. This serves as | |
205 | - additional notification when the device has sent a report. |