Explorar o código

[FL-2219] VCP: fix Tx data freeze on sending 64 bytes packets #992

Co-authored-by: あく <alleteam@gmail.com>
Nikolay Minaylov %!s(int64=3) %!d(string=hai) anos
pai
achega
be500993a3

+ 11 - 2
firmware/targets/f6/furi_hal/furi_hal_vcp.c

@@ -77,6 +77,7 @@ static int32_t vcp_worker(void* context) {
     bool enabled = true;
     bool enabled = true;
     bool tx_idle = false;
     bool tx_idle = false;
     size_t missed_rx = 0;
     size_t missed_rx = 0;
+    uint8_t last_tx_pkt_len = 0;
 
 
     furi_hal_cdc_set_callbacks(VCP_IF_NUM, &cdc_cb, NULL);
     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
             if(len > 0) { // Some data left in Tx buffer. Sending it now
                 tx_idle = false;
                 tx_idle = false;
                 furi_hal_cdc_send(VCP_IF_NUM, vcp->data_buffer, len);
                 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;
             }
             }
         }
         }
     }
     }

+ 11 - 2
firmware/targets/f7/furi_hal/furi_hal_vcp.c

@@ -77,6 +77,7 @@ static int32_t vcp_worker(void* context) {
     bool enabled = true;
     bool enabled = true;
     bool tx_idle = false;
     bool tx_idle = false;
     size_t missed_rx = 0;
     size_t missed_rx = 0;
+    uint8_t last_tx_pkt_len = 0;
 
 
     furi_hal_cdc_set_callbacks(VCP_IF_NUM, &cdc_cb, NULL);
     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
             if(len > 0) { // Some data left in Tx buffer. Sending it now
                 tx_idle = false;
                 tx_idle = false;
                 furi_hal_cdc_send(VCP_IF_NUM, vcp->data_buffer, len);
                 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;
             }
             }
         }
         }
     }
     }