From e8f9d52d2f236028c8f91ed36d3df91ab93b05f2 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Wed, 6 Mar 2013 20:36:49 +0100 Subject: [PATCH] gdb_if: Fix USB flow control. The introduction of the double buffering broke USB flow control, causing loss of data when a new packet arrived with the previous still present in the double buffer. With this patch the endpoint is kept in NAK until the double buffer is empty. --- src/platforms/stm32/gdb_if.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/platforms/stm32/gdb_if.c b/src/platforms/stm32/gdb_if.c index 030205a..3ea7d14 100644 --- a/src/platforms/stm32/gdb_if.c +++ b/src/platforms/stm32/gdb_if.c @@ -54,8 +54,12 @@ void gdb_if_putchar(unsigned char c, int flush) void gdb_usb_out_cb(usbd_device *dev, uint8_t ep) { (void)ep; + usbd_ep_nak_set(dev, CDCACM_GDB_ENDPOINT, 1); count_new = usbd_ep_read_packet(dev, CDCACM_GDB_ENDPOINT, double_buffer_out, CDCACM_PACKET_SIZE); + if(!count_new) { + usbd_ep_nak_set(dev, CDCACM_GDB_ENDPOINT, 0); + } } unsigned char gdb_if_getchar(void) @@ -72,6 +76,7 @@ unsigned char gdb_if_getchar(void) count_out = count_new; count_new = 0; out_ptr = 0; + usbd_ep_nak_set(usbdev, CDCACM_GDB_ENDPOINT, 0); } } @@ -93,6 +98,7 @@ unsigned char gdb_if_getchar_to(int timeout) count_out = count_new; count_new = 0; out_ptr = 0; + usbd_ep_nak_set(usbdev, CDCACM_GDB_ENDPOINT, 0); } } while(timeout_counter && !(out_ptr < count_out));