summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorhathach <[email protected]>2019-05-02 00:08:39 +0700
committerhathach <[email protected]>2019-05-02 00:08:39 +0700
commit1c0ec61aa1f7ea87dabe330036c0f4d59b629a5b (patch)
tree0b1e04df484c0460cf4e0d555bb5afe0cfef6af7 /src/class
parenta25ca701cda3e1989bab3add052e82b7a71e5820 (diff)
add tud_hid_out_report_cb() for hid epout
Diffstat (limited to 'src/class')
-rw-r--r--src/class/hid/hid_device.c24
-rw-r--r--src/class/hid/hid_device.h11
2 files changed, 24 insertions, 11 deletions
diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c
index 5a59413e7..2ce44a9b2 100644
--- a/src/class/hid/hid_device.c
+++ b/src/class/hid/hid_device.c
@@ -159,7 +159,7 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t
uint8_t const *p_desc = (uint8_t const *) desc_itf;
// TODO support multiple HID interface
- uint8_t itf = 0;
+ uint8_t const itf = 0;
hidd_interface_t * p_hid = &_hidd_itf[itf];
//------------- HID descriptor -------------//
@@ -179,6 +179,9 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t
*p_len = sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + desc_itf->bNumEndpoints*sizeof(tusb_desc_endpoint_t);
+ // Prepare for output endpoint
+ if (p_hid->ep_out) TU_ASSERT(dcd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf)));
+
return true;
}
@@ -288,13 +291,20 @@ bool hidd_control_request_complete(uint8_t rhport, tusb_control_request_t const
return true;
}
-bool hidd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes)
+bool hidd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
{
- // nothing to do
- (void) rhport;
- (void) ep_addr;
- (void) event;
- (void) xferred_bytes;
+ (void) result;
+
+ // TODO support multiple HID interface
+ uint8_t const itf = 0;
+ hidd_interface_t * p_hid = &_hidd_itf[itf];
+
+ if (ep_addr == p_hid->ep_out)
+ {
+ if (tud_hid_out_report_cb) tud_hid_out_report_cb(p_hid->epout_buf, xferred_bytes);
+
+ TU_ASSERT(dcd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf)));
+ }
return true;
}
diff --git a/src/class/hid/hid_device.h b/src/class/hid/hid_device.h
index e349186e3..503b4b430 100644
--- a/src/class/hid/hid_device.h
+++ b/src/class/hid/hid_device.h
@@ -68,18 +68,21 @@ bool tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8_t x, int8_t y
// Callbacks (Weak is optional)
//--------------------------------------------------------------------+
-// Invoked when receiving GET_REPORT control request
+// Invoked when received GET_REPORT control request
// Application must fill buffer report's content and return its length.
// Return zero will cause the stack to STALL request
uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);
-// Invoked when receiving SET_REPORT control request
+// Invoked when received SET_REPORT control request
void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize);
-// Invoked when host switch mode Boot <-> Report via SET_PROTOCOL request
+// Invoked when received data on OUT endpoint
+ATTR_WEAK void tud_hid_out_report_cb(uint8_t const* buffer, uint16_t bufsize);
+
+// Invoked when received SET_PROTOCOL request ( mode switch Boot <-> Report )
ATTR_WEAK void tud_hid_boot_mode_cb(uint8_t boot_mode);
-// Invoked when host send SET_IDLE request. return false will stall the request
+// Invoked when received SET_IDLE request. return false will stall the request
// - Idle Rate = 0 : only send report if there is changes, i.e skip duplication
// - Idle Rate > 0 : skip duplication, but send at least 1 report every idle rate (in unit of 4 ms).
ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t idle_rate);