summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-09-27 18:52:19 +0800
committersakumisu <[email protected]>2024-09-27 19:03:33 +0800
commitab59beebd407450650baf703f60f321fbcbec485 (patch)
tree3df498899f131fe4eed2d2c076952161db33d448
parentc377747e67de1ff61d123888f4e066312439db4e (diff)
update(class/hid/usbh_hid): export usbh_hid_get_report_descriptor api, refs:#260
-rw-r--r--class/hid/usbh_hid.c20
-rw-r--r--class/hid/usbh_hid.h2
2 files changed, 6 insertions, 16 deletions
diff --git a/class/hid/usbh_hid.c b/class/hid/usbh_hid.c
index 240d9f31..71dbe4ae 100644
--- a/class/hid/usbh_hid.c
+++ b/class/hid/usbh_hid.c
@@ -50,10 +50,9 @@ static void usbh_hid_class_free(struct usbh_hid *hid_class)
memset(hid_class, 0, sizeof(struct usbh_hid));
}
-static int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *buffer)
+int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *buffer, uint32_t buflen)
{
struct usb_setup_packet *setup;
- int ret;
if (!hid_class || !hid_class->hport) {
return -USB_ERR_INVAL;
@@ -64,14 +63,9 @@ static int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *b
setup->bRequest = USB_REQUEST_GET_DESCRIPTOR;
setup->wValue = HID_DESCRIPTOR_TYPE_HID_REPORT << 8;
setup->wIndex = hid_class->intf;
- setup->wLength = hid_class->report_size;
+ setup->wLength = buflen;
- ret = usbh_control_transfer(hid_class->hport, setup, g_hid_buf[hid_class->minor]);
- if (ret < 8) {
- return ret;
- }
- memcpy(buffer, g_hid_buf[hid_class->minor], ret - 8);
- return ret;
+ return usbh_control_transfer(hid_class->hport, setup, buffer);
}
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)
}
hid_class->report_size = desc->subdesc[0].wDescriptorLength;
-
- if (hid_class->report_size > sizeof(g_hid_buf[hid_class->minor])) {
- USB_LOG_ERR("HID report descriptor too large\r\n");
- return -USB_ERR_INVAL;
- }
found = true;
goto found;
}
@@ -247,7 +236,8 @@ found:
USB_LOG_WRN("Do not support set idle\r\n");
}
- ret = usbh_hid_get_report_descriptor(hid_class, hid_class->report_desc);
+ /* We read report desc but do nothing (because of too much memory usage for parsing report desc, parsed by users) */
+ 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));
if (ret < 0) {
return ret;
}
diff --git a/class/hid/usbh_hid.h b/class/hid/usbh_hid.h
index 6a6cef16..5e8fce61 100644
--- a/class/hid/usbh_hid.h
+++ b/class/hid/usbh_hid.h
@@ -15,7 +15,6 @@ struct usbh_hid {
struct usbh_urb intin_urb; /* INTR IN urb */
struct usbh_urb intout_urb; /* INTR OUT urb */
- uint8_t report_desc[256];
uint16_t report_size;
uint8_t protocol;
@@ -29,6 +28,7 @@ struct usbh_hid {
extern "C" {
#endif
+int usbh_hid_get_report_descriptor(struct usbh_hid *hid_class, uint8_t *buffer, uint32_t buflen);
int usbh_hid_set_idle(struct usbh_hid *hid_class, uint8_t report_id, uint8_t duration);
int usbh_hid_get_idle(struct usbh_hid *hid_class, uint8_t *buffer);
int usbh_hid_set_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen);