add way to calculate the actual byte transferred with ehci

add come callback for cdch
add code for cdc serial demo
This commit is contained in:
hathach 2013-07-02 17:20:25 +07:00
parent 6ce90e2bd8
commit e1ad7b62cf
5 changed files with 50 additions and 5 deletions

View File

@ -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
}

View File

@ -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] );

View File

@ -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] );

View File

@ -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

View File

@ -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++)