Skip to content

Commit

Permalink
fix(radio): usb joystick descriptor, unusable joystick axis (#4726)
Browse files Browse the repository at this point in the history
  • Loading branch information
ThomasKuehne authored Apr 5, 2024
1 parent 85fbb97 commit 8ac247e
Showing 1 changed file with 45 additions and 55 deletions.
100 changes: 45 additions & 55 deletions radio/src/targets/common/arm/stm32/usbd_hid_joystick.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ __ALIGN_BEGIN static const uint8_t HID_JOYSTICK_ReportDesc[] __ALIGN_END =
0x09, 0x34, // USAGE (Ry)
0x09, 0x35, // USAGE (Rz)
0x09, 0x36, // USAGE (Slider)
0x09, 0x36, // USAGE (Slider)
0x09, 0x37, // USAGE (Dial)
0x16, 0x00, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x07, // LOGICAL_MAXIMUM (2047)
0x75, 0x10, // REPORT_SIZE (16)
Expand Down Expand Up @@ -170,8 +170,8 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_E
/************** Configuration Descriptor ****************/
0x09, /* bLength: Configuration Descriptor size */
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
USB_HID_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */
0x00,
LOBYTE(USB_HID_CONFIG_DESC_SIZ), /* wTotalLength: Bytes returned */
HIBYTE(USB_HID_CONFIG_DESC_SIZ),
0x01, /* bNumInterfaces: 1 interface */
0x01, /* bConfigurationValue: Configuration value */
0x00, /* iConfiguration: Index of string descriptor
Expand Down Expand Up @@ -200,11 +200,12 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_E
0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
0x22, /* bDescriptorType */
#if !defined(USBJ_EX)
sizeof(HID_JOYSTICK_ReportDesc), /*wItemLength: Total length of Report descriptor*/
LOBYTE(sizeof(HID_JOYSTICK_ReportDesc)), /* wItemLength: Total length of Report descriptor*/
HIBYTE(sizeof(HID_JOYSTICK_ReportDesc)),
#else
0, /*wItemLength: Total length of Report descriptor*/
#endif
0x00, /* wItemLength: Total length of Report descriptor*/
0x00,
#endif
/******************** Endpoint Descriptor for Joystick ********************/
/* 27 */
0x07, /* bLength: Endpoint Descriptor size */
Expand All @@ -213,12 +214,13 @@ __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_E
HID_EPIN_ADDR, /* bEndpointAddress: Endpoint Address (IN) */
0x03, /* bmAttributes: Interrupt endpoint */
#if !defined(USBJ_EX)
HID_IN_PACKET, /* wMaxPacketSize */
LOBYTE(HID_IN_PACKET), /* wMaxPacketSize */
HIBYTE(HID_IN_PACKET),
#else
0, /* wMaxPacketSize */
#endif
0x00, /* wMaxPacketSize */
0x00,
0x01, /*bInterval: Polling Interval (1 ms)*/
#endif
0x01, /* bInterval: Polling Interval (1 ms) */
/* 34 */
};
#endif /* USE_USBD_COMPOSITE */
Expand All @@ -234,8 +236,13 @@ __ALIGN_BEGIN static uint8_t USBD_HID_Desc[USB_HID_DESC_SIZ] __ALIGN_END =
0x00, /* bCountryCode: Hardware target country */
0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
0x22, /* bDescriptorType */
HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */
#if !defined(USBJ_EX)
LOBYTE(sizeof(HID_JOYSTICK_ReportDesc)), /* wItemLength: Total length of Report descriptor */
HIBYTE(sizeof(HID_JOYSTICK_ReportDesc))
#else
0x00, /* wItemLength: Total length of Report descriptor */
0x00,
#endif
};

#ifndef USE_USBD_COMPOSITE
Expand Down Expand Up @@ -276,9 +283,9 @@ static uint8_t USBD_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
{
UNUSED(cfgidx);
#if defined(USBJ_EX)
uint8_t hid_in_pkt_size = usbReportSize();
uint16_t hid_in_pkt_size = usbReportSize();
#else
uint8_t hid_in_pkt_size = HID_IN_PACKET;
uint16_t hid_in_pkt_size = HID_IN_PACKET;
#endif

USBD_HID_HandleTypeDef *hhid;
Expand All @@ -299,14 +306,7 @@ static uint8_t USBD_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
HIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR);
#endif /* USE_USBD_COMPOSITE */

if (pdev->dev_speed == USBD_SPEED_HIGH)
{
pdev->ep_in[HIDInEpAdd & 0xFU].bInterval = 1;
}
else /* LOW and FULL-speed endpoints */
{
pdev->ep_in[HIDInEpAdd & 0xFU].bInterval = 1;
}
pdev->ep_in[HIDInEpAdd & 0xFU].bInterval = 1;

/* Open EP IN */
(void)USBD_LL_OpenEP(pdev, HIDInEpAdd, USBD_EP_TYPE_INTR, hid_in_pkt_size);
Expand Down Expand Up @@ -425,6 +425,11 @@ static uint8_t USBD_HID_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *re
else if ((req->wValue >> 8) == HID_DESCRIPTOR_TYPE)
{
pbuf = USBD_HID_Desc;
#if defined(USBJ_EX)
struct usbReport_t ret = usbReportDesc();
pbuf[7] = LOBYTE(ret.size);
pbuf[8] = HIBYTE(ret.size);
#endif
len = MIN(USB_HID_DESC_SIZ, req->wLength);
}
else
Expand Down Expand Up @@ -556,15 +561,27 @@ static uint8_t *USBD_HID_GetFSCfgDesc(uint16_t *length)
{
USBD_EpDescTypeDef *pEpDesc = USBD_GetEpDesc(USBD_HID_CfgDesc, HID_EPIN_ADDR);

#if defined(USBJ_EX)
struct usbReport_t ret = usbReportDesc();

USBD_HID_CfgDesc[25] = LOBYTE(ret.size);
USBD_HID_CfgDesc[26] = HIBYTE(ret.size);

uint16_t size = usbReportSize();
USBD_HID_CfgDesc[31] = LOBYTE(size);
USBD_HID_CfgDesc[32] = HIBYTE(size);

if (pEpDesc != NULL)
{
pEpDesc->wMaxPacketSize = size;
pEpDesc->bInterval = 1;
}
#else
if (pEpDesc != NULL)
{
pEpDesc->wMaxPacketSize = HID_IN_PACKET;
pEpDesc->bInterval = 1;
}

#if defined(USBJ_EX)
struct usbReport_t ret = usbReportDesc();
USBD_HID_CfgDesc[25] = ret.size;
USBD_HID_CfgDesc[31] = usbReportSize();
#endif

*length = (uint16_t)sizeof(USBD_HID_CfgDesc);
Expand All @@ -580,21 +597,7 @@ static uint8_t *USBD_HID_GetFSCfgDesc(uint16_t *length)
*/
static uint8_t *USBD_HID_GetHSCfgDesc(uint16_t *length)
{
USBD_EpDescTypeDef *pEpDesc = USBD_GetEpDesc(USBD_HID_CfgDesc, HID_EPIN_ADDR);

if (pEpDesc != NULL)
{
pEpDesc->bInterval = 1;
}

#if defined(USBJ_EX)
struct usbReport_t ret = usbReportDesc();
USBD_HID_CfgDesc[25] = ret.size;
USBD_HID_CfgDesc[31] = usbReportSize();
#endif

*length = (uint16_t)sizeof(USBD_HID_CfgDesc);
return USBD_HID_CfgDesc;
return USBD_HID_GetFSCfgDesc(length);
}

/**
Expand All @@ -606,20 +609,7 @@ static uint8_t *USBD_HID_GetHSCfgDesc(uint16_t *length)
*/
static uint8_t *USBD_HID_GetOtherSpeedCfgDesc(uint16_t *length)
{
USBD_EpDescTypeDef *pEpDesc = USBD_GetEpDesc(USBD_HID_CfgDesc, HID_EPIN_ADDR);

if (pEpDesc != NULL)
{
pEpDesc->bInterval = 1;
}
#if defined(USBJ_EX)
struct usbReport_t ret = usbReportDesc();
USBD_HID_CfgDesc[25] = ret.size;
USBD_HID_CfgDesc[31] = usbReportSize();
#endif

*length = (uint16_t)sizeof(USBD_HID_CfgDesc);
return USBD_HID_CfgDesc;
return USBD_HID_GetFSCfgDesc(length);
}
#endif /* USE_USBD_COMPOSITE */

Expand Down

0 comments on commit 8ac247e

Please sign in to comment.