cancel
Showing results for 
Search instead for 
Did you mean: 

How to change relative to absolute USB mouse for STM32?

ok_pp
Associate II

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.

2 REPLIES 2
FBL
ST Employee

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.


ok_pp
Associate II

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?