diff --git a/demos/host/src/cdc_serial_app.c b/demos/host/src/cdc_serial_app.c index 2a20b01d0..46f77a39b 100644 --- a/demos/host/src/cdc_serial_app.c +++ b/demos/host/src/cdc_serial_app.c @@ -58,6 +58,32 @@ static uint8_t buffer_in[64] TUSB_CFG_ATTR_USBRAM; //--------------------------------------------------------------------+ // INTERNAL OBJECT & FUNCTION DECLARATION //--------------------------------------------------------------------+ +void tusbh_cdc_isr(uint8_t dev_addr, tusb_event_t event) +{ + switch(event) + { + case TUSB_EVENT_INTERFACE_OPEN: // application set-up + osal_queue_flush(queue_hdl); + tusbh_cdc_receive(dev_addr, buffer_in, sizeof(buffer_in), true); // first report + break; + + case TUSB_EVENT_INTERFACE_CLOSE: // application tear-down + + break; + + case TUSB_EVENT_XFER_COMPLETE: +// osal_queue_send(queue_hdl, &usb_keyboard_report); + tusbh_cdc_receive(dev_addr, buffer_in, sizeof(buffer_in), true); + break; + + case TUSB_EVENT_XFER_ERROR: + tusbh_cdc_receive(dev_addr, buffer_in, sizeof(buffer_in), true); // ignore & continue + break; + + default : + break; + } +} //--------------------------------------------------------------------+ // APPLICATION @@ -75,13 +101,14 @@ void cdc_serial_app_init(void) OSAL_TASK_FUNCTION( cdc_serial_app_task ) (void* p_task_para) { tusb_error_t error; - uint8_t c; + uint8_t c = 0; OSAL_TASK_LOOP_BEGIN osal_queue_receive(queue_hdl, &c, OSAL_TIMEOUT_WAIT_FOREVER, &error); - printf("%c", c); + if (c) + printf("%c", c); OSAL_TASK_LOOP_END } diff --git a/tests/lpc18xx_43xx/test/host/ehci/test_pipe_bulk_xfer.c b/tests/lpc18xx_43xx/test/host/ehci/test_pipe_bulk_xfer.c index ff68be458..d792d358d 100644 --- a/tests/lpc18xx_43xx/test/host/ehci/test_pipe_bulk_xfer.c +++ b/tests/lpc18xx_43xx/test/host/ehci/test_pipe_bulk_xfer.c @@ -134,6 +134,7 @@ void verify_qtd(ehci_qtd_t *p_qtd, uint8_t p_data[], uint16_t length) TEST_ASSERT_EQUAL(3, p_qtd->cerr); TEST_ASSERT_EQUAL(0, p_qtd->current_page); TEST_ASSERT_EQUAL(length, p_qtd->total_bytes); + TEST_ASSERT_EQUAL(length, p_qtd->expected_bytes); TEST_ASSERT_TRUE(p_qtd->used); TEST_ASSERT_EQUAL_HEX( p_data, p_qtd->buffer[0] ); diff --git a/tests/lpc18xx_43xx/test/host/ehci/test_pipe_interrupt_xfer.c b/tests/lpc18xx_43xx/test/host/ehci/test_pipe_interrupt_xfer.c index e6c897c9b..1cb6ae8af 100644 --- a/tests/lpc18xx_43xx/test/host/ehci/test_pipe_interrupt_xfer.c +++ b/tests/lpc18xx_43xx/test/host/ehci/test_pipe_interrupt_xfer.c @@ -136,6 +136,7 @@ void verify_qtd(ehci_qtd_t *p_qtd, uint8_t p_data[], uint16_t length) TEST_ASSERT_EQUAL(3, p_qtd->cerr); TEST_ASSERT_EQUAL(0, p_qtd->current_page); TEST_ASSERT_EQUAL(length, p_qtd->total_bytes); + TEST_ASSERT_EQUAL(length, p_qtd->expected_bytes); TEST_ASSERT_TRUE(p_qtd->used); TEST_ASSERT_EQUAL_HEX( p_data, p_qtd->buffer[0] ); diff --git a/tinyusb/class/cdc_host.c b/tinyusb/class/cdc_host.c index 1520656fe..867dddeb8 100644 --- a/tinyusb/class/cdc_host.c +++ b/tinyusb/class/cdc_host.c @@ -76,7 +76,7 @@ bool tusbh_cdc_serial_is_mounted(uint8_t dev_addr) tusb_error_t tusbh_cdc_send(uint8_t dev_addr, void const * p_data, uint32_t length, bool is_notify) { - ASSERT( tusbh_cdc_is_mounted(dev_addr), TUSB_ERROR_CDCH_DEVICE_NOT_MOUNTED); +// FIXME disable temp ASSERT( tusbh_cdc_is_mounted(dev_addr), TUSB_ERROR_CDCH_DEVICE_NOT_MOUNTED); ASSERT( p_data != NULL && length, TUSB_ERROR_INVALID_PARA); pipe_handle_t pipe_out = cdch_data[dev_addr-1].pipe_out; @@ -90,7 +90,7 @@ tusb_error_t tusbh_cdc_send(uint8_t dev_addr, void const * p_data, uint32_t leng tusb_error_t tusbh_cdc_receive(uint8_t dev_addr, void * p_buffer, uint32_t length, bool is_notify) { - ASSERT( tusbh_cdc_is_mounted(dev_addr), TUSB_ERROR_CDCH_DEVICE_NOT_MOUNTED); +// FIXME disable temp ASSERT( tusbh_cdc_is_mounted(dev_addr), TUSB_ERROR_CDCH_DEVICE_NOT_MOUNTED); ASSERT( p_buffer != NULL && length, TUSB_ERROR_INVALID_PARA); pipe_handle_t pipe_in = cdch_data[dev_addr-1].pipe_in; @@ -177,12 +177,21 @@ tusb_error_t cdch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con } } + // FIXME mounted class flag is not set yet + if (tusbh_cdc_isr) + { + tusbh_cdc_isr(dev_addr, TUSB_EVENT_INTERFACE_OPEN); + } + return TUSB_ERROR_NONE; } void cdch_isr(pipe_handle_t pipe_hdl, tusb_event_t event) { - + if (tusbh_cdc_isr) + { + tusbh_cdc_isr(pipe_hdl.dev_addr, event); + } } void cdch_close(uint8_t dev_addr) @@ -208,9 +217,15 @@ void cdch_close(uint8_t dev_addr) memclr_(p_cdc, sizeof(cdch_data_t)); + if (tusbh_cdc_isr) + { + tusbh_cdc_isr(dev_addr, TUSB_EVENT_INTERFACE_CLOSE); + } + ASSERT(err1 == TUSB_ERROR_NONE && err2 == TUSB_ERROR_NONE && err3 == TUSB_ERROR_NONE, (void) 0 ); + } #endif diff --git a/tinyusb/host/ehci/ehci.c b/tinyusb/host/ehci/ehci.c index 3e75c265a..c016a3a3c 100644 --- a/tinyusb/host/ehci/ehci.c +++ b/tinyusb/host/ehci/ehci.c @@ -938,6 +938,7 @@ static void qtd_init(ehci_qtd_t* p_qtd, uint32_t data_ptr, uint16_t total_bytes) p_qtd->cerr = 3; // TODO 3 consecutive errors tolerance p_qtd->data_toggle = 0; p_qtd->total_bytes = total_bytes; + p_qtd->expected_bytes = total_bytes; p_qtd->buffer[0] = data_ptr; for(uint8_t i=1; i<5; i++)