aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGareth McMullin2014-10-16 13:48:28 -0700
committerGareth McMullin2014-10-16 13:50:56 -0700
commitfd9eef821e7451fcb1d7839f9d1d21c098787327 (patch)
tree303dfe44acb4c705eba78716e0182be18c79a46e
parentf85a8c4ebb2ae4b45231813d06dd26d13eb2e6de (diff)
Revert USB double buffered OUT handling on STM32F1.
This introduced a bug where the endpoint can get stuck, forever sending NAK.
-rw-r--r--src/platforms/stm32/cdcacm.c13
-rw-r--r--src/platforms/stm32/gdb_if.c46
2 files changed, 37 insertions, 22 deletions
diff --git a/src/platforms/stm32/cdcacm.c b/src/platforms/stm32/cdcacm.c
index ef7ff3b..9694cf0 100644
--- a/src/platforms/stm32/cdcacm.c
+++ b/src/platforms/stm32/cdcacm.c
@@ -485,17 +485,22 @@ static void cdcacm_set_config(usbd_device *dev, uint16_t wValue)
configured = wValue;
/* GDB interface */
+#ifdef STM32F4
usbd_ep_setup(dev, 0x01, USB_ENDPOINT_ATTR_BULK,
- CDCACM_PACKET_SIZE, gdb_usb_out_cb);
+ CDCACM_PACKET_SIZE, gdb_usb_out_cb);
+#else
+ usbd_ep_setup(dev, 0x01, USB_ENDPOINT_ATTR_BULK,
+ CDCACM_PACKET_SIZE, NULL);
+#endif
usbd_ep_setup(dev, 0x81, USB_ENDPOINT_ATTR_BULK,
- CDCACM_PACKET_SIZE, NULL);
+ CDCACM_PACKET_SIZE, NULL);
usbd_ep_setup(dev, 0x82, USB_ENDPOINT_ATTR_INTERRUPT, 16, NULL);
/* Serial interface */
usbd_ep_setup(dev, 0x03, USB_ENDPOINT_ATTR_BULK,
- CDCACM_PACKET_SIZE, usbuart_usb_out_cb);
+ CDCACM_PACKET_SIZE, usbuart_usb_out_cb);
usbd_ep_setup(dev, 0x83, USB_ENDPOINT_ATTR_BULK,
- CDCACM_PACKET_SIZE, usbuart_usb_in_cb);
+ CDCACM_PACKET_SIZE, usbuart_usb_in_cb);
usbd_ep_setup(dev, 0x84, USB_ENDPOINT_ATTR_INTERRUPT, 16, NULL);
#if defined(PLATFORM_HAS_TRACESWO)
diff --git a/src/platforms/stm32/gdb_if.c b/src/platforms/stm32/gdb_if.c
index 482effe..c8208b3 100644
--- a/src/platforms/stm32/gdb_if.c
+++ b/src/platforms/stm32/gdb_if.c
@@ -28,12 +28,14 @@
#include "gdb_if.h"
static uint32_t count_out;
-static uint32_t count_new;
static uint32_t count_in;
static uint32_t out_ptr;
static uint8_t buffer_out[CDCACM_PACKET_SIZE];
-static uint8_t double_buffer_out[CDCACM_PACKET_SIZE];
static uint8_t buffer_in[CDCACM_PACKET_SIZE];
+#ifdef STM32F4
+static volatile uint32_t count_new;
+static uint8_t double_buffer_out[CDCACM_PACKET_SIZE];
+#endif
void gdb_if_putchar(unsigned char c, int flush)
{
@@ -63,6 +65,7 @@ void gdb_if_putchar(unsigned char c, int flush)
}
}
+#ifdef STM32F4
void gdb_usb_out_cb(usbd_device *dev, uint8_t ep)
{
(void)ep;
@@ -73,6 +76,27 @@ void gdb_usb_out_cb(usbd_device *dev, uint8_t ep)
usbd_ep_nak_set(dev, CDCACM_GDB_ENDPOINT, 0);
}
}
+#endif
+
+static void gdb_if_update_buf(void)
+{
+ while (cdcacm_get_config() != 1);
+#ifdef STM32F4
+ asm volatile ("cpsid i; isb");
+ if (count_new) {
+ memcpy(buffer_out, double_buffer_out, count_new);
+ count_out = count_new;
+ count_new = 0;
+ out_ptr = 0;
+ usbd_ep_nak_set(usbdev, CDCACM_GDB_ENDPOINT, 0);
+ }
+ asm volatile ("cpsie i; isb");
+#else
+ count_out = usbd_ep_read_packet(usbdev, CDCACM_GDB_ENDPOINT,
+ buffer_out, CDCACM_PACKET_SIZE);
+ out_ptr = 0;
+#endif
+}
unsigned char gdb_if_getchar(void)
{
@@ -82,14 +106,7 @@ unsigned char gdb_if_getchar(void)
if (!cdcacm_get_dtr())
return 0x04;
- while (cdcacm_get_config() != 1);
- if (count_new) {
- memcpy(buffer_out, double_buffer_out,count_new);
- count_out = count_new;
- count_new = 0;
- out_ptr = 0;
- usbd_ep_nak_set(usbdev, CDCACM_GDB_ENDPOINT, 0);
- }
+ gdb_if_update_buf();
}
return buffer_out[out_ptr++];
@@ -104,14 +121,7 @@ unsigned char gdb_if_getchar_to(int timeout)
if (!cdcacm_get_dtr())
return 0x04;
- while (cdcacm_get_config() != 1);
- if (count_new) {
- memcpy(buffer_out, double_buffer_out,count_new);
- count_out = count_new;
- count_new = 0;
- out_ptr = 0;
- usbd_ep_nak_set(usbdev, CDCACM_GDB_ENDPOINT, 0);
- }
+ gdb_if_update_buf();
} while(timeout_counter && !(out_ptr < count_out));
if(out_ptr < count_out)