summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-04-23 22:02:16 +0800
committersakumisu <[email protected]>2024-04-23 22:02:16 +0800
commit190fb36c438b2f54634764be9ca914fd4249f42b (patch)
tree8ce61f6687ed8c0f0ec205ac31277a4310467a5e
parenta24d2bdc07bc8b7792e34277b8f0f20365069252 (diff)
add hid host report api
-rw-r--r--class/hid/usbh_hid.c26
-rw-r--r--class/hid/usbh_hid.h2
2 files changed, 28 insertions, 0 deletions
diff --git a/class/hid/usbh_hid.c b/class/hid/usbh_hid.c
index 159f8c58..f6b28ee0 100644
--- a/class/hid/usbh_hid.c
+++ b/class/hid/usbh_hid.c
@@ -106,6 +106,32 @@ 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_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 = hid_class->hport->setup;
+
+ setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE;
+ setup->bRequest = HID_REQUEST_SET_REPORT;
+ setup->wValue = (uint16_t)(((uint32_t)report_type << 8U) | (uint32_t)report_id);
+ setup->wIndex = 0;
+ setup->wLength = buflen;
+
+ return usbh_control_transfer(hid_class->hport, setup, buffer);
+}
+
+int usbh_hid_get_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 = hid_class->hport->setup;
+
+ setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE;
+ setup->bRequest = HID_REQUEST_GET_REPORT;
+ setup->wValue = (uint16_t)(((uint32_t)report_type << 8U) | (uint32_t)report_id);
+ setup->wIndex = 0;
+ setup->wLength = buflen;
+
+ return usbh_control_transfer(hid_class->hport, setup, buffer);
+}
+
int usbh_hid_connect(struct usbh_hubport *hport, uint8_t intf)
{
struct usb_endpoint_descriptor *ep_desc;
diff --git a/class/hid/usbh_hid.h b/class/hid/usbh_hid.h
index 72571dd2..4d655fad 100644
--- a/class/hid/usbh_hid.h
+++ b/class/hid/usbh_hid.h
@@ -26,6 +26,8 @@ extern "C" {
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);
+int usbh_hid_get_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen);
void usbh_hid_run(struct usbh_hid *hid_class);
void usbh_hid_stop(struct usbh_hid *hid_class);