From 85fa438a07f8f38e341a0fa41766e13215832cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20W=C3=B3jcik?= Date: Mon, 6 Jan 2025 22:04:02 +0100 Subject: [PATCH] - Fix USB CDC stability issue when sending data (#345) --- .../raspberrypi/rp2xxx/src/rp2040_only/usb_cdc.zig | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/raspberrypi/rp2xxx/src/rp2040_only/usb_cdc.zig b/examples/raspberrypi/rp2xxx/src/rp2040_only/usb_cdc.zig index 8fd74b7e4..bf2a7b2ab 100644 --- a/examples/raspberrypi/rp2xxx/src/rp2040_only/usb_cdc.zig +++ b/examples/raspberrypi/rp2xxx/src/rp2040_only/usb_cdc.zig @@ -119,20 +119,25 @@ pub fn main() !void { var usb_tx_buff: [1024]u8 = undefined; +// Transfer data to host +// NOTE: After each USB chunk transfer, we have to call the USB task so that bus TX events can be handled pub fn usb_cdc_write(comptime fmt: []const u8, args: anytype) void { const text = std.fmt.bufPrint(&usb_tx_buff, fmt, args) catch &.{}; var write_buff = text; while (write_buff.len > 0) { write_buff = driver_cdc.write(write_buff); + usb_dev.task(false) catch unreachable; } + // Short messages are not sent right away; instead, they accumulate in a buffer, so we have to force a flush to send them + _ = driver_cdc.write_flush(); + usb_dev.task(false) catch unreachable; } var usb_rx_buff: [1024]u8 = undefined; -// TODO - right now there are 2 issues with reading data from serial: -// 1. It not always work, so sometime data is not received. This is probably related to how we reset usb buffer flags. -// 2. Even when usb host sends small chunk of data cdc read returns full packet length. This require further investigation. +// Receive data from host +// NOTE: Read code was not tested extensively. In case of issues, try to call USB task before every read operation pub fn usb_cdc_read() []const u8 { var total_read: usize = 0; var read_buff: []u8 = usb_rx_buff[0..];