xref: /linux/Documentation/hid/hidreport-parsing.rst (revision 34dc1baba215b826e454b8d19e4f24adbeb7d00d)
1.. SPDX-License-Identifier: GPL-2.0
2
3========================================
4Manual parsing of HID report descriptors
5========================================
6
7Consider again the mouse HID report descriptor
8introduced in Documentation/hid/hidintro.rst::
9
10  $ hexdump -C /sys/bus/hid/devices/0003\:093A\:2510.0002/report_descriptor
11  00000000  05 01 09 02 a1 01 09 01  a1 00 05 09 19 01 29 03  |..............).|
12  00000010  15 00 25 01 75 01 95 03  81 02 75 05 95 01 81 01  |..%.u.....u.....|
13  00000020  05 01 09 30 09 31 09 38  15 81 25 7f 75 08 95 03  |...0.1.8..%.u...|
14  00000030  81 06 c0 c0                                       |....|
15  00000034
16
17and try to parse it by hand.
18
19Start with the first number, 0x05: it carries 2 bits for the
20length of the item, 2 bits for the type of the item and 4 bits for the
21function::
22
23  +----------+
24  | 00000101 |
25  +----------+
26          ^^
27          ---- Length of data (see HID spec 6.2.2.2)
28        ^^
29        ------ Type of the item (see HID spec 6.2.2.2, then jump to 6.2.2.7)
30    ^^^^
31    --------- Function of the item (see HID spec 6.2.2.7, then HUT Sec 3)
32
33In our case, the length is 1 byte, the type is ``Global`` and the
34function is ``Usage Page``, thus for parsing the value 0x01 in the second byte
35we need to refer to HUT Sec 3.
36
37The second number is the actual data, and its meaning can be found in
38the HUT. We have a ``Usage Page``, thus we need to refer to HUT
39Sec. 3, "Usage Pages"; from there, one sees that ``0x01`` stands for
40``Generic Desktop Page``.
41
42Moving now to the second two bytes, and following the same scheme,
43``0x09`` (i.e. ``00001001``) will be followed by one byte (``01``)
44and is a ``Local`` item (``10``). Thus, the meaning of the remaining four bits
45(``0000``) is given in the HID spec Sec. 6.2.2.8 "Local Items", so that
46we have a ``Usage``. From HUT, Sec. 4, "Generic Desktop Page",  we see that
470x02 stands for ``Mouse``.
48
49The following numbers can be parsed in the same way.
50