update tud_hid_boot_mode_cb/tud_hid_set_idle_cb support mul interfaces
also clean up code
This commit is contained in:
		| @@ -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_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_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_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_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))); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -100,15 +100,16 @@ uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t | ||||
| 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 idle_rate); | ||||
| 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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 hathach
					hathach