aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-12-12 16:50:45 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-12-12 16:50:45 +0000
commit46677b45896a955b8c62a46d624750213a00b1dd (patch)
tree785e49178112a425ef3acf3848e481783694dbe3
parentb67f9f366902ae62d55195f4a4be88d209fb64fe (diff)
downloadlufa-46677b45896a955b8c62a46d624750213a00b1dd.tar.gz
lufa-46677b45896a955b8c62a46d624750213a00b1dd.tar.bz2
lufa-46677b45896a955b8c62a46d624750213a00b1dd.zip
Fixed possible lost data in the XPLAINBridge, USBtoSerial and Benito projects when the host exceeds the packet timeout period on received packets as set by USB_STREAM_TIMEOUT_MS (thanks to Justin Rajewski).
-rw-r--r--LUFA/ManPages/ChangeLog.txt2
-rw-r--r--Projects/Benito/Benito.c22
-rw-r--r--Projects/USBtoSerial/USBtoSerial.c12
-rw-r--r--Projects/XPLAINBridge/XPLAINBridge.c14
4 files changed, 41 insertions, 9 deletions
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index bb2757fda..4436727d9 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -31,6 +31,8 @@
* - Fixed Benito project discarding incoming data from the USB virtual serial port when the USART is busy
* - Fixed broken DFU bootloader, added XPLAIN support for bootloader start when XCK jumpered to ground
* - Fixed broken HID_REQ_GetReport request handler in the Low Level GenericHID demo
+ * - Fixed possible lost data in the XPLAINBridge, USBtoSerial and Benito projects when the host exceeds the packet
+ * timeout period on received packets as set by USB_STREAM_TIMEOUT_MS (thanks to Justin Rajewski)
*
* \section Sec_ChangeLog101122 Version 101122
* <b>New:</b>
diff --git a/Projects/Benito/Benito.c b/Projects/Benito/Benito.c
index fbb81840f..c6cbf02b3 100644
--- a/Projects/Benito/Benito.c
+++ b/Projects/Benito/Benito.c
@@ -37,7 +37,7 @@
#include "Benito.h"
/** Circular buffer to hold data from the serial port before it is sent to the host. */
-RingBuff_t Tx_Buffer;
+RingBuff_t USARTtoUSB_Buffer;
/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */
volatile struct
@@ -85,7 +85,7 @@ int main(void)
{
SetupHardware();
- RingBuffer_InitBuffer(&Tx_Buffer);
+ RingBuffer_InitBuffer(&USARTtoUSB_Buffer);
sei();
@@ -126,15 +126,25 @@ int main(void)
LEDs_TurnOffLEDs(LEDMASK_RX);
/* Check if the receive buffer flush period has expired */
- RingBuff_Count_t BufferCount = RingBuffer_GetCount(&Tx_Buffer);
+ RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);
if (!(--FlushPeriodRemaining) || (BufferCount > 200))
{
/* Echo bytes from the target to the host via the virtual serial port */
if (BufferCount)
{
while (BufferCount--)
- CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&Tx_Buffer));
-
+ {
+ /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
+ if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
+ RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
+ {
+ break;
+ }
+
+ /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
+ RingBuffer_Remove(&USARTtoUSB_Buffer);
+ }
+
LEDs_TurnOnLEDs(LEDMASK_RX);
PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS;
}
@@ -263,7 +273,7 @@ ISR(USART1_RX_vect, ISR_BLOCK)
uint8_t ReceivedByte = UDR1;
if (USB_DeviceState == DEVICE_STATE_Configured)
- RingBuffer_Insert(&Tx_Buffer, ReceivedByte);
+ RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte);
}
/** Event handler for the CDC Class driver Host-to-Device Line Encoding Changed event.
diff --git a/Projects/USBtoSerial/USBtoSerial.c b/Projects/USBtoSerial/USBtoSerial.c
index 1dfd70896..477dd44f5 100644
--- a/Projects/USBtoSerial/USBtoSerial.c
+++ b/Projects/USBtoSerial/USBtoSerial.c
@@ -100,7 +100,17 @@ int main(void)
/* Read bytes from the USART receive buffer into the USB IN endpoint */
while (BufferCount--)
- CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer));
+ {
+ /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
+ if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
+ RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
+ {
+ break;
+ }
+
+ /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
+ RingBuffer_Remove(&USARTtoUSB_Buffer);
+ }
}
/* Load the next byte from the USART transmit buffer into the USART */
diff --git a/Projects/XPLAINBridge/XPLAINBridge.c b/Projects/XPLAINBridge/XPLAINBridge.c
index 7c824ec93..912e68367 100644
--- a/Projects/XPLAINBridge/XPLAINBridge.c
+++ b/Projects/XPLAINBridge/XPLAINBridge.c
@@ -136,9 +136,19 @@ void UARTBridge_Task(void)
/* Clear flush timer expiry flag */
TIFR0 |= (1 << TOV0);
- /* Read bytes from the UART receive buffer into the USB IN endpoint */
+ /* Read bytes from the USART receive buffer into the USB IN endpoint */
while (BufferCount--)
- CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&UARTtoUSB_Buffer));
+ {
+ /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
+ if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
+ RingBuffer_Peek(&UARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
+ {
+ break;
+ }
+
+ /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
+ RingBuffer_Remove(&UARTtoUSB_Buffer);
+ }
}
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);