Merge pull request #713 from HiFiPhile/cdc_read

Call One time tu_fifo_write_n on cdcd_xfer_cb
This commit is contained in:
Ha Thach 2021-03-12 13:10:56 +07:00 committed by GitHub
commit d9f0475701
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 12 deletions

View File

@ -95,7 +95,8 @@ static void _prep_out_transaction (cdcd_interface_t* p_cdc)
// fifo can be changed before endpoint is claimed // fifo can be changed before endpoint is claimed
available = tu_fifo_remaining(&p_cdc->rx_ff); available = tu_fifo_remaining(&p_cdc->rx_ff);
if ( available >= sizeof(p_cdc->epout_buf) ) { if ( available >= sizeof(p_cdc->epout_buf) )
{
usbd_edpt_xfer(rhport, p_cdc->ep_out, p_cdc->epout_buf, sizeof(p_cdc->epout_buf)); usbd_edpt_xfer(rhport, p_cdc->ep_out, p_cdc->epout_buf, sizeof(p_cdc->epout_buf));
}else }else
{ {
@ -432,25 +433,27 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
// Received new data // Received new data
if ( ep_addr == p_cdc->ep_out ) if ( ep_addr == p_cdc->ep_out )
{ {
// TODO search for wanted char first for better performance tu_fifo_write_n(&p_cdc->rx_ff, &p_cdc->epout_buf, xferred_bytes);
for(uint32_t i=0; i<xferred_bytes; i++)
// Check for wanted char and invoke callback if needed
if ( tud_cdc_rx_wanted_cb && (((signed char) p_cdc->wanted_char) != -1) )
{ {
tu_fifo_write(&p_cdc->rx_ff, &p_cdc->epout_buf[i]); for ( uint32_t i = 0; i < xferred_bytes; i++ )
// Check for wanted char and invoke callback if needed
if ( tud_cdc_rx_wanted_cb && ( ((signed char) p_cdc->wanted_char) != -1 ) && ( p_cdc->wanted_char == p_cdc->epout_buf[i] ) )
{ {
tud_cdc_rx_wanted_cb(itf, p_cdc->wanted_char); if ( (p_cdc->wanted_char == p_cdc->epout_buf[i]) && !tu_fifo_empty(&p_cdc->rx_ff) )
{
tud_cdc_rx_wanted_cb(itf, p_cdc->wanted_char);
}
} }
} }
// invoke receive callback (if there is still data) // invoke receive callback (if there is still data)
if (tud_cdc_rx_cb && tu_fifo_count(&p_cdc->rx_ff) ) tud_cdc_rx_cb(itf); if (tud_cdc_rx_cb && !tu_fifo_empty(&p_cdc->rx_ff) ) tud_cdc_rx_cb(itf);
// prepare for OUT transaction // prepare for OUT transaction
_prep_out_transaction(p_cdc); _prep_out_transaction(p_cdc);
} }
// Data sent to host, we continue to fetch from tx fifo to send. // Data sent to host, we continue to fetch from tx fifo to send.
// Note: This will cause incorrect baudrate set in line coding. // Note: This will cause incorrect baudrate set in line coding.
// Though maybe the baudrate is not really important !!! // Though maybe the baudrate is not really important !!!