summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2020-10-09 21:25:17 +0700
committerGitHub <[email protected]>2020-10-09 21:25:17 +0700
commit8a07b9b9c02248fa2bcb809ee6f7949fcd38e217 (patch)
treec5f21fda499641a7ac7315bfb5a47e0346d5dfcf /src/class
parent6f8d0d2c34c61adc7c5202a67eaad69bb7c0f727 (diff)
parent3fd38ddf0493f84eb3124aacf9ccd7c76643a2c9 (diff)
Merge pull request #532 from hathach/house-keeping
House keeping
Diffstat (limited to 'src/class')
-rw-r--r--src/class/hid/hid_device.c90
-rw-r--r--src/class/hid/hid_device.h35
2 files changed, 66 insertions, 59 deletions
diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c
index 45b6aaaca..11da5f220 100644
--- a/src/class/hid/hid_device.c
+++ b/src/class/hid/hid_device.c
@@ -57,17 +57,7 @@ typedef struct
CFG_TUSB_MEM_SECTION static hidd_interface_t _hidd_itf[CFG_TUD_HID];
/*------------- Helpers -------------*/
-static inline hidd_interface_t* get_interface_by_itfnum(uint8_t itf_num)
-{
- for (uint8_t i=0; i < CFG_TUD_HID; i++ )
- {
- if ( itf_num == _hidd_itf[i].itf_num ) return &_hidd_itf[i];
- }
-
- return NULL;
-}
-
-static inline uint8_t get_hid_index_by_itfnum(uint8_t itf_num)
+static inline uint8_t get_index_by_itfnum(uint8_t itf_num)
{
for (uint8_t i=0; i < CFG_TUD_HID; i++ )
{
@@ -227,13 +217,10 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
{
TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);
- hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) request->wIndex );
- TU_ASSERT(p_hid);
+ uint8_t const hid_itf = get_index_by_itfnum((uint8_t) request->wIndex);
+ TU_VERIFY(hid_itf < CFG_TUD_HID);
- #if CFG_TUD_HID>1
- uint8_t const hid_itf = get_hid_index_by_itfnum((uint8_t) request->wIndex);
- TU_VERIFY(hid_itf<0xFF);
- #endif
+ hidd_interface_t* p_hid = &_hidd_itf[hid_itf];
if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD)
{
@@ -249,11 +236,11 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
}
else if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT)
{
- #if CFG_TUD_HID>1
- uint8_t const * desc_report = tud_hid_n_descriptor_report_cb(hid_itf);
- #else
- uint8_t const * desc_report = tud_hid_descriptor_report_cb();
- #endif
+ uint8_t const * desc_report = tud_hid_descriptor_report_cb(
+ #if CFG_TUD_HID > 1
+ hid_itf // TODO for backward compatible callback, remove later when appropriate
+ #endif
+ );
tud_control_xfer(rhport, request, (void*) desc_report, p_hid->report_desc_len);
}
else
@@ -272,11 +259,12 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
uint8_t const report_type = tu_u16_high(request->wValue);
uint8_t const report_id = tu_u16_low(request->wValue);
- #if CFG_TUD_HID>1
- uint16_t xferlen = tud_hid_n_get_report_cb(hid_itf, report_id, (hid_report_type_t) report_type, p_hid->epin_buf, request->wLength);
- #else
- uint16_t xferlen = tud_hid_get_report_cb(report_id, (hid_report_type_t) report_type, p_hid->epin_buf, request->wLength);
- #endif
+ uint16_t xferlen = tud_hid_get_report_cb(
+ #if CFG_TUD_HID > 1
+ hid_itf, // TODO for backward compatible callback, remove later when appropriate
+ #endif
+ report_id, (hid_report_type_t) report_type, p_hid->epin_buf, request->wLength
+ );
TU_ASSERT( xferlen > 0 );
tud_control_xfer(rhport, request, p_hid->epin_buf, xferlen);
@@ -293,7 +281,12 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
if ( tud_hid_set_idle_cb )
{
// stall request if callback return false
- if ( !tud_hid_set_idle_cb(p_hid->idle_rate) ) return false;
+ TU_VERIFY( tud_hid_set_idle_cb(
+ #if CFG_TUD_HID > 1
+ hid_itf, // TODO for backward compatible callback, remove later when appropriate
+ #endif
+ p_hid->idle_rate)
+ );
}
tud_control_status(rhport, request);
@@ -314,7 +307,15 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
case HID_REQ_CONTROL_SET_PROTOCOL:
p_hid->boot_mode = 1 - request->wValue; // 0 is Boot, 1 is Report protocol
- if (tud_hid_boot_mode_cb) tud_hid_boot_mode_cb(p_hid->boot_mode);
+ if (tud_hid_boot_mode_cb)
+ {
+ tud_hid_boot_mode_cb(
+ #if CFG_TUD_HID > 1
+ hid_itf, // TODO for backward compatible callback, remove later when appropriate
+ #endif
+ p_hid->boot_mode
+ );
+ }
tud_control_status(rhport, request);
break;
@@ -334,8 +335,11 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request
bool hidd_control_complete(uint8_t rhport, tusb_control_request_t const * p_request)
{
(void) rhport;
- hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) p_request->wIndex );
- TU_ASSERT(p_hid);
+
+ uint8_t const hid_itf = get_index_by_itfnum((uint8_t) p_request->wIndex);
+ TU_VERIFY(hid_itf < CFG_TUD_HID);
+
+ hidd_interface_t* p_hid = &_hidd_itf[hid_itf];
if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS &&
p_request->bRequest == HID_REQ_CONTROL_SET_REPORT)
@@ -344,13 +348,12 @@ bool hidd_control_complete(uint8_t rhport, tusb_control_request_t const * p_requ
uint8_t const report_type = tu_u16_high(p_request->wValue);
uint8_t const report_id = tu_u16_low(p_request->wValue);
- #if CFG_TUD_HID>1
- uint8_t const hid_itf = get_hid_index_by_itfnum((uint8_t)p_request->wIndex);
- TU_VERIFY(hid_itf<0xFF);
- tud_hid_n_set_report_cb(hid_itf, report_id, (hid_report_type_t) report_type, p_hid->epout_buf, p_request->wLength);
- #else
- tud_hid_set_report_cb(report_id, (hid_report_type_t) report_type, p_hid->epout_buf, p_request->wLength);
- #endif
+ tud_hid_set_report_cb(
+ #if CFG_TUD_HID > 1
+ hid_itf, // TODO for backward compatible callback, remove later when appropriate
+ #endif
+ report_id, (hid_report_type_t) report_type, p_hid->epout_buf, p_request->wLength
+ );
}
return true;
@@ -372,11 +375,12 @@ bool hidd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
if (ep_addr == p_hid->ep_out)
{
- #if CFG_TUD_HID>1
- tud_hid_n_set_report_cb(itf, 0, HID_REPORT_TYPE_INVALID, p_hid->epout_buf, xferred_bytes);
- #else
- tud_hid_set_report_cb(0, HID_REPORT_TYPE_INVALID, p_hid->epout_buf, xferred_bytes);
- #endif
+ tud_hid_set_report_cb(
+ #if CFG_TUD_HID > 1
+ itf, // TODO for backward compatible callback, remove later when appropriate
+ #endif
+ 0, HID_REPORT_TYPE_INVALID, p_hid->epout_buf, xferred_bytes
+ );
TU_ASSERT(usbd_edpt_xfer(rhport, p_hid->ep_out, p_hid->epout_buf, sizeof(p_hid->epout_buf)));
}
diff --git a/src/class/hid/hid_device.h b/src/class/hid/hid_device.h
index 4b8cb17d5..d5b5b7296 100644
--- a/src/class/hid/hid_device.h
+++ b/src/class/hid/hid_device.h
@@ -84,39 +84,42 @@ static inline bool tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8
// Callbacks (Weak is optional)
//--------------------------------------------------------------------+
+#if CFG_TUD_HID > 1
+
// Invoked when received GET HID REPORT DESCRIPTOR request
// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
-#if CFG_TUD_HID>1
-uint8_t const * tud_hid_n_descriptor_report_cb(uint8_t itf);
-#else
-uint8_t const * tud_hid_descriptor_report_cb(void);
-#endif
+uint8_t const * tud_hid_descriptor_report_cb(uint8_t itf);
// 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
-#if CFG_TUD_HID>1
-uint16_t tud_hid_n_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);
-#else
-uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);
-#endif
+uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);
// Invoked when received SET_REPORT control request or
// received data on OUT endpoint ( Report ID = 0, Type = 0 )
-#if CFG_TUD_HID>1
-void tud_hid_n_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize);
-#else
-void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize);
-#endif
+void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize);
// Invoked when received SET_PROTOCOL request ( mode switch Boot <-> Report )
-TU_ATTR_WEAK void tud_hid_boot_mode_cb(uint8_t boot_mode);
+TU_ATTR_WEAK void tud_hid_boot_mode_cb(uint8_t itf, uint8_t boot_mode);
// 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).
+TU_ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t itf, uint8_t idle_rate);
+
+#else
+
+// TODO for backward compatible callback, remove later when appropriate
+uint8_t const * tud_hid_descriptor_report_cb(void);
+uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);
+void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize);
+
+TU_ATTR_WEAK void tud_hid_boot_mode_cb(uint8_t boot_mode);
TU_ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t idle_rate);
+#endif
+
+
//--------------------------------------------------------------------+
// Inline Functions
//--------------------------------------------------------------------+