0
\$\begingroup\$
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
  0x05, 0x01,        /* Usage Page (Generic Desktop Ctrls)     */
  0x09, 0x02,        /* Usage (Mouse)                          */
  0xA1, 0x01,        /* Collection (Application)               */
  0x09, 0x01,        /*   Usage (Pointer)                      */
  0xA1, 0x00,        /*   Collection (Physical)                */
  0x05, 0x09,        /*     Usage Page (Button)                */
  0x19, 0x01,        /*     Usage Minimum (0x01)               */
  0x29, 0x03,        /*     Usage Maximum (0x03)               */
  0x15, 0x00,        /*     Logical Minimum (0)                */
  0x25, 0x01,        /*     Logical Maximum (1)                */
  0x95, 0x03,        /*     Report Count (3)                   */
  0x75, 0x01,        /*     Report Size (1)                    */
  0x81, 0x02,        /*     Input (Data,Var,Abs)               */
  0x95, 0x01,        /*     Report Count (1)                   */
  0x75, 0x05,        /*     Report Size (5)                    */
  0x81, 0x01,        /*     Input (Const,Array,Abs)            */
  0x05, 0x01,        /*     Usage Page (Generic Desktop Ctrls) */
  0x09, 0x30,        /*     Usage (X)                          */
  0x09, 0x31,        /*     Usage (Y)                          */
  0x09, 0x38,        /*     Usage (Wheel)                      */
  0x15, 0x81,        /*     Logical Minimum (-127)             */
  0x25, 0x7F,        /*     Logical Maximum (127)              */
  0x75, 0x08,        /*     Report Size (8)                    */
  0x95, 0x03,        /*     Report Count (3)                   */
  0x81, 0x06,        /*     Input (Data,Var,Rel)               */
  0xC0,              /*   End Collection                       */
  0x09, 0x3C,        /*   Usage (Motion Wakeup)                */
  0x05, 0xFF,        /*   Usage Page (Reserved 0xFF)           */
  0x09, 0x01,        /*   Usage (0x01)                         */
  0x15, 0x00,        /*   Logical Minimum (0)                  */
  0x25, 0x01,        /*   Logical Maximum (1)                  */
  0x75, 0x01,        /*   Report Size (1)                      */
  0x95, 0x02,        /*   Report Count (2)                     */
  0xB1, 0x22,        /*   Feature (Data,Var,Abs,NoWrp)         */
  0x75, 0x06,        /*   Report Size (6)                      */
  0x95, 0x01,        /*   Report Count (1)                     */
  0xB1, 0x01,        /*   Feature (Const,Array,Abs,NoWrp)      */
  0xC0               /* End Collection                         */
};

How this code works 0x81, 0x06, /*Input (Data,Var,Rel) */

This code contains 3 Inputs. This code belongs to USB HID Mouse (not Custom).

The code contains this:

  0x95, 0x01,        /*     Report Count (1)                   */
  0x75, 0x05,        /*     Report Size (5)                    */
  0x81, 0x01,        /*     Input (Const,Array,Abs)            */

What does this code 0x81, 0x01 send, if before this code it was not indicated what should be sent?

For example, here it is described what needs to be sent.

  0x05, 0x01,        /*     Usage Page (Generic Desktop Ctrls) */
  0x09, 0x30,        /*     Usage (X)                          */
  0x09, 0x31,        /*     Usage (Y)                          */
  0x09, 0x38,        /*     Usage (Wheel)                      */
  0x15, 0x81,        /*     Logical Minimum (-127)             */
  0x25, 0x7F,        /*     Logical Maximum (127)              */
  0x75, 0x08,        /*     Report Size (8)                    */
  0x95, 0x03,        /*     Report Count (3)                   */
  0x81, 0x06,        /*     Input (Data,Var,Rel)               */

And why does this code need to send data several times? In this code 3 times. Why isn't once enough? There is always one mouse, the mouse is controlled, and coordinates for the mouse are sent.

Device Class Definition for Human Interface Devices (HID)

6.2.2.4 Main Items

enter image description here

\$\endgroup\$
2
  • \$\begingroup\$ this is not a question that relates to the Arduino \$\endgroup\$
    – jsotola
    Commented Sep 14, 2023 at 2:06
  • \$\begingroup\$ how do you know that the values are sent 3 times? \$\endgroup\$
    – jsotola
    Commented Sep 14, 2023 at 2:07

1 Answer 1

2
\$\begingroup\$

The report descriptor describes the data format for the reports that are sent. Each report contains:

  • 3 absolute values, each using 1 bit, with a range from 0 to 1 corresponding to the three buttons
  • 1 constant value with five bits (padding to the next byte)
  • 3 relative values, each using 8 bits, with a range from -127 to 127, corresponding to the three axes X, Y, and "wheel".

Thus, each report would have four bytes, where the state of the buttons is encoded in three bits in the first byte, the rest of the byte is constant zero and not to be interpreted (it has no associated Usage), and the following three bytes contain the distance the mouse moved since the last report.

The three reports for the three axes are declared together, so there is a Report count of 3 (and three Usage fields). The three buttons are also declared together, so there is a report count of 3, and three Usages (but encoded as a range from 1 to 3).

\$\endgroup\$
7
  • \$\begingroup\$ What does it mean? I do not understand: >1 constant value with five bits (padding to the next byte)< This is 0x95, 0x01, /*Report Count (1)*/ 0x75, 0x05, /*Report Size (5)*/ 0x81, 0x01, /*Input (Const,Array,Abs)*/ padding for this? 0x75, 0x08, /* Report Size (8)*/ 0x95, 0x03, /*Report Count (3)*/ 0x81, 0x06, /*Input (Data,Var,Rel)*/ How does this padding work? What is it for? \$\endgroup\$
    – stm
    Commented Sep 14, 2023 at 12:48
  • \$\begingroup\$ I commented out this code and everything stopped working 0x95, 0x01, /* Report Count (1) / 0x75, 0x05, / Report Size (5) / 0x81, 0x01, / Input (Const,Array,Abs) */ What is this code for? \$\endgroup\$
    – stm
    Commented Sep 14, 2023 at 22:24
  • \$\begingroup\$ What are these 5 bits for? 0x75, 0x05, /* Report Size (5) */ My main question was this. \$\endgroup\$
    – stm
    Commented Sep 14, 2023 at 22:32
  • 1
    \$\begingroup\$ These are for filling up the current byte, because only three bits were used so far. The coordinates should start on a byte boundary so you don't need awkward shift instructions to fill out the report. \$\endgroup\$ Commented Sep 15, 2023 at 3:52
  • 1
    \$\begingroup\$ Yes, but the resport descriptor describes fields of bits. In order to make the fields for the coordinates correspond exactly to bytes, the number of bits used needs to be divisible by eight. So after the first array (that uses three bits) there is a second, unused, array that uses five bits. After that, the number of bits used is eight, which is divisible by eight, so the next field that is eight bit wide corresponds exactly to one byte, and not five bits in one byte and three bits in the next. \$\endgroup\$ Commented Sep 15, 2023 at 5:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.