diff options
-rw-r--r-- | LUFA/ManPages/ChangeLog.txt | 1 | ||||
-rw-r--r-- | Projects/Benito/Benito.c | 2 | ||||
-rw-r--r-- | Projects/Benito/Lib/LightweightRingBuff.h | 41 | ||||
-rw-r--r-- | Projects/USBtoSerial/Lib/LightweightRingBuff.h | 41 | ||||
-rw-r--r-- | Projects/USBtoSerial/USBtoSerial.c | 23 | ||||
-rw-r--r-- | Projects/XPLAINBridge/Lib/LightweightRingBuff.h | 41 | ||||
-rw-r--r-- | Projects/XPLAINBridge/XPLAINBridge.c | 13 |
7 files changed, 136 insertions, 26 deletions
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 8164f3084..bff555fc4 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -28,6 +28,7 @@ * - Rewrote the implementation of the SwapEndian_16() and SwapEndian_32() functions so that they compile down in most instances to * minimal loads and stores rather than complicated shifts * - The software UART in the XPLAINBridge has been largely altered to try to improve upon its performance and reliability + * - The USBtoSerial project now flushes received data via a flush timer, so that several bytes can be transmitted at once * * <b>Fixed:</b> * - Fixed AVRISP project sending a LOAD EXTENDED ADDRESS command to 128KB AVRs after programming or reading from diff --git a/Projects/Benito/Benito.c b/Projects/Benito/Benito.c index 3b3a39860..32c663cb6 100644 --- a/Projects/Benito/Benito.c +++ b/Projects/Benito/Benito.c @@ -100,7 +100,7 @@ int main(void) /* Echo bytes from the target to the host via the virtual serial port */ while (Tx_Buffer.Count) { - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&Tx_Buffer)); + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&Tx_Buffer)); LEDs_TurnOnLEDs(LEDMASK_RX); PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; diff --git a/Projects/Benito/Lib/LightweightRingBuff.h b/Projects/Benito/Lib/LightweightRingBuff.h index 1dc05935c..9c25707b4 100644 --- a/Projects/Benito/Lib/LightweightRingBuff.h +++ b/Projects/Benito/Lib/LightweightRingBuff.h @@ -75,12 +75,12 @@ Buffer->Count = 0; } - /** Inserts an element into the ring buffer. + /** Atomically inserts an element into the ring buffer. * * \param[in,out] Buffer Pointer to a ring buffer structure to insert into * \param[in] Data Data element to insert into the buffer */ - static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data) + static inline void RingBuffer_AtomicInsert(RingBuff_t* const Buffer, RingBuff_Data_t Data) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { @@ -93,13 +93,13 @@ } } - /** Retrieves an element from the ring buffer. + /** Atomically retrieves an element from the ring buffer. * * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from * * \return Next data element stored in the buffer */ - static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + static inline RingBuff_Data_t RingBuffer_AtomicRemove(RingBuff_t* const Buffer) { RingBuff_Data_t Data; @@ -116,5 +116,38 @@ return Data; } + /** Inserts an element into the ring buffer. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * \param[in] Data Data element to insert into the buffer + */ + static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data) + { + *Buffer->In = Data; + + if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->In = Buffer->Buffer; + + Buffer->Count++; + } + + /** Retrieves an element from the ring buffer. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from + * + * \return Next data element stored in the buffer + */ + static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + { + RingBuff_Data_t Data = *Buffer->Out; + + if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->Out = Buffer->Buffer; + + Buffer->Count--; + + return Data; + } + #endif
\ No newline at end of file diff --git a/Projects/USBtoSerial/Lib/LightweightRingBuff.h b/Projects/USBtoSerial/Lib/LightweightRingBuff.h index 1dc05935c..9c25707b4 100644 --- a/Projects/USBtoSerial/Lib/LightweightRingBuff.h +++ b/Projects/USBtoSerial/Lib/LightweightRingBuff.h @@ -75,12 +75,12 @@ Buffer->Count = 0; } - /** Inserts an element into the ring buffer. + /** Atomically inserts an element into the ring buffer. * * \param[in,out] Buffer Pointer to a ring buffer structure to insert into * \param[in] Data Data element to insert into the buffer */ - static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data) + static inline void RingBuffer_AtomicInsert(RingBuff_t* const Buffer, RingBuff_Data_t Data) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { @@ -93,13 +93,13 @@ } } - /** Retrieves an element from the ring buffer. + /** Atomically retrieves an element from the ring buffer. * * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from * * \return Next data element stored in the buffer */ - static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + static inline RingBuff_Data_t RingBuffer_AtomicRemove(RingBuff_t* const Buffer) { RingBuff_Data_t Data; @@ -116,5 +116,38 @@ return Data; } + /** Inserts an element into the ring buffer. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * \param[in] Data Data element to insert into the buffer + */ + static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data) + { + *Buffer->In = Data; + + if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->In = Buffer->Buffer; + + Buffer->Count++; + } + + /** Retrieves an element from the ring buffer. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from + * + * \return Next data element stored in the buffer + */ + static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + { + RingBuff_Data_t Data = *Buffer->Out; + + if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->Out = Buffer->Buffer; + + Buffer->Count--; + + return Data; + } + #endif
\ No newline at end of file diff --git a/Projects/USBtoSerial/USBtoSerial.c b/Projects/USBtoSerial/USBtoSerial.c index 7a0f6866a..918986883 100644 --- a/Projects/USBtoSerial/USBtoSerial.c +++ b/Projects/USBtoSerial/USBtoSerial.c @@ -87,16 +87,22 @@ int main(void) if (!(BUFFER_SIZE - USBtoUSART_Buffer.Count)) break; - RingBuffer_Insert(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface)); + RingBuffer_AtomicInsert(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface)); } - /* Read bytes from the USART receive buffer into the USB IN endpoint */ - while (USARTtoUSB_Buffer.Count) - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); + /* Check if the software USART flush timer has expired */ + if (TIFR0 & (1 << TOV0)) + { + TIFR0 |= (1 << TOV0); + + /* Read bytes from the USART receive buffer into the USB IN endpoint */ + while (USARTtoUSB_Buffer.Count) + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&USARTtoUSB_Buffer)); + } - /* Load bytes from the USART transmit buffer into the USART */ - while (USBtoUSART_Buffer.Count) - Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); + /* Load the next byte from the USART transmit buffer into the USART */ + if (USBtoUSART_Buffer.Count) + Serial_TxByte(RingBuffer_AtomicRemove(&USBtoUSART_Buffer)); CDC_Device_USBTask(&VirtualSerial_CDC_Interface); USB_USBTask(); @@ -117,6 +123,9 @@ void SetupHardware(void) Serial_Init(9600, false); LEDs_Init(); USB_Init(); + + /* Configure the UART flush timer - run at Fcpu/1024 for maximum interval before overflow */ + TCCR0B = ((1 << CS02) | (1 << CS00)); } /** Event handler for the library USB Connection event. */ diff --git a/Projects/XPLAINBridge/Lib/LightweightRingBuff.h b/Projects/XPLAINBridge/Lib/LightweightRingBuff.h index 1dc05935c..9c25707b4 100644 --- a/Projects/XPLAINBridge/Lib/LightweightRingBuff.h +++ b/Projects/XPLAINBridge/Lib/LightweightRingBuff.h @@ -75,12 +75,12 @@ Buffer->Count = 0; } - /** Inserts an element into the ring buffer. + /** Atomically inserts an element into the ring buffer. * * \param[in,out] Buffer Pointer to a ring buffer structure to insert into * \param[in] Data Data element to insert into the buffer */ - static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data) + static inline void RingBuffer_AtomicInsert(RingBuff_t* const Buffer, RingBuff_Data_t Data) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { @@ -93,13 +93,13 @@ } } - /** Retrieves an element from the ring buffer. + /** Atomically retrieves an element from the ring buffer. * * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from * * \return Next data element stored in the buffer */ - static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + static inline RingBuff_Data_t RingBuffer_AtomicRemove(RingBuff_t* const Buffer) { RingBuff_Data_t Data; @@ -116,5 +116,38 @@ return Data; } + /** Inserts an element into the ring buffer. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * \param[in] Data Data element to insert into the buffer + */ + static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data) + { + *Buffer->In = Data; + + if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->In = Buffer->Buffer; + + Buffer->Count++; + } + + /** Retrieves an element from the ring buffer. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from + * + * \return Next data element stored in the buffer + */ + static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + { + RingBuff_Data_t Data = *Buffer->Out; + + if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->Out = Buffer->Buffer; + + Buffer->Count--; + + return Data; + } + #endif
\ No newline at end of file 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 { |