add TUH_EPBUF_DEF for hid host
This commit is contained in:
		| @@ -45,12 +45,11 @@ | ||||
| //--------------------------------------------------------------------+ | ||||
| typedef struct { | ||||
|   uint8_t daddr; | ||||
|  | ||||
|   uint8_t itf_num; | ||||
|   uint8_t ep_in; | ||||
|   uint8_t ep_out; | ||||
|   bool mounted;           // Enumeration is complete | ||||
|  | ||||
|   bool mounted;           // Enumeration is complete | ||||
|   uint8_t itf_protocol;   // None, Keyboard, Mouse | ||||
|   uint8_t protocol_mode;  // Boot (0) or Report protocol (1) | ||||
|  | ||||
| @@ -59,15 +58,17 @@ typedef struct { | ||||
|  | ||||
|   uint16_t epin_size; | ||||
|   uint16_t epout_size; | ||||
|  | ||||
|   CFG_TUH_MEM_ALIGN uint8_t epin_buf[CFG_TUH_HID_EPIN_BUFSIZE]; | ||||
|   CFG_TUH_MEM_ALIGN uint8_t epout_buf[CFG_TUH_HID_EPOUT_BUFSIZE]; | ||||
| } hidh_interface_t; | ||||
|  | ||||
| CFG_TUH_MEM_SECTION | ||||
| tu_static hidh_interface_t _hidh_itf[CFG_TUH_HID]; | ||||
| typedef struct { | ||||
|   TUH_EPBUF_DEF(epin_buf, CFG_TUH_HID_EPIN_BUFSIZE); | ||||
|   TUH_EPBUF_DEF(epout_buf, CFG_TUH_HID_EPOUT_BUFSIZE); | ||||
| } hidh_epbuf_t; | ||||
|  | ||||
| tu_static uint8_t _hidh_default_protocol = HID_PROTOCOL_BOOT; | ||||
| static hidh_interface_t _hidh_itf[CFG_TUH_HID]; | ||||
| CFG_TUH_MEM_SECTION static hidh_epbuf_t _hidh_epbuf[CFG_TUH_HID]; | ||||
|  | ||||
| static uint8_t _hidh_default_protocol = HID_PROTOCOL_BOOT; | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // Helper | ||||
| @@ -78,6 +79,10 @@ TU_ATTR_ALWAYS_INLINE static inline hidh_interface_t* get_hid_itf(uint8_t daddr, | ||||
|   return (p_hid->daddr == daddr) ? p_hid : NULL; | ||||
| } | ||||
|  | ||||
| TU_ATTR_ALWAYS_INLINE static inline hidh_epbuf_t* get_hid_epbuf(uint8_t idx) { | ||||
|   return &_hidh_epbuf[idx]; | ||||
| } | ||||
|  | ||||
| // Get instance ID by endpoint address | ||||
| static uint8_t get_idx_by_epaddr(uint8_t daddr, uint8_t ep_addr) { | ||||
|   for (uint8_t idx = 0; idx < CFG_TUH_HID; idx++) { | ||||
| @@ -353,11 +358,12 @@ bool tuh_hid_receive_ready(uint8_t dev_addr, uint8_t idx) { | ||||
| bool tuh_hid_receive_report(uint8_t daddr, uint8_t idx) { | ||||
|   hidh_interface_t* p_hid = get_hid_itf(daddr, idx); | ||||
|   TU_VERIFY(p_hid); | ||||
|   hidh_epbuf_t* epbuf = get_hid_epbuf(idx); | ||||
|  | ||||
|   // claim endpoint | ||||
|   TU_VERIFY(usbh_edpt_claim(daddr, p_hid->ep_in)); | ||||
|  | ||||
|   if (!usbh_edpt_xfer(daddr, p_hid->ep_in, p_hid->epin_buf, p_hid->epin_size)) { | ||||
|   if (!usbh_edpt_xfer(daddr, p_hid->ep_in, epbuf->epin_buf, p_hid->epin_size)) { | ||||
|     usbh_edpt_release(daddr, p_hid->ep_in); | ||||
|     return false; | ||||
|   } | ||||
| @@ -381,6 +387,7 @@ bool tuh_hid_send_report(uint8_t daddr, uint8_t idx, uint8_t report_id, const vo | ||||
|  | ||||
|   hidh_interface_t* p_hid = get_hid_itf(daddr, idx); | ||||
|   TU_VERIFY(p_hid); | ||||
|   hidh_epbuf_t* epbuf = get_hid_epbuf(idx); | ||||
|  | ||||
|   if (p_hid->ep_out == 0) { | ||||
|     // This HID does not have an out endpoint (other than control) | ||||
| @@ -396,16 +403,16 @@ bool tuh_hid_send_report(uint8_t daddr, uint8_t idx, uint8_t report_id, const vo | ||||
|  | ||||
|   if (report_id == 0) { | ||||
|     // No report ID in transmission | ||||
|     memcpy(&p_hid->epout_buf[0], report, len); | ||||
|     memcpy(&epbuf->epout_buf[0], report, len); | ||||
|   } else { | ||||
|     p_hid->epout_buf[0] = report_id; | ||||
|     memcpy(&p_hid->epout_buf[1], report, len); | ||||
|     epbuf->epout_buf[0] = report_id; | ||||
|     memcpy(&epbuf->epout_buf[1], report, len); | ||||
|     ++len; // 1 more byte for report_id | ||||
|   } | ||||
|  | ||||
|   TU_LOG3_MEM(p_hid->epout_buf, len, 2); | ||||
|  | ||||
|   if (!usbh_edpt_xfer(daddr, p_hid->ep_out, p_hid->epout_buf, len)) { | ||||
|   if (!usbh_edpt_xfer(daddr, p_hid->ep_out, epbuf->epout_buf, len)) { | ||||
|     usbh_edpt_release(daddr, p_hid->ep_out); | ||||
|     return false; | ||||
|   } | ||||
| @@ -434,14 +441,15 @@ bool hidh_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t | ||||
|  | ||||
|   hidh_interface_t* p_hid = get_hid_itf(daddr, idx); | ||||
|   TU_VERIFY(p_hid); | ||||
|   hidh_epbuf_t* epbuf = get_hid_epbuf(idx); | ||||
|  | ||||
|   if (dir == TUSB_DIR_IN) { | ||||
|     TU_LOG_DRV("  Get Report callback (%u, %u)\r\n", daddr, idx); | ||||
|     TU_LOG3_MEM(p_hid->epin_buf, xferred_bytes, 2); | ||||
|     tuh_hid_report_received_cb(daddr, idx, p_hid->epin_buf, (uint16_t) xferred_bytes); | ||||
|     tuh_hid_report_received_cb(daddr, idx, epbuf->epin_buf, (uint16_t) xferred_bytes); | ||||
|   } else { | ||||
|     if (tuh_hid_report_sent_cb) { | ||||
|       tuh_hid_report_sent_cb(daddr, idx, p_hid->epout_buf, (uint16_t) xferred_bytes); | ||||
|       tuh_hid_report_sent_cb(daddr, idx, epbuf->epout_buf, (uint16_t) xferred_bytes); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 hathach
					hathach