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