aboutsummaryrefslogtreecommitdiff
path: root/src/platforms/stm32/gdb_if.c
diff options
context:
space:
mode:
authorVegard Storheil Eriksen2013-03-06 20:36:49 +0100
committerVegard Storheil Eriksen2013-03-06 20:36:49 +0100
commite8f9d52d2f236028c8f91ed36d3df91ab93b05f2 (patch)
treef215a5b028c9f24f291a13e8040b3a6b8d884003 /src/platforms/stm32/gdb_if.c
parent530ee15153b05f97a38dd549d5813c91f936fc96 (diff)
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.
Diffstat (limited to 'src/platforms/stm32/gdb_if.c')
-rw-r--r--src/platforms/stm32/gdb_if.c6
1 files changed, 6 insertions, 0 deletions
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));