summaryrefslogtreecommitdiff
path: root/tinyusb/class
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-10-27 19:34:36 +0700
committerhathach <[email protected]>2013-10-27 19:34:36 +0700
commit318a058d3cf4f76221febead5fc0792a2387a310 (patch)
treea4f920c571be466282a1acb65df8189eeb52de08 /tinyusb/class
parent0d9e1163dfd4e12b57674cb893b427fce40ba402 (diff)
static assert to check OSAL_QUEUE_DEF's queue_depth parameter < 256
enable HOST_HCD_XFER_INTERRUPT by default (previously only enabled with HID), as it is widely used implement tusbh_cdc_is_busy add compilation switch in usbh enumeration for hub rewrite CDC serial application to address usb-serial race condition
Diffstat (limited to 'tinyusb/class')
-rw-r--r--tinyusb/class/cdc_host.c36
-rw-r--r--tinyusb/class/cdc_host.h2
2 files changed, 32 insertions, 6 deletions
diff --git a/tinyusb/class/cdc_host.c b/tinyusb/class/cdc_host.c
index f54889489..a802807d0 100644
--- a/tinyusb/class/cdc_host.c
+++ b/tinyusb/class/cdc_host.c
@@ -58,6 +58,17 @@
//--------------------------------------------------------------------+
/*STATIC_*/ cdch_data_t cdch_data[TUSB_CFG_HOST_DEVICE_MAX]; // TODO to be static
+static inline cdc_pipeid_t get_app_pipeid(pipe_handle_t pipe_hdl) ATTR_PURE ATTR_ALWAYS_INLINE;
+static inline cdc_pipeid_t get_app_pipeid(pipe_handle_t pipe_hdl)
+{
+ cdch_data_t const * p_cdc = &cdch_data[pipe_hdl.dev_addr-1];
+
+ return pipehandle_is_equal( pipe_hdl, p_cdc->pipe_notification ) ? CDC_PIPE_NOTIFICATION :
+ pipehandle_is_equal( pipe_hdl, p_cdc->pipe_in ) ? CDC_PIPE_DATA_IN :
+ pipehandle_is_equal( pipe_hdl, p_cdc->pipe_out ) ? CDC_PIPE_DATA_OUT : CDC_PIPE_ERROR;
+}
+
+
STATIC_ INLINE_ bool tusbh_cdc_is_mounted(uint8_t dev_addr) ATTR_PURE ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
STATIC_ INLINE_ bool tusbh_cdc_is_mounted(uint8_t dev_addr)
{
@@ -70,16 +81,29 @@ STATIC_ INLINE_ bool tusbh_cdc_is_mounted(uint8_t dev_addr)
#endif
}
-static inline cdc_pipeid_t get_app_pipeid(pipe_handle_t pipe_hdl) ATTR_PURE ATTR_ALWAYS_INLINE;
-static inline cdc_pipeid_t get_app_pipeid(pipe_handle_t pipe_hdl)
+bool tusbh_cdc_is_busy(uint8_t dev_addr, cdc_pipeid_t pipeid)
{
- cdch_data_t const * p_cdc = &cdch_data[pipe_hdl.dev_addr-1];
+ if ( !tusbh_cdc_is_mounted(dev_addr) ) return false;
- return pipehandle_is_equal( pipe_hdl, p_cdc->pipe_notification ) ? CDC_PIPE_NOTIFICATION :
- pipehandle_is_equal( pipe_hdl, p_cdc->pipe_in ) ? CDC_PIPE_DATA_IN :
- pipehandle_is_equal( pipe_hdl, p_cdc->pipe_out ) ? CDC_PIPE_DATA_OUT : CDC_PIPE_ERROR;
+ cdch_data_t const * p_cdc = &cdch_data[dev_addr-1];
+
+ switch (pipeid)
+ {
+ case CDC_PIPE_NOTIFICATION:
+ return hcd_pipe_is_busy( p_cdc->pipe_notification );
+
+ case CDC_PIPE_DATA_IN:
+ return hcd_pipe_is_busy( p_cdc->pipe_in );
+
+ case CDC_PIPE_DATA_OUT:
+ return hcd_pipe_is_busy( p_cdc->pipe_out );
+
+ default:
+ return false;
+ }
}
+
//--------------------------------------------------------------------+
// APPLICATION API (parameter validation needed)
//--------------------------------------------------------------------+
diff --git a/tinyusb/class/cdc_host.h b/tinyusb/class/cdc_host.h
index 4c78e6f73..e73d96d60 100644
--- a/tinyusb/class/cdc_host.h
+++ b/tinyusb/class/cdc_host.h
@@ -64,6 +64,8 @@ typedef enum {
* @{ */
bool tusbh_cdc_serial_is_mounted(uint8_t dev_addr) ATTR_PURE ATTR_WARN_UNUSED_RESULT;
+bool tusbh_cdc_is_busy(uint8_t dev_addr, cdc_pipeid_t pipeid) ATTR_PURE ATTR_WARN_UNUSED_RESULT;
+
tusb_error_t tusbh_cdc_send(uint8_t dev_addr, void const * p_data, uint32_t length, bool is_notify);
tusb_error_t tusbh_cdc_receive(uint8_t dev_addr, void * p_buffer, uint32_t length, bool is_notify);