aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/XPLAINBridge/XPLAINBridge.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-08-01 14:03:13 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-08-01 14:03:13 +0000
commitff09cf9c73bbc2623a8c1420918747840382cc5b (patch)
tree41967f96971d3e1ed2a00f5449f3c83b5a19eba3 /Projects/XPLAINBridge/XPLAINBridge.c
parentfb0e6597b611731e31b5d1285e52fc81a5ffd559 (diff)
downloadlufa-ff09cf9c73bbc2623a8c1420918747840382cc5b.tar.gz
lufa-ff09cf9c73bbc2623a8c1420918747840382cc5b.tar.bz2
lufa-ff09cf9c73bbc2623a8c1420918747840382cc5b.zip
Fix XPLAINBridge project discarding characters from the USB interface due to a double read from the endpoint.
Make XPLAINBridge and USBtoSerial projects more reliable by forcing a flush if the UART-to-USB buffer becomes nearly full. Reduce locking in the LightweightRingBuffer.h header files by only locking on the update of the buffer count, and require insertions and removals from each buffer to occur in only one execution thread. Fix CDC_*_ReceiveByte() returning 0 when the interface is not configured, instead of the new -1 error value. Fix CDC_Host_ReceiveByte() not re-freezing the pipe if no packet has been received. Remove redundant Pipe token set commands in the CDC and RNDIS host class drivers.
Diffstat (limited to 'Projects/XPLAINBridge/XPLAINBridge.c')
-rw-r--r--Projects/XPLAINBridge/XPLAINBridge.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/Projects/XPLAINBridge/XPLAINBridge.c b/Projects/XPLAINBridge/XPLAINBridge.c
index 7272fd825..f02fe9bad 100644
--- a/Projects/XPLAINBridge/XPLAINBridge.c
+++ b/Projects/XPLAINBridge/XPLAINBridge.c
@@ -36,8 +36,8 @@
#include "XPLAINBridge.h"
-/* Current firmware mode, making the device behave as either a programmer or a USART bridge */
-bool CurrentFirmwareMode = MODE_PDI_PROGRAMMER;
+/** Current firmware mode, making the device behave as either a programmer or a USART bridge */
+bool CurrentFirmwareMode = MODE_USART_BRIDGE;
/** LUFA CDC Class driver interface configuration and state information. This structure is
* passed to all CDC Class driver functions, so that multiple instances of the same class
@@ -122,16 +122,17 @@ void UARTBridge_Task(void)
/* Read bytes from the USB OUT endpoint into the UART transmit buffer */
int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
if (!(ReceivedByte < 0) && !(RingBuffer_IsFull(&USBtoUART_Buffer)))
- RingBuffer_AtomicInsert(&USBtoUART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
+ RingBuffer_Insert(&USBtoUART_Buffer, ReceivedByte);
- /* Check if the UART receive buffer flush timer has expired */
- if (TIFR0 & (1 << TOV0))
+ /* Check if the UART receive buffer flush timer has expired or buffer is nearly full */
+ RingBuff_Count_t BufferCount = RingBuffer_GetCount(&UARTtoUSB_Buffer);
+ if ((TIFR0 & (1 << TOV0)) || (BufferCount > 200))
{
TIFR0 |= (1 << TOV0);
/* Read bytes from the UART receive buffer into the USB IN endpoint */
- while (UARTtoUSB_Buffer.Count)
- CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&UARTtoUSB_Buffer));
+ while (BufferCount--)
+ CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&UARTtoUSB_Buffer));
}
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
@@ -184,6 +185,9 @@ void EVENT_USB_Device_ConfigurationChanged(void)
/* Initialize ring buffers used to hold serial data between USB and software UART interfaces */
RingBuffer_InitBuffer(&USBtoUART_Buffer);
RingBuffer_InitBuffer(&UARTtoUSB_Buffer);
+
+ /* Start the software USART */
+ SoftUART_Init();
}
else
{