mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 01:24:12 +08:00
2326dee41c
Add an introduction about HID meant for the casual programmer that is trying either to fix his device or to understand what is going wrong. Signed-off-by: Marco Morandini <marco.morandini@polimi.it> Co-authored-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
50 lines
1.9 KiB
ReStructuredText
50 lines
1.9 KiB
ReStructuredText
.. 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.
|