fix(radio): usb joystick descriptor, unusable joystick axis (#4726)

This commit is contained in:
ThomasKuehne
2024-04-05 19:59:28 +10:00
committed by GitHub
parent 85fbb97286
commit 8ac247e105
@@ -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)
@@ -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
@@ -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 */
@@ -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 */
@@ -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
@@ -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;
@@ -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);
@@ -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
@@ -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 (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();
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;
}
#endif
*length = (uint16_t)sizeof(USBD_HID_CfgDesc);
@@ -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);
}
/**
@@ -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 */