|
|
@@ -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)));
|
|
|
}
|
|
|
|