From aaec9e2689d524b78db9421d68e0dd98e3741325 Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Wed, 11 Nov 2015 17:03:54 -0500 Subject: [PATCH 1/3] Add USB_ENDPOINTS_MASK --- hardware/arduino/avr/cores/arduino/USBCore.cpp | 2 +- hardware/arduino/avr/cores/arduino/USBDesc.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hardware/arduino/avr/cores/arduino/USBCore.cpp b/hardware/arduino/avr/cores/arduino/USBCore.cpp index 3c6610cd6f6..be967991045 100644 --- a/hardware/arduino/avr/cores/arduino/USBCore.cpp +++ b/hardware/arduino/avr/cores/arduino/USBCore.cpp @@ -204,7 +204,7 @@ class LockEP LockEP(u8 ep) : _sreg(SREG) { cli(); - SetEP(ep & 7); + SetEP(ep & USB_ENDPOINTS_MASK); } ~LockEP() { diff --git a/hardware/arduino/avr/cores/arduino/USBDesc.h b/hardware/arduino/avr/cores/arduino/USBDesc.h index c0dce079ebc..17371155fcd 100644 --- a/hardware/arduino/avr/cores/arduino/USBDesc.h +++ b/hardware/arduino/avr/cores/arduino/USBDesc.h @@ -23,6 +23,7 @@ #else #define USB_ENDPOINTS 5 // AtMegaxxU2 #endif +#define USB_ENDPOINTS_MASK 7 #define ISERIAL_MAX_LEN 20 From f667443767d27bbf78ac109014a312f92ab3f2bb Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Wed, 11 Nov 2015 17:10:55 -0500 Subject: [PATCH 2/3] Send ZLP (zero length packet) on flush, if last write filled buffer Also, wait for write access before sending ZLP --- hardware/arduino/avr/cores/arduino/USBCore.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/hardware/arduino/avr/cores/arduino/USBCore.cpp b/hardware/arduino/avr/cores/arduino/USBCore.cpp index be967991045..d70ddc0f965 100644 --- a/hardware/arduino/avr/cores/arduino/USBCore.cpp +++ b/hardware/arduino/avr/cores/arduino/USBCore.cpp @@ -191,6 +191,8 @@ static inline u8 FrameNumber() //================================================================== //================================================================== +bool _sendZlp[USB_ENDPOINTS]; + u8 USBGetConfiguration(void) { return _usbConfiguration; @@ -300,6 +302,7 @@ int USB_Send(u8 ep, const void* d, int len) while (n--) Send8(*data++); } + _sendZlp[ep & USB_ENDPOINTS_MASK] = !ReadWriteAllowed() && (len == 0); if (!ReadWriteAllowed() || ((len == 0) && (ep & TRANSFER_RELEASE))) // Release full buffer ReleaseTX(); } @@ -625,8 +628,15 @@ ISR(USB_COM_vect) void USB_Flush(u8 ep) { SetEP(ep); - if (FifoByteCount()) + + // wait for write access if a ZLP is needed + if (_sendZlp[ep]) + while(!ReadWriteAllowed()); + + if (FifoByteCount() || _sendZlp[ep]) ReleaseTX(); + + _sendZlp[ep] = false; } static inline void USB_ClockDisable() From bc808248d75e4abd218df6a428ba046d7aa80cb4 Mon Sep 17 00:00:00 2001 From: Sandeep Mistry Date: Tue, 17 Nov 2015 11:41:09 -0500 Subject: [PATCH 3/3] Send ZLP in USB_Send if TRANSFER_RELEASE is set on ep as suggested by @embmicro --- hardware/arduino/avr/cores/arduino/USBCore.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hardware/arduino/avr/cores/arduino/USBCore.cpp b/hardware/arduino/avr/cores/arduino/USBCore.cpp index d70ddc0f965..a14e437e3f8 100644 --- a/hardware/arduino/avr/cores/arduino/USBCore.cpp +++ b/hardware/arduino/avr/cores/arduino/USBCore.cpp @@ -302,9 +302,15 @@ int USB_Send(u8 ep, const void* d, int len) while (n--) Send8(*data++); } - _sendZlp[ep & USB_ENDPOINTS_MASK] = !ReadWriteAllowed() && (len == 0); - if (!ReadWriteAllowed() || ((len == 0) && (ep & TRANSFER_RELEASE))) // Release full buffer + _sendZlp[ep & USB_ENDPOINTS_MASK] = !ReadWriteAllowed() && (len == 0) && !(ep & TRANSFER_RELEASE); + + if (!ReadWriteAllowed()) // Release full buffer + ReleaseTX(); + + if ((len == 0) && (ep & TRANSFER_RELEASE)) { + while(!ReadWriteAllowed()); ReleaseTX(); + } } } TXLED1; // light the TX LED