xref: /openbmc/linux/Documentation/hid/uhid.rst (revision cca4786174656673f89684347e0028c88df57031)
1*cca47861SMauro Carvalho Chehab======================================================
2*cca47861SMauro Carvalho ChehabUHID - User-space I/O driver support for HID subsystem
3*cca47861SMauro Carvalho Chehab======================================================
4*cca47861SMauro Carvalho Chehab
5*cca47861SMauro Carvalho ChehabUHID allows user-space to implement HID transport drivers. Please see
6*cca47861SMauro Carvalho Chehabhid-transport.txt for an introduction into HID transport drivers. This document
7*cca47861SMauro Carvalho Chehabrelies heavily on the definitions declared there.
8*cca47861SMauro Carvalho Chehab
9*cca47861SMauro Carvalho ChehabWith UHID, a user-space transport driver can create kernel hid-devices for each
10*cca47861SMauro Carvalho Chehabdevice connected to the user-space controlled bus. The UHID API defines the I/O
11*cca47861SMauro Carvalho Chehabevents provided from the kernel to user-space and vice versa.
12*cca47861SMauro Carvalho Chehab
13*cca47861SMauro Carvalho ChehabThere is an example user-space application in ./samples/uhid/uhid-example.c
14*cca47861SMauro Carvalho Chehab
15*cca47861SMauro Carvalho ChehabThe UHID API
16*cca47861SMauro Carvalho Chehab------------
17*cca47861SMauro Carvalho Chehab
18*cca47861SMauro Carvalho ChehabUHID is accessed through a character misc-device. The minor-number is allocated
19*cca47861SMauro Carvalho Chehabdynamically so you need to rely on udev (or similar) to create the device node.
20*cca47861SMauro Carvalho ChehabThis is /dev/uhid by default.
21*cca47861SMauro Carvalho Chehab
22*cca47861SMauro Carvalho ChehabIf a new device is detected by your HID I/O Driver and you want to register this
23*cca47861SMauro Carvalho Chehabdevice with the HID subsystem, then you need to open /dev/uhid once for each
24*cca47861SMauro Carvalho Chehabdevice you want to register. All further communication is done by read()'ing or
25*cca47861SMauro Carvalho Chehabwrite()'ing "struct uhid_event" objects. Non-blocking operations are supported
26*cca47861SMauro Carvalho Chehabby setting O_NONBLOCK::
27*cca47861SMauro Carvalho Chehab
28*cca47861SMauro Carvalho Chehab  struct uhid_event {
29*cca47861SMauro Carvalho Chehab        __u32 type;
30*cca47861SMauro Carvalho Chehab        union {
31*cca47861SMauro Carvalho Chehab                struct uhid_create2_req create2;
32*cca47861SMauro Carvalho Chehab                struct uhid_output_req output;
33*cca47861SMauro Carvalho Chehab                struct uhid_input2_req input2;
34*cca47861SMauro Carvalho Chehab                ...
35*cca47861SMauro Carvalho Chehab        } u;
36*cca47861SMauro Carvalho Chehab  };
37*cca47861SMauro Carvalho Chehab
38*cca47861SMauro Carvalho ChehabThe "type" field contains the ID of the event. Depending on the ID different
39*cca47861SMauro Carvalho Chehabpayloads are sent. You must not split a single event across multiple read()'s or
40*cca47861SMauro Carvalho Chehabmultiple write()'s. A single event must always be sent as a whole. Furthermore,
41*cca47861SMauro Carvalho Chehabonly a single event can be sent per read() or write(). Pending data is ignored.
42*cca47861SMauro Carvalho ChehabIf you want to handle multiple events in a single syscall, then use vectored
43*cca47861SMauro Carvalho ChehabI/O with readv()/writev().
44*cca47861SMauro Carvalho ChehabThe "type" field defines the payload. For each type, there is a
45*cca47861SMauro Carvalho Chehabpayload-structure available in the union "u" (except for empty payloads). This
46*cca47861SMauro Carvalho Chehabpayload contains management and/or device data.
47*cca47861SMauro Carvalho Chehab
48*cca47861SMauro Carvalho ChehabThe first thing you should do is sending an UHID_CREATE2 event. This will
49*cca47861SMauro Carvalho Chehabregister the device. UHID will respond with an UHID_START event. You can now
50*cca47861SMauro Carvalho Chehabstart sending data to and reading data from UHID. However, unless UHID sends the
51*cca47861SMauro Carvalho ChehabUHID_OPEN event, the internally attached HID Device Driver has no user attached.
52*cca47861SMauro Carvalho ChehabThat is, you might put your device asleep unless you receive the UHID_OPEN
53*cca47861SMauro Carvalho Chehabevent. If you receive the UHID_OPEN event, you should start I/O. If the last
54*cca47861SMauro Carvalho Chehabuser closes the HID device, you will receive an UHID_CLOSE event. This may be
55*cca47861SMauro Carvalho Chehabfollowed by an UHID_OPEN event again and so on. There is no need to perform
56*cca47861SMauro Carvalho Chehabreference-counting in user-space. That is, you will never receive multiple
57*cca47861SMauro Carvalho ChehabUHID_OPEN events without an UHID_CLOSE event. The HID subsystem performs
58*cca47861SMauro Carvalho Chehabref-counting for you.
59*cca47861SMauro Carvalho ChehabYou may decide to ignore UHID_OPEN/UHID_CLOSE, though. I/O is allowed even
60*cca47861SMauro Carvalho Chehabthough the device may have no users.
61*cca47861SMauro Carvalho Chehab
62*cca47861SMauro Carvalho ChehabIf you want to send data on the interrupt channel to the HID subsystem, you send
63*cca47861SMauro Carvalho Chehaban HID_INPUT2 event with your raw data payload. If the kernel wants to send data
64*cca47861SMauro Carvalho Chehabon the interrupt channel to the device, you will read an UHID_OUTPUT event.
65*cca47861SMauro Carvalho ChehabData requests on the control channel are currently limited to GET_REPORT and
66*cca47861SMauro Carvalho ChehabSET_REPORT (no other data reports on the control channel are defined so far).
67*cca47861SMauro Carvalho ChehabThose requests are always synchronous. That means, the kernel sends
68*cca47861SMauro Carvalho ChehabUHID_GET_REPORT and UHID_SET_REPORT events and requires you to forward them to
69*cca47861SMauro Carvalho Chehabthe device on the control channel. Once the device responds, you must forward
70*cca47861SMauro Carvalho Chehabthe response via UHID_GET_REPORT_REPLY and UHID_SET_REPORT_REPLY to the kernel.
71*cca47861SMauro Carvalho ChehabThe kernel blocks internal driver-execution during such round-trips (times out
72*cca47861SMauro Carvalho Chehabafter a hard-coded period).
73*cca47861SMauro Carvalho Chehab
74*cca47861SMauro Carvalho ChehabIf your device disconnects, you should send an UHID_DESTROY event. This will
75*cca47861SMauro Carvalho Chehabunregister the device. You can now send UHID_CREATE2 again to register a new
76*cca47861SMauro Carvalho Chehabdevice.
77*cca47861SMauro Carvalho ChehabIf you close() the fd, the device is automatically unregistered and destroyed
78*cca47861SMauro Carvalho Chehabinternally.
79*cca47861SMauro Carvalho Chehab
80*cca47861SMauro Carvalho Chehabwrite()
81*cca47861SMauro Carvalho Chehab-------
82*cca47861SMauro Carvalho Chehabwrite() allows you to modify the state of the device and feed input data into
83*cca47861SMauro Carvalho Chehabthe kernel. The kernel will parse the event immediately and if the event ID is
84*cca47861SMauro Carvalho Chehabnot supported, it will return -EOPNOTSUPP. If the payload is invalid, then
85*cca47861SMauro Carvalho Chehab-EINVAL is returned, otherwise, the amount of data that was read is returned and
86*cca47861SMauro Carvalho Chehabthe request was handled successfully. O_NONBLOCK does not affect write() as
87*cca47861SMauro Carvalho Chehabwrites are always handled immediately in a non-blocking fashion. Future requests
88*cca47861SMauro Carvalho Chehabmight make use of O_NONBLOCK, though.
89*cca47861SMauro Carvalho Chehab
90*cca47861SMauro Carvalho ChehabUHID_CREATE2:
91*cca47861SMauro Carvalho Chehab  This creates the internal HID device. No I/O is possible until you send this
92*cca47861SMauro Carvalho Chehab  event to the kernel. The payload is of type struct uhid_create2_req and
93*cca47861SMauro Carvalho Chehab  contains information about your device. You can start I/O now.
94*cca47861SMauro Carvalho Chehab
95*cca47861SMauro Carvalho ChehabUHID_DESTROY:
96*cca47861SMauro Carvalho Chehab  This destroys the internal HID device. No further I/O will be accepted. There
97*cca47861SMauro Carvalho Chehab  may still be pending messages that you can receive with read() but no further
98*cca47861SMauro Carvalho Chehab  UHID_INPUT events can be sent to the kernel.
99*cca47861SMauro Carvalho Chehab  You can create a new device by sending UHID_CREATE2 again. There is no need to
100*cca47861SMauro Carvalho Chehab  reopen the character device.
101*cca47861SMauro Carvalho Chehab
102*cca47861SMauro Carvalho ChehabUHID_INPUT2:
103*cca47861SMauro Carvalho Chehab  You must send UHID_CREATE2 before sending input to the kernel! This event
104*cca47861SMauro Carvalho Chehab  contains a data-payload. This is the raw data that you read from your device
105*cca47861SMauro Carvalho Chehab  on the interrupt channel. The kernel will parse the HID reports.
106*cca47861SMauro Carvalho Chehab
107*cca47861SMauro Carvalho ChehabUHID_GET_REPORT_REPLY:
108*cca47861SMauro Carvalho Chehab  If you receive a UHID_GET_REPORT request you must answer with this request.
109*cca47861SMauro Carvalho Chehab  You  must copy the "id" field from the request into the answer. Set the "err"
110*cca47861SMauro Carvalho Chehab  field to 0 if no error occurred or to EIO if an I/O error occurred.
111*cca47861SMauro Carvalho Chehab  If "err" is 0 then you should fill the buffer of the answer with the results
112*cca47861SMauro Carvalho Chehab  of the GET_REPORT request and set "size" correspondingly.
113*cca47861SMauro Carvalho Chehab
114*cca47861SMauro Carvalho ChehabUHID_SET_REPORT_REPLY:
115*cca47861SMauro Carvalho Chehab  This is the SET_REPORT equivalent of UHID_GET_REPORT_REPLY. Unlike GET_REPORT,
116*cca47861SMauro Carvalho Chehab  SET_REPORT never returns a data buffer, therefore, it's sufficient to set the
117*cca47861SMauro Carvalho Chehab  "id" and "err" fields correctly.
118*cca47861SMauro Carvalho Chehab
119*cca47861SMauro Carvalho Chehabread()
120*cca47861SMauro Carvalho Chehab------
121*cca47861SMauro Carvalho Chehabread() will return a queued output report. No reaction is required to any of
122*cca47861SMauro Carvalho Chehabthem but you should handle them according to your needs.
123*cca47861SMauro Carvalho Chehab
124*cca47861SMauro Carvalho ChehabUHID_START:
125*cca47861SMauro Carvalho Chehab  This is sent when the HID device is started. Consider this as an answer to
126*cca47861SMauro Carvalho Chehab  UHID_CREATE2. This is always the first event that is sent. Note that this
127*cca47861SMauro Carvalho Chehab  event might not be available immediately after write(UHID_CREATE2) returns.
128*cca47861SMauro Carvalho Chehab  Device drivers might required delayed setups.
129*cca47861SMauro Carvalho Chehab  This event contains a payload of type uhid_start_req. The "dev_flags" field
130*cca47861SMauro Carvalho Chehab  describes special behaviors of a device. The following flags are defined:
131*cca47861SMauro Carvalho Chehab
132*cca47861SMauro Carvalho Chehab      - UHID_DEV_NUMBERED_FEATURE_REPORTS
133*cca47861SMauro Carvalho Chehab      - UHID_DEV_NUMBERED_OUTPUT_REPORTS
134*cca47861SMauro Carvalho Chehab      - UHID_DEV_NUMBERED_INPUT_REPORTS
135*cca47861SMauro Carvalho Chehab
136*cca47861SMauro Carvalho Chehab          Each of these flags defines whether a given report-type uses numbered
137*cca47861SMauro Carvalho Chehab          reports. If numbered reports are used for a type, all messages from
138*cca47861SMauro Carvalho Chehab          the kernel already have the report-number as prefix. Otherwise, no
139*cca47861SMauro Carvalho Chehab          prefix is added by the kernel.
140*cca47861SMauro Carvalho Chehab          For messages sent by user-space to the kernel, you must adjust the
141*cca47861SMauro Carvalho Chehab          prefixes according to these flags.
142*cca47861SMauro Carvalho Chehab
143*cca47861SMauro Carvalho ChehabUHID_STOP:
144*cca47861SMauro Carvalho Chehab  This is sent when the HID device is stopped. Consider this as an answer to
145*cca47861SMauro Carvalho Chehab  UHID_DESTROY.
146*cca47861SMauro Carvalho Chehab
147*cca47861SMauro Carvalho Chehab  If you didn't destroy your device via UHID_DESTROY, but the kernel sends an
148*cca47861SMauro Carvalho Chehab  UHID_STOP event, this should usually be ignored. It means that the kernel
149*cca47861SMauro Carvalho Chehab  reloaded/changed the device driver loaded on your HID device (or some other
150*cca47861SMauro Carvalho Chehab  maintenance actions happened).
151*cca47861SMauro Carvalho Chehab
152*cca47861SMauro Carvalho Chehab  You can usually ignored any UHID_STOP events safely.
153*cca47861SMauro Carvalho Chehab
154*cca47861SMauro Carvalho ChehabUHID_OPEN:
155*cca47861SMauro Carvalho Chehab  This is sent when the HID device is opened. That is, the data that the HID
156*cca47861SMauro Carvalho Chehab  device provides is read by some other process. You may ignore this event but
157*cca47861SMauro Carvalho Chehab  it is useful for power-management. As long as you haven't received this event
158*cca47861SMauro Carvalho Chehab  there is actually no other process that reads your data so there is no need to
159*cca47861SMauro Carvalho Chehab  send UHID_INPUT2 events to the kernel.
160*cca47861SMauro Carvalho Chehab
161*cca47861SMauro Carvalho ChehabUHID_CLOSE:
162*cca47861SMauro Carvalho Chehab  This is sent when there are no more processes which read the HID data. It is
163*cca47861SMauro Carvalho Chehab  the counterpart of UHID_OPEN and you may as well ignore this event.
164*cca47861SMauro Carvalho Chehab
165*cca47861SMauro Carvalho ChehabUHID_OUTPUT:
166*cca47861SMauro Carvalho Chehab  This is sent if the HID device driver wants to send raw data to the I/O
167*cca47861SMauro Carvalho Chehab  device on the interrupt channel. You should read the payload and forward it to
168*cca47861SMauro Carvalho Chehab  the device. The payload is of type "struct uhid_output_req".
169*cca47861SMauro Carvalho Chehab  This may be received even though you haven't received UHID_OPEN, yet.
170*cca47861SMauro Carvalho Chehab
171*cca47861SMauro Carvalho ChehabUHID_GET_REPORT:
172*cca47861SMauro Carvalho Chehab  This event is sent if the kernel driver wants to perform a GET_REPORT request
173*cca47861SMauro Carvalho Chehab  on the control channeld as described in the HID specs. The report-type and
174*cca47861SMauro Carvalho Chehab  report-number are available in the payload.
175*cca47861SMauro Carvalho Chehab  The kernel serializes GET_REPORT requests so there will never be two in
176*cca47861SMauro Carvalho Chehab  parallel. However, if you fail to respond with a UHID_GET_REPORT_REPLY, the
177*cca47861SMauro Carvalho Chehab  request might silently time out.
178*cca47861SMauro Carvalho Chehab  Once you read a GET_REPORT request, you shall forward it to the hid device and
179*cca47861SMauro Carvalho Chehab  remember the "id" field in the payload. Once your hid device responds to the
180*cca47861SMauro Carvalho Chehab  GET_REPORT (or if it fails), you must send a UHID_GET_REPORT_REPLY to the
181*cca47861SMauro Carvalho Chehab  kernel with the exact same "id" as in the request. If the request already
182*cca47861SMauro Carvalho Chehab  timed out, the kernel will ignore the response silently. The "id" field is
183*cca47861SMauro Carvalho Chehab  never re-used, so conflicts cannot happen.
184*cca47861SMauro Carvalho Chehab
185*cca47861SMauro Carvalho ChehabUHID_SET_REPORT:
186*cca47861SMauro Carvalho Chehab  This is the SET_REPORT equivalent of UHID_GET_REPORT. On receipt, you shall
187*cca47861SMauro Carvalho Chehab  send a SET_REPORT request to your hid device. Once it replies, you must tell
188*cca47861SMauro Carvalho Chehab  the kernel about it via UHID_SET_REPORT_REPLY.
189*cca47861SMauro Carvalho Chehab  The same restrictions as for UHID_GET_REPORT apply.
190*cca47861SMauro Carvalho Chehab
191*cca47861SMauro Carvalho Chehab----------------------------------------------------
192*cca47861SMauro Carvalho Chehab
193*cca47861SMauro Carvalho ChehabWritten 2012, David Herrmann <dh.herrmann@gmail.com>
194