aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/XPLAINBridge/XPLAINBridge.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-07-12 07:04:19 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-07-12 07:04:19 +0000
commit0bcc82ac28ef9461f04e47f0b0885ee156d926f9 (patch)
tree1bca0a037728a614541ad85290bf64ab12d73ac9 /Projects/XPLAINBridge/XPLAINBridge.c
parent3fd246041b10609a204a6352aa1b86d7000171d4 (diff)
downloadlufa-0bcc82ac28ef9461f04e47f0b0885ee156d926f9.tar.gz
lufa-0bcc82ac28ef9461f04e47f0b0885ee156d926f9.tar.bz2
lufa-0bcc82ac28ef9461f04e47f0b0885ee156d926f9.zip
Alter the ring buffer library headers to have both atomic and non-atomic insertion/removal routines. Modify the existing projects so that buffer operations performed in an ISR use the shorted non-atomic versions, as they are already performed in a blocking ISR.
Alter USBtoSerial demo so that it does not enter a blocking loop to send data from the USB to the USART, as this can cause dropped bytes in the reception code if large amounts of data are sent in both directions at the same time. Added a flush timer to the USBtoSerial code for the USART to USB interface, so that multiple bytes can be sent in the same USB packet.
Diffstat (limited to 'Projects/XPLAINBridge/XPLAINBridge.c')
-rw-r--r--Projects/XPLAINBridge/XPLAINBridge.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/Projects/XPLAINBridge/XPLAINBridge.c b/Projects/XPLAINBridge/XPLAINBridge.c
index 1f0070319..f08dfc5c7 100644
--- a/Projects/XPLAINBridge/XPLAINBridge.c
+++ b/Projects/XPLAINBridge/XPLAINBridge.c
@@ -77,9 +77,6 @@ int main(void)
{
SetupHardware();
- RingBuffer_InitBuffer(&USBtoUART_Buffer);
- RingBuffer_InitBuffer(&UARTtoUSB_Buffer);
-
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
sei();
@@ -124,7 +121,7 @@ void UARTBridge_Task(void)
/* Read bytes from the USB OUT endpoint into the UART transmit buffer */
if (CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface))
- RingBuffer_Insert(&USBtoUART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
+ RingBuffer_AtomicInsert(&USBtoUART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
/* Check if the software UART flush timer has expired */
if (TIFR0 & (1 << TOV0))
@@ -133,7 +130,7 @@ void UARTBridge_Task(void)
/* Read bytes from the UART receive buffer into the USB IN endpoint */
while (UARTtoUSB_Buffer.Count)
- CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&UARTtoUSB_Buffer));
+ CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&UARTtoUSB_Buffer));
}
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
@@ -180,8 +177,12 @@ void EVENT_USB_Device_ConfigurationChanged(void)
{
EndpointConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
- /* Configure the UART flush timer - run at FCPU/1024 for maximum interval before overflow */
+ /* Configure the UART flush timer - run at Fcpu/1024 for maximum interval before overflow */
TCCR0B = ((1 << CS02) | (1 << CS00));
+
+ /* Initialize ring buffers used to hold serial data between USB and software UART interfaces */
+ RingBuffer_InitBuffer(&USBtoUART_Buffer);
+ RingBuffer_InitBuffer(&UARTtoUSB_Buffer);
}
else
{