From be500993a313511139d23c8eb8cb40944c2ca70a Mon Sep 17 00:00:00 2001 From: Nikolay Minaylov Date: Mon, 14 Feb 2022 13:29:30 +0300 Subject: [PATCH] [FL-2219] VCP: fix Tx data freeze on sending 64 bytes packets #992 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: あく --- firmware/targets/f6/furi_hal/furi_hal_vcp.c | 13 +++++++++++-- firmware/targets/f7/furi_hal/furi_hal_vcp.c | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/firmware/targets/f6/furi_hal/furi_hal_vcp.c b/firmware/targets/f6/furi_hal/furi_hal_vcp.c index b09cc49a..4ac59ae3 100644 --- a/firmware/targets/f6/furi_hal/furi_hal_vcp.c +++ b/firmware/targets/f6/furi_hal/furi_hal_vcp.c @@ -77,6 +77,7 @@ static int32_t vcp_worker(void* context) { bool enabled = true; bool tx_idle = false; size_t missed_rx = 0; + uint8_t last_tx_pkt_len = 0; furi_hal_cdc_set_callbacks(VCP_IF_NUM, &cdc_cb, NULL); @@ -184,8 +185,16 @@ static int32_t vcp_worker(void* context) { if(len > 0) { // Some data left in Tx buffer. Sending it now tx_idle = false; furi_hal_cdc_send(VCP_IF_NUM, vcp->data_buffer, len); - } else { // There is nothing to send. Set flag to start next transfer instantly - tx_idle = true; + last_tx_pkt_len = len; + } else { // There is nothing to send. + if(last_tx_pkt_len == 64) { + // Send extra zero-length packet if last packet len is 64 to indicate transfer end + furi_hal_cdc_send(VCP_IF_NUM, NULL, 0); + } else { + // Set flag to start next transfer instantly + tx_idle = true; + } + last_tx_pkt_len = 0; } } } diff --git a/firmware/targets/f7/furi_hal/furi_hal_vcp.c b/firmware/targets/f7/furi_hal/furi_hal_vcp.c index b09cc49a..4ac59ae3 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_vcp.c +++ b/firmware/targets/f7/furi_hal/furi_hal_vcp.c @@ -77,6 +77,7 @@ static int32_t vcp_worker(void* context) { bool enabled = true; bool tx_idle = false; size_t missed_rx = 0; + uint8_t last_tx_pkt_len = 0; furi_hal_cdc_set_callbacks(VCP_IF_NUM, &cdc_cb, NULL); @@ -184,8 +185,16 @@ static int32_t vcp_worker(void* context) { if(len > 0) { // Some data left in Tx buffer. Sending it now tx_idle = false; furi_hal_cdc_send(VCP_IF_NUM, vcp->data_buffer, len); - } else { // There is nothing to send. Set flag to start next transfer instantly - tx_idle = true; + last_tx_pkt_len = len; + } else { // There is nothing to send. + if(last_tx_pkt_len == 64) { + // Send extra zero-length packet if last packet len is 64 to indicate transfer end + furi_hal_cdc_send(VCP_IF_NUM, NULL, 0); + } else { + // Set flag to start next transfer instantly + tx_idle = true; + } + last_tx_pkt_len = 0; } } }