Skip to content

Commit 553bf42

Browse files
committed
update(class/hid/usbh_hid): export usbh_hid_get_report_descriptor api, issue #260
1 parent 58ccd1f commit 553bf42

File tree

2 files changed

+6
-16
lines changed

2 files changed

+6
-16
lines changed

class/hid/usbh_hid.c

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,9 @@ static void usbh_hid_class_free(struct usbh_hid *hid_class)
5050
memset(hid_class, 0, sizeof(struct usbh_hid));
5151
}
5252

53-
static int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *buffer)
53+
int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *buffer, uint32_t buflen)
5454
{
5555
struct usb_setup_packet *setup;
56-
int ret;
5756

5857
if (!hid_class || !hid_class->hport) {
5958
return -USB_ERR_INVAL;
@@ -64,14 +63,9 @@ static int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *b
6463
setup->bRequest = USB_REQUEST_GET_DESCRIPTOR;
6564
setup->wValue = HID_DESCRIPTOR_TYPE_HID_REPORT << 8;
6665
setup->wIndex = hid_class->intf;
67-
setup->wLength = hid_class->report_size;
66+
setup->wLength = buflen;
6867

69-
ret = usbh_control_transfer(hid_class->hport, setup, g_hid_buf[hid_class->minor]);
70-
if (ret < 8) {
71-
return ret;
72-
}
73-
memcpy(buffer, g_hid_buf[hid_class->minor], ret - 8);
74-
return ret;
68+
return usbh_control_transfer(hid_class->hport, setup, buffer);
7569
}
7670

7771
int usbh_hid_set_idle(struct usbh_hid *hid_class, uint8_t report_id, uint8_t duration)
@@ -215,11 +209,6 @@ int usbh_hid_connect(struct usbh_hubport *hport, uint8_t intf)
215209
}
216210

217211
hid_class->report_size = desc->subdesc[0].wDescriptorLength;
218-
219-
if (hid_class->report_size > sizeof(g_hid_buf[hid_class->minor])) {
220-
USB_LOG_ERR("HID report descriptor too large\r\n");
221-
return -USB_ERR_INVAL;
222-
}
223212
found = true;
224213
goto found;
225214
}
@@ -247,7 +236,8 @@ int usbh_hid_connect(struct usbh_hubport *hport, uint8_t intf)
247236
USB_LOG_WRN("Do not support set idle\r\n");
248237
}
249238

250-
ret = usbh_hid_get_report_descriptor(hid_class, hid_class->report_desc);
239+
/* We read report desc but do nothing (because of too much memory usage for parsing report desc, parsed by users) */
240+
ret = usbh_hid_get_report_descriptor(hid_class, g_hid_buf[hid_class->minor], MIN(sizeof(g_hid_buf[hid_class->minor]), hid_class->report_size));
251241
if (ret < 0) {
252242
return ret;
253243
}

class/hid/usbh_hid.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ struct usbh_hid {
1515
struct usbh_urb intin_urb; /* INTR IN urb */
1616
struct usbh_urb intout_urb; /* INTR OUT urb */
1717

18-
uint8_t report_desc[256];
1918
uint16_t report_size;
2019

2120
uint8_t protocol;
@@ -29,6 +28,7 @@ struct usbh_hid {
2928
extern "C" {
3029
#endif
3130

31+
int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *buffer, uint32_t buflen);
3232
int usbh_hid_set_idle(struct usbh_hid *hid_class, uint8_t report_id, uint8_t duration);
3333
int usbh_hid_get_idle(struct usbh_hid *hid_class, uint8_t *buffer);
3434
int usbh_hid_set_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen);

0 commit comments

Comments
 (0)