summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2025-04-17 11:32:31 +0800
committersakumisu <[email protected]>2025-04-17 11:32:31 +0800
commite6fb6af4a966c28b8c3d8ce9a61d10b54a631aa2 (patch)
tree4fd8aaad6acca2bd96b2c40d3dd955b3fbfb3997
parent947f8530ef2ae379ef0f5706683ae64eb6138525 (diff)
feat(class/usbh_hid): add usbh_hid_get_protocol api
Signed-off-by: sakumisu <[email protected]>
-rw-r--r--class/hid/usbh_hid.c24
-rw-r--r--class/hid/usbh_hid.h2
2 files changed, 26 insertions, 0 deletions
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);