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
This commit is contained in:
@@ -53,24 +53,22 @@ OSAL_TASK_DEF(cdc_serial_app_task, 128, CDC_SERIAL_APP_TASK_PRIO);
|
||||
OSAL_QUEUE_DEF(queue_def, QUEUE_SERIAL_DEPTH, uint8_t);
|
||||
|
||||
static osal_queue_handle_t queue_hdl;
|
||||
static uint8_t buffer_in[64] TUSB_CFG_ATTR_USBRAM;
|
||||
|
||||
static uint8_t serial_in_buffer[32] TUSB_CFG_ATTR_USBRAM;
|
||||
static uint8_t serial_out_buffer[32] TUSB_CFG_ATTR_USBRAM;
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// tinyusb Callbacks
|
||||
//--------------------------------------------------------------------+
|
||||
void tusbh_cdc_mounted_cb(uint8_t dev_addr)
|
||||
{
|
||||
// application set-up
|
||||
|
||||
{ // application set-up
|
||||
printf("\na CDC device is mounted\n");
|
||||
|
||||
osal_queue_flush(queue_hdl);
|
||||
tusbh_cdc_receive(dev_addr, buffer_in, sizeof(buffer_in), true); // first report
|
||||
}
|
||||
|
||||
void tusbh_cdc_unmounted_cb(uint8_t dev_addr)
|
||||
{
|
||||
// application tear-down
|
||||
{ // application tear-down
|
||||
printf("\na CDC device is unmounted\n");
|
||||
}
|
||||
|
||||
@@ -83,27 +81,20 @@ void tusbh_cdc_xfer_isr(uint8_t dev_addr, tusb_event_t event, cdc_pipeid_t pipe_
|
||||
case TUSB_EVENT_XFER_COMPLETE:
|
||||
for(uint32_t i=0; i<xferred_bytes; i++)
|
||||
{
|
||||
osal_queue_send(queue_hdl, buffer_in+i);
|
||||
osal_queue_send(queue_hdl, serial_in_buffer+i);
|
||||
}
|
||||
tusbh_cdc_receive(dev_addr, buffer_in, sizeof(buffer_in), true);
|
||||
break;
|
||||
break;
|
||||
|
||||
case TUSB_EVENT_XFER_ERROR:
|
||||
tusbh_cdc_receive(dev_addr, buffer_in, sizeof(buffer_in), true); // ignore & continue
|
||||
break;
|
||||
case TUSB_EVENT_XFER_ERROR: break; // ignore
|
||||
|
||||
case TUSB_EVENT_XFER_STALLED:
|
||||
default :
|
||||
ASSERT(false, VOID_RETURN); // error
|
||||
break;
|
||||
ASSERT(false, VOID_RETURN);
|
||||
break;
|
||||
}
|
||||
}else if (pipe_id == CDC_PIPE_DATA_OUT)
|
||||
{
|
||||
|
||||
}else if (pipe_id == CDC_PIPE_NOTIFICATION)
|
||||
{
|
||||
|
||||
}
|
||||
else if (pipe_id == CDC_PIPE_DATA_OUT) { }
|
||||
else if (pipe_id == CDC_PIPE_NOTIFICATION) { }
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
@@ -111,7 +102,7 @@ void tusbh_cdc_xfer_isr(uint8_t dev_addr, tusb_event_t event, cdc_pipeid_t pipe_
|
||||
//--------------------------------------------------------------------+
|
||||
void cdc_serial_app_init(void)
|
||||
{
|
||||
memclr_(buffer_in, sizeof(buffer_in));
|
||||
memclr_(serial_in_buffer, sizeof(serial_in_buffer));
|
||||
|
||||
queue_hdl = osal_queue_create( OSAL_QUEUE_REF(queue_def) );
|
||||
ASSERT_PTR( queue_hdl, VOID_RETURN);
|
||||
@@ -122,16 +113,39 @@ void cdc_serial_app_init(void)
|
||||
//------------- main task -------------//
|
||||
OSAL_TASK_FUNCTION( cdc_serial_app_task ) (void* p_task_para)
|
||||
{
|
||||
tusb_error_t error;
|
||||
uint8_t c = 0;
|
||||
|
||||
OSAL_TASK_LOOP_BEGIN
|
||||
|
||||
osal_queue_receive(queue_hdl, &c, OSAL_TIMEOUT_WAIT_FOREVER, &error);
|
||||
|
||||
if (c)
|
||||
for(uint8_t dev_addr=0; dev_addr< TUSB_CFG_HOST_DEVICE_MAX; dev_addr++)
|
||||
{
|
||||
printf("%c", c);
|
||||
if ( tusbh_cdc_serial_is_mounted(dev_addr) )
|
||||
{
|
||||
//------------- send characters got from uart terminal -------------//
|
||||
int ch_tx = getchar();
|
||||
if ( ch_tx > 0 )
|
||||
{ // USB is much faster than serial, here we assume usb is always complete. There could be some characters missing
|
||||
serial_out_buffer[0] = (uint8_t) ch_tx;
|
||||
|
||||
if ( !tusbh_cdc_is_busy(dev_addr, CDC_PIPE_DATA_OUT) )
|
||||
{
|
||||
tusbh_cdc_send(dev_addr, serial_out_buffer, 1, false); // no need for interrupt on serial out pipe
|
||||
}
|
||||
}
|
||||
|
||||
//------------- print out received characters -------------//
|
||||
tusb_error_t error;
|
||||
do{
|
||||
uint8_t ch_rx = 0;
|
||||
osal_queue_receive(queue_hdl, &ch_rx, OSAL_TIMEOUT_NOTIMEOUT, &error); // instant return
|
||||
if (error == TUSB_ERROR_NONE && ch_rx) printf("%c", ch_rx);
|
||||
}while (error == TUSB_ERROR_NONE);
|
||||
|
||||
if ( !tusbh_cdc_is_busy(dev_addr, CDC_PIPE_DATA_IN) )
|
||||
{
|
||||
tusbh_cdc_receive(dev_addr, serial_in_buffer, sizeof(serial_in_buffer), true);
|
||||
}
|
||||
|
||||
break; // demo app only communicate with the first CDC-capable device
|
||||
}
|
||||
}
|
||||
|
||||
OSAL_TASK_LOOP_END
|
||||
|
||||
Reference in New Issue
Block a user