2025-02-19 11:02 PM
Hello,
I am making a project for myself on the STM32F405 control board KVM.
This board receives data to the HOST from the mouse (this part works). Next, the MCU generates absolute coordinates. These coordinates (absolute) must be transmitted via USB to the KVM.
But they are not transmitted.
I changed HID descriptor to pass absolute mouse coordinates, but the data is not passed (for relative - the data is passed).
Please tell me what else needs to be changed in the USB device configuration (PID?) to transmit absolute coordinates (I couldn’t find a solution on the Internet)?
I would be grateful for any answer.
2025-02-20 10:49 AM - edited 2025-02-20 10:50 AM
Hi @ok_pp
Check your HID mouse report descriptor
__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) */
#ifdef ABSOLUTE_MOUSE_MODE
0x15, 0x01, // LOGICAL_MINIMUM (1) <<<< This allows us to talk to any display resolution
0x25, 0x64, // LOGICAL_MAXIMUM (100)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x03, // REPORT_COUNT (3)
0x81, 0x02, // INPUT (Data,Var,Abs) This should allow to move to absolute positions
#else
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) */
#endif
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 */
};
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
2025-02-20 11:39 PM
Hi, @FBL
Thank you very much for your quick and helpful reply. Your report descriptor is working.
But I want to be able to access the entire screen area.
I tried to increase the coordinate resolution, and the data stopped being transmitted.
............
#ifdef ABSOLUTE_MOUSE_MODE
#define HID_MOUSE_REPORT_DESC_SIZE 76U
#else
............
#ifdef ABSOLUTE_MOUSE_MODE
// 0x15, 0x01, // LOGICAL_MINIMUM (1) <<<< This allows us to talk to any display resolution
0x16, 0x00, 0x80, // LOGICAL_MINIMUM (-32768)
//0x25, 0x64, // LOGICAL_MAXIMUM (100)
0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)
// 0x75, 0x08, // REPORT_SIZE (8)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x03, // REPORT_COUNT (3)
0x81, 0x02, // INPUT (Data,Var,Abs) This should allow to move to absolute positions //50
#else
............
Is it possible to achieve the desired result?