summaryrefslogtreecommitdiff
path: root/src/class/hid
diff options
context:
space:
mode:
authorScott Shawcroft <[email protected]>2018-11-08 13:45:30 -0800
committerScott Shawcroft <[email protected]>2018-11-08 13:45:30 -0800
commit30e3c64134789416e10ed867fa12c210b808e98f (patch)
tree6cb85cea204a1398e49eeff7b0e96dd5104aad4b /src/class/hid
parent7a40ec2647f06c37c6b8f0b8af2c17ba747f0aeb (diff)
Polish up control split and treat it more like a normal endpoint.
Diffstat (limited to 'src/class/hid')
-rw-r--r--src/class/hid/hid_device.c32
-rw-r--r--src/class/hid/hid_device.h1
2 files changed, 24 insertions, 9 deletions
diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c
index aa7a8008e..efa602ad6 100644
--- a/src/class/hid/hid_device.c
+++ b/src/class/hid/hid_device.c
@@ -455,15 +455,6 @@ tusb_error_t hidd_control_request(uint8_t rhport, tusb_control_request_t const *
else if ( HID_REQ_CONTROL_SET_REPORT == p_request->bRequest )
{
dcd_edpt_xfer(rhport, 0, _shared_control_buffer, p_request->wLength);
-
- // wValue = Report Type | Report ID
- uint8_t const report_type = tu_u16_high(p_request->wValue);
- uint8_t const report_id = tu_u16_low(p_request->wValue);
-
- if ( p_hid->set_report_cb )
- {
- p_hid->set_report_cb(report_id, (hid_report_type_t) report_type, _shared_control_buffer, p_request->wLength);
- }
}
else if (HID_REQ_CONTROL_SET_IDLE == p_request->bRequest)
{
@@ -495,6 +486,29 @@ tusb_error_t hidd_control_request(uint8_t rhport, tusb_control_request_t const *
return TUSB_ERROR_NONE;
}
+void hidd_control_request_complete(uint8_t rhport, tusb_control_request_t const * p_request)
+{
+ hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) p_request->wIndex );
+ if (p_hid == NULL) {
+ return;
+ }
+
+ if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS)
+ {
+ if ( HID_REQ_CONTROL_SET_REPORT == p_request->bRequest )
+ {
+ // wValue = Report Type | Report ID
+ uint8_t const report_type = tu_u16_high(p_request->wValue);
+ uint8_t const report_id = tu_u16_low(p_request->wValue);
+
+ if ( p_hid->set_report_cb )
+ {
+ p_hid->set_report_cb(report_id, (hid_report_type_t) report_type, _shared_control_buffer, p_request->wLength);
+ }
+ }
+ }
+}
+
tusb_error_t hidd_xfer_cb(uint8_t rhport, uint8_t edpt_addr, tusb_event_t event, uint32_t xferred_bytes)
{
// nothing to do
diff --git a/src/class/hid/hid_device.h b/src/class/hid/hid_device.h
index 10aea10ac..1dc40af57 100644
--- a/src/class/hid/hid_device.h
+++ b/src/class/hid/hid_device.h
@@ -379,6 +379,7 @@ ATTR_WEAK void tud_hid_mouse_set_report_cb(uint8_t report_id, hid_report_type_t
void hidd_init(void);
tusb_error_t hidd_open(uint8_t rhport, tusb_desc_interface_t const * p_interface_desc, uint16_t *p_length);
tusb_error_t hidd_control_request(uint8_t rhport, tusb_control_request_t const * p_request, uint16_t bytes_already_sent);
+void hidd_control_request_complete (uint8_t rhport, tusb_control_request_t const * p_request);
tusb_error_t hidd_xfer_cb(uint8_t rhport, uint8_t edpt_addr, tusb_event_t event, uint32_t xferred_bytes);
void hidd_reset(uint8_t rhport);