diff --git a/examples/host/bare_api/src/tusb_config.h b/examples/host/bare_api/src/tusb_config.h index 234eca40..9b789290 100644 --- a/examples/host/bare_api/src/tusb_config.h +++ b/examples/host/bare_api/src/tusb_config.h @@ -81,11 +81,11 @@ // 1 hub typically has 4 ports #define CFG_TUH_DEVICE_MAX (CFG_TUH_HUB ? 4 : 1) -#define CFG_TUH_ENDPOINT_MAX 8 +// Max endpoint per device +#define CFG_TUH_ENDPOINT_MAX 8 -//------------- HID -------------// - -#define CFG_TUH_HID_EP_BUFSIZE 64 +// Enable tuh_edpt_xfer() API +#define CFG_TUH_API_EDPT_XFER 1 #ifdef __cplusplus } diff --git a/src/host/usbh.c b/src/host/usbh.c index 534f2458..689634ec 100644 --- a/src/host/usbh.c +++ b/src/host/usbh.c @@ -109,8 +109,15 @@ typedef struct { tu_edpt_state_t ep_status[CFG_TUH_ENDPOINT_MAX][2]; -#if CFG_TUH_BARE - +#if CFG_TUH_API_EDPT_XFER +// struct +// { +// uint8_t* buffer; +// tuh_xfer_cb_t complete_cb; +// uintptr_t user_arg; +// +// volatile uint16_t actual_len; +// }ep_xfer; #endif } usbh_device_t; @@ -240,6 +247,16 @@ static osal_queue_t _usbh_q; CFG_TUSB_MEM_SECTION CFG_TUSB_MEM_ALIGN static uint8_t _usbh_ctrl_buf[CFG_TUH_ENUMERATION_BUFSIZE]; +//// internal version of tuh_xfer_t +//typedef struct +//{ +// uint8_t* buffer; +// tuh_xfer_cb_t complete_cb; +// uintptr_t user_arg; +// +// volatile uint16_t actual_len; +//}usbh_xfer_t; + // Control transfer: since most controller does not support multiple control transfer // on multiple devices concurrently. And control transfer is not used much except enumeration // We will only execute control transfer one at a time. @@ -890,6 +907,19 @@ static void _control_blocking_complete_cb(uint8_t daddr, tuh_xfer_t* xfer) *((xfer_result_t*) xfer->user_arg) = xfer->result; } +bool tuh_control_xfer_sync(uint8_t daddr, tuh_xfer_t* xfer, uint32_t timeout_ms) +{ + (void) timeout_ms; + + // clear callback for sync + xfer->complete_cb = NULL; + + // TODO use timeout to wait + TU_VERIFY(tuh_control_xfer(daddr, xfer)); + + return true; +} + bool tuh_control_xfer (uint8_t daddr, tuh_xfer_t* xfer) { // pre-check to help reducing mutex lock @@ -956,19 +986,6 @@ bool tuh_control_xfer (uint8_t daddr, tuh_xfer_t* xfer) return true; } -bool tuh_control_xfer_sync(uint8_t daddr, tuh_xfer_t* xfer, uint32_t timeout_ms) -{ - (void) timeout_ms; - - // clear callback for sync - xfer->complete_cb = NULL; - - // TODO use timeout to wait - TU_VERIFY(tuh_control_xfer(daddr, xfer)); - - return true; -} - TU_ATTR_ALWAYS_INLINE static inline void _set_control_xfer_stage(uint8_t stage) { usbh_lock(); diff --git a/src/host/usbh.h b/src/host/usbh.h index 73fe2e08..2021545b 100644 --- a/src/host/usbh.h +++ b/src/host/usbh.h @@ -113,13 +113,17 @@ static inline bool tuh_ready(uint8_t daddr) // Endpoint Asynchronous (non-blocking) //--------------------------------------------------------------------+ -// Carry out a control transfer +// Submit a control transfer // true on success, false if there is on-going control transfer or incorrect parameters // Note: blocking if complete callback is NULL. In this case 'xfer->result' will be updated // and if 'user_arg' point to a xfer_result_t variable, it will be updated as well. bool tuh_control_xfer(uint8_t daddr, tuh_xfer_t* xfer); -//bool tuh_edpt_xfer(uint8_t daddr, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes); +// Submit a bulk/interrupt transfer +// true on success, false if there is on-going control transfer or incorrect parameters +// Note: blocking if complete callback is NULL. In this case 'xfer->result' will be updated +// and if 'user_arg' point to a xfer_result_t variable, it will be updated as well. +bool tuh_edpt_xfer(uint8_t daddr, tuh_xfer_t* xfer); // Set Configuration (control transfer) // config_num = 0 will un-configure device. Note: config_num = config_descriptor_index + 1 diff --git a/src/tusb_option.h b/src/tusb_option.h index 0352faae..bd87a953 100644 --- a/src/tusb_option.h +++ b/src/tusb_option.h @@ -392,6 +392,10 @@ #define CFG_TUH_VENDOR 0 #endif +#ifndef CFG_TUH_API_EDPT_XFER +#define CFG_TUH_API_EDPT_XFER 0 +#endif + //------------------------------------------------------------------ // Configuration Validation //------------------------------------------------------------------