diff --git a/class/hid/usbh_hid.c b/class/hid/usbh_hid.c index 0fd58abb..ac454cb3 100644 --- a/class/hid/usbh_hid.c +++ b/class/hid/usbh_hid.c @@ -128,6 +128,30 @@ int usbh_hid_set_protocol(struct usbh_hid *hid_class, uint8_t protocol) return usbh_control_transfer(hid_class->hport, setup, NULL); } +int usbh_hid_get_protocol(struct usbh_hid *hid_class, uint8_t *protocol) +{ + struct usb_setup_packet *setup; + int ret; + + if (!hid_class || !hid_class->hport) { + return -USB_ERR_INVAL; + } + setup = hid_class->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = HID_REQUEST_GET_PROTOCOL; + setup->wValue = 0; + setup->wIndex = hid_class->intf; + setup->wLength = 1; + + ret = usbh_control_transfer(hid_class->hport, setup, g_hid_buf[hid_class->minor]); + if (ret < 8) { + return ret; + } + memcpy(protocol, g_hid_buf[hid_class->minor], ret - 8); + return ret; +} + int usbh_hid_set_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen) { struct usb_setup_packet *setup; diff --git a/class/hid/usbh_hid.h b/class/hid/usbh_hid.h index 5e8fce61..8b87e0c0 100644 --- a/class/hid/usbh_hid.h +++ b/class/hid/usbh_hid.h @@ -31,6 +31,8 @@ extern "C" { 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_protocol(struct usbh_hid *hid_class, uint8_t protocol); +int usbh_hid_get_protocol(struct usbh_hid *hid_class, uint8_t *protocol); int usbh_hid_set_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen); int usbh_hid_get_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen);