summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-07-02 17:20:25 +0700
committerhathach <[email protected]>2013-07-02 17:20:25 +0700
commite1ad7b62cf453735b3f8b9d97abe2b3e6579a099 (patch)
treef90caee82c921b0b62c8ebaa19352eb28f72d245
parent6ce90e2bd8d1599df22af8dc670d4187a1ec6dc5 (diff)
add way to calculate the actual byte transferred with ehci
add come callback for cdch add code for cdc serial demo
-rw-r--r--demos/host/src/cdc_serial_app.c31
-rw-r--r--tests/lpc18xx_43xx/test/host/ehci/test_pipe_bulk_xfer.c1
-rw-r--r--tests/lpc18xx_43xx/test/host/ehci/test_pipe_interrupt_xfer.c1
-rw-r--r--tinyusb/class/cdc_host.c21
-rw-r--r--tinyusb/host/ehci/ehci.c1
5 files changed, 50 insertions, 5 deletions
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++)