aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/XPLAINBridge
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-05-26 06:15:05 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-05-26 06:15:05 +0000
commit9c037a952f5aaf78c4e13398506cfa2d588bb449 (patch)
treeee69e6a65a6d81851005c977deceded153d5c2af /Projects/XPLAINBridge
parent4a13a5484ae19974a46d3def668aa888d12b8f13 (diff)
downloadlufa-9c037a952f5aaf78c4e13398506cfa2d588bb449.tar.gz
lufa-9c037a952f5aaf78c4e13398506cfa2d588bb449.tar.bz2
lufa-9c037a952f5aaf78c4e13398506cfa2d588bb449.zip
The RingBuff library code has been replaced in the XPLAINBridge project with an ultra lightweight buffer to help improve the reliability of the bridge.
Diffstat (limited to 'Projects/XPLAINBridge')
-rw-r--r--Projects/XPLAINBridge/Lib/RingBuff.c120
-rw-r--r--Projects/XPLAINBridge/Lib/RingBuff.h116
-rw-r--r--Projects/XPLAINBridge/Lib/SoftUART.c32
-rw-r--r--Projects/XPLAINBridge/Lib/SoftUART.h21
-rw-r--r--Projects/XPLAINBridge/XPLAINBridge.c42
-rw-r--r--Projects/XPLAINBridge/XPLAINBridge.h11
-rw-r--r--Projects/XPLAINBridge/makefile1
7 files changed, 64 insertions, 279 deletions
diff --git a/Projects/XPLAINBridge/Lib/RingBuff.c b/Projects/XPLAINBridge/Lib/RingBuff.c
deleted file mode 100644
index 91c61d06b..000000000
--- a/Projects/XPLAINBridge/Lib/RingBuff.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2010.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, distribute, and sell this
- software and its documentation for any purpose is hereby granted
- without fee, provided that the above copyright notice appear in
- all copies and that both that the copyright notice and this
- permission notice and warranty disclaimer appear in supporting
- documentation, and that the name of the author not be used in
- advertising or publicity pertaining to distribution of the
- software without specific, written prior permission.
-
- The author disclaim all warranties with regard to this
- software, including all implied warranties of merchantability
- and fitness. In no event shall the author be liable for any
- special, indirect or consequential damages or any damages
- whatsoever resulting from loss of use, data or profits, whether
- in an action of contract, negligence or other tortious action,
- arising out of or in connection with the use or performance of
- this software.
-*/
-
-#include "RingBuff.h"
-
-void Buffer_Initialize(RingBuff_t* const Buffer)
-{
- BUFF_ATOMIC_BLOCK
- {
- Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer;
- Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer;
- Buffer->Elements = 0;
- }
-}
-
-void Buffer_StoreElement(RingBuff_t* const Buffer, RingBuff_Data_t Data)
-{
- BUFF_ATOMIC_BLOCK
- {
- #if defined(BUFF_DROPOLD)
- if (Buffer->Elements == BUFF_LENGTH)
- {
- Buffer->OutPtr++;
-
- if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH])
- Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer;
- }
- else
- {
- Buffer->Elements++;
- }
- #elif defined(BUFF_DROPNEW)
- if (Buffer->Elements == BUFF_LENGTH)
- return;
-
- Buffer->Elements++;
- #elif defined(BUFF_NODROPCHECK)
- Buffer->Elements++;
- #endif
-
- *(Buffer->InPtr) = Data;
- Buffer->InPtr++;
-
- if (Buffer->InPtr == &Buffer->Buffer[BUFF_LENGTH])
- Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer;
- }
-}
-
-RingBuff_Data_t Buffer_GetElement(RingBuff_t* const Buffer)
-{
- RingBuff_Data_t BuffData;
-
- BUFF_ATOMIC_BLOCK
- {
-#if defined(BUFF_EMPTYRETURNSZERO)
- if (!(Buffer->Elements))
- return 0;
-#elif !defined(BUFF_NOEMPTYCHECK)
- #error No empty buffer check behavior specified.
-#endif
-
- BuffData = *(Buffer->OutPtr);
-
- Buffer->OutPtr++;
- Buffer->Elements--;
-
- if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH])
- Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer;
- }
-
- return BuffData;
-}
-
-#if defined(BUFF_USEPEEK)
-RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* const Buffer)
-{
- RingBuff_Data_t BuffData;
-
- BUFF_ATOMIC_BLOCK
- {
-#if defined(BUFF_EMPTYRETURNSZERO)
- if (!(Buffer->Elements))
- return 0;
-#elif !defined(BUFF_NOEMPTYCHECK)
- #error No empty buffer check behavior specified.
-#endif
-
- BuffData = *(Buffer->OutPtr);
- }
-
- return BuffData;
-}
-#endif
diff --git a/Projects/XPLAINBridge/Lib/RingBuff.h b/Projects/XPLAINBridge/Lib/RingBuff.h
deleted file mode 100644
index b4933aa4d..000000000
--- a/Projects/XPLAINBridge/Lib/RingBuff.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2010.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, distribute, and sell this
- software and its documentation for any purpose is hereby granted
- without fee, provided that the above copyright notice appear in
- all copies and that both that the copyright notice and this
- permission notice and warranty disclaimer appear in supporting
- documentation, and that the name of the author not be used in
- advertising or publicity pertaining to distribution of the
- software without specific, written prior permission.
-
- The author disclaim all warranties with regard to this
- software, including all implied warranties of merchantability
- and fitness. In no event shall the author be liable for any
- special, indirect or consequential damages or any damages
- whatsoever resulting from loss of use, data or profits, whether
- in an action of contract, negligence or other tortious action,
- arising out of or in connection with the use or performance of
- this software.
-*/
-
-/* Buffer Configuration: */
- /* Buffer length - select static size of created ring buffers: */
- #define BUFF_STATICSIZE 128 // Set to the static ring buffer size for all ring buffers (place size after define)
-
- /* Volatile mode - uncomment to make buffers volatile, for use in ISRs, etc: */
- #define BUFF_VOLATILE // Uncomment to cause all ring buffers to become volatile (and atomic if multi-byte) in access
-
- /* Drop mode - select behaviour when Buffer_StoreElement called on a full buffer: */
- #define BUFF_DROPOLD // Uncomment to cause full ring buffers to drop the oldest character to make space when full
- // #define BUFF_DROPNEW // Uncomment to cause full ring buffers to drop the new character when full
- // #define BUFF_NODROPCHECK // Uncomment to ignore full ring buffer checks - checking left to user!
-
- /* Underflow behaviour - select behaviour when Buffer_GetElement is called with an empty ring buffer: */
- //#define BUFF_EMPTYRETURNSZERO // Uncomment to return 0 when an empty ring buffer is read
- #define BUFF_NOEMPTYCHECK // Uncomment to disable checking of empty ring buffers - checking left to user!
-
- /* Buffer storage type - set the datatype for the stored data */
- #define BUFF_DATATYPE uint8_t // Change to the data type that is going to be stored into the buffer
-
- /* Peek routine - uncomment to include the peek routine (fetches next byte without removing it from the buffer */
- //#define BUFF_USEPEEK
-
-#ifndef _RINGBUFF_H_
-#define _RINGBUFF_H_
-
- /* Includes: */
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/atomic.h>
- #include <limits.h>
-
- #include <LUFA/Common/Common.h>
-
- /* Defines and checks: */
- #if defined(BUFF_STATICSIZE)
- #define BUFF_LENGTH BUFF_STATICSIZE
- #else
- #error No buffer length specified!
- #endif
-
- #if !(defined(BUFF_DROPOLD) || defined(BUFF_DROPNEW) || defined(BUFF_NODROPCHECK))
- #error No buffer drop mode specified.
- #endif
-
- #if !defined(BUFF_DATATYPE)
- #error Ringbuffer storage data type not specified.
- #endif
-
- #if defined(BUFF_VOLATILE)
- #define BUFF_MODE volatile
- #define BUFF_ATOMIC_BLOCK ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
- #else
- #define BUFF_MODE
- #define BUFF_ATOMIC_BLOCK
- #endif
-
- #if (BUFF_STATICSIZE > LONG_MAX)
- #define RingBuff_Elements_t uint64_t
- #elif (BUFF_STATICSIZE > INT_MAX)
- #define RingBuff_Elements_t uint32_t
- #elif (BUFF_STATICSIZE > CHAR_MAX)
- #define RingBuff_Elements_t uint16_t
- #else
- #define RingBuff_Elements_t uint8_t
- #endif
-
- /* Type Defines: */
- typedef BUFF_DATATYPE RingBuff_Data_t;
-
- typedef BUFF_MODE struct
- {
- RingBuff_Data_t Buffer[BUFF_LENGTH];
- RingBuff_Data_t* InPtr;
- RingBuff_Data_t* OutPtr;
- RingBuff_Elements_t Elements;
- } RingBuff_t;
-
- /* Function Prototypes: */
- void Buffer_Initialize(RingBuff_t* const Buff);
- void Buffer_StoreElement(RingBuff_t* const Buffer, RingBuff_Data_t Data);
- RingBuff_Data_t Buffer_GetElement(RingBuff_t* const Buffer);
- #if defined(BUFF_USEPEEK)
- RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* const Buffer);
- #endif
-
-#endif
diff --git a/Projects/XPLAINBridge/Lib/SoftUART.c b/Projects/XPLAINBridge/Lib/SoftUART.c
index 194481d0e..5e589f3d7 100644
--- a/Projects/XPLAINBridge/Lib/SoftUART.c
+++ b/Projects/XPLAINBridge/Lib/SoftUART.c
@@ -32,34 +32,22 @@
#include "SoftUART.h"
-volatile uint8_t srx_done, stx_count;
-volatile uint8_t srx_data, srx_mask, srx_tmp, stx_data;
+volatile bool srx_done;
+volatile uint8_t stx_count;
+static uint8_t srx_data, srx_mask, srx_tmp, stx_data;
-uint8_t SoftUART_IsReady(void)
-{
- return !(stx_count);
-}
-
-uint8_t SoftUART_TxByte(uint8_t Byte)
+void SoftUART_TxByte(uint8_t Byte)
{
while (stx_count);
stx_data = ~Byte;
stx_count = 10;
-
- return Byte;
-}
-
-uint8_t SoftUART_IsReceived(void)
-{
- return srx_done;
}
uint8_t SoftUART_RxByte(void)
{
while (!(srx_done));
-
- srx_done = 0;
+ srx_done = false;
return srx_data;
}
@@ -74,9 +62,9 @@ void SoftUART_Init(void)
EIMSK = (1 << INT0); // enable INT0 interrupt
stx_count = 0; // nothing to send
- srx_done = 0; // nothing received
- STXPORT |= 1 << STX; // TX output
- STXDDR |= 1 << STX; // TX output
+ srx_done = false; // nothing received
+ STXPORT |= (1 << STX); // TX output
+ STXDDR |= (1 << STX); // TX output
SRXPORT |= (1 << SRX); // pullup on INT0
}
@@ -85,7 +73,7 @@ ISR(INT0_vect)
{
OCR2A = TCNT2 + (BIT_TIME / 8 * 3 / 2); // scan 1.5 bits after start
- srx_tmp = 0; // clear bit storage
+ srx_tmp = 0; // clear bit storage
srx_mask = 1; // bit mask
TIFR2 = (1 << OCF2A); // clear pending interrupt
@@ -111,7 +99,7 @@ ISR(TIMER2_COMPA_vect)
}
else
{
- srx_done = 1; // mark rx data valid
+ srx_done = true; // mark rx data valid
srx_data = srx_tmp; // store rx data
TIMSK2 = (1 << OCIE2B); // enable tx and wait for start
EIMSK |= (1 << INT0); // enable START irq
diff --git a/Projects/XPLAINBridge/Lib/SoftUART.h b/Projects/XPLAINBridge/Lib/SoftUART.h
index 07187c24a..416490d8d 100644
--- a/Projects/XPLAINBridge/Lib/SoftUART.h
+++ b/Projects/XPLAINBridge/Lib/SoftUART.h
@@ -36,7 +36,7 @@
/* Includes: */
#include <avr/io.h>
#include <avr/interrupt.h>
- #include "SoftUART.h"
+ #include <stdbool.h>
/* Macros: */
#define BAUD 9600
@@ -50,10 +50,23 @@
#define STXPORT PORTD
#define STXDDR DDRD
+ /* External Variables: */
+ extern volatile bool srx_done;
+ extern volatile uint8_t stx_count;
+
+ /* Inline Functions: */
+ static inline bool SoftUART_IsReady(void)
+ {
+ return !(stx_count);
+ }
+
+ static inline bool SoftUART_IsReceived(void)
+ {
+ return srx_done;
+ }
+
/* Function Prototypes: */
- uint8_t SoftUART_IsReady(void);
- uint8_t SoftUART_TxByte(uint8_t c);
- uint8_t SoftUART_IsReceived(void);
+ void SoftUART_TxByte(uint8_t c);
uint8_t SoftUART_RxByte(void);
void SoftUART_Init(void);
diff --git a/Projects/XPLAINBridge/XPLAINBridge.c b/Projects/XPLAINBridge/XPLAINBridge.c
index ef311d060..ce23862dd 100644
--- a/Projects/XPLAINBridge/XPLAINBridge.c
+++ b/Projects/XPLAINBridge/XPLAINBridge.c
@@ -62,7 +62,7 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
.NotificationEndpointDoubleBank = false,
},
};
-
+
/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */
RingBuff_t USBtoUART_Buffer;
@@ -77,9 +77,11 @@ int main(void)
{
SetupHardware();
- Buffer_Initialize(&USBtoUART_Buffer);
- Buffer_Initialize(&UARTtoUSB_Buffer);
-
+ USBtoUART_Buffer.In = USBtoUART_Buffer.Buffer;
+ USBtoUART_Buffer.Out = USBtoUART_Buffer.Buffer;
+ UARTtoUSB_Buffer.In = UARTtoUSB_Buffer.Buffer;
+ UARTtoUSB_Buffer.Out = UARTtoUSB_Buffer.Buffer;
+
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
sei();
@@ -123,23 +125,35 @@ void USARTBridge_Task(void)
/* Read bytes from the USB OUT endpoint into the UART transmit buffer */
for (uint8_t DataBytesRem = CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface); DataBytesRem != 0; DataBytesRem--)
{
- if (!(BUFF_STATICSIZE - USBtoUART_Buffer.Elements))
- break;
-
- Buffer_StoreElement(&USBtoUART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
+ *USBtoUART_Buffer.In = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
+
+ if (++USBtoUART_Buffer.In == &USBtoUART_Buffer.Buffer[128])
+ USBtoUART_Buffer.In = USBtoUART_Buffer.Buffer;
}
/* Read bytes from the UART receive buffer into the USB IN endpoint */
- if (UARTtoUSB_Buffer.Elements)
- CDC_Device_SendByte(&VirtualSerial_CDC_Interface, Buffer_GetElement(&UARTtoUSB_Buffer));
+ if (UARTtoUSB_Buffer.In != UARTtoUSB_Buffer.Out)
+ {
+ CDC_Device_SendByte(&VirtualSerial_CDC_Interface, *UARTtoUSB_Buffer.Out);
+ if (++UARTtoUSB_Buffer.Out == &UARTtoUSB_Buffer.Buffer[128])
+ UARTtoUSB_Buffer.Out = UARTtoUSB_Buffer.Buffer;
+ }
/* Load bytes from the UART transmit buffer into the UART */
- if ((USBtoUART_Buffer.Elements) && SoftUART_IsReady())
- SoftUART_TxByte(Buffer_GetElement(&USBtoUART_Buffer));
+ if ((USBtoUART_Buffer.In != USBtoUART_Buffer.Out) && SoftUART_IsReady())
+ {
+ SoftUART_TxByte(*USBtoUART_Buffer.Out);
+ if (++USBtoUART_Buffer.Out == &USBtoUART_Buffer.Buffer[128])
+ USBtoUART_Buffer.Out = USBtoUART_Buffer.Buffer;
+ }
/* Load bytes from the UART into the UART receive buffer */
if (SoftUART_IsReceived())
- Buffer_StoreElement(&UARTtoUSB_Buffer, SoftUART_RxByte());
+ {
+ *UARTtoUSB_Buffer.In = SoftUART_RxByte();
+ if (++UARTtoUSB_Buffer.In == &UARTtoUSB_Buffer.Buffer[128])
+ UARTtoUSB_Buffer.In = UARTtoUSB_Buffer.Buffer;
+ }
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
}
@@ -169,7 +183,7 @@ void SetupHardware(void)
_delay_ms(10);
/* Select the firmware mode based on the JTD pin's value */
- CurrentFirmwareMode = (PINF & (1 << 7)) ? MODE_USART_BRIDGE : MODE_PDI_PROGRAMMER;
+ CurrentFirmwareMode = MODE_USART_BRIDGE; // TEMP (PINF & (1 << 7)) ? MODE_USART_BRIDGE : MODE_PDI_PROGRAMMER;
/* Re-enable JTAG debugging */
MCUCR &= ~(1 << JTD);
diff --git a/Projects/XPLAINBridge/XPLAINBridge.h b/Projects/XPLAINBridge/XPLAINBridge.h
index 9c90a8b3d..2fa84d3f3 100644
--- a/Projects/XPLAINBridge/XPLAINBridge.h
+++ b/Projects/XPLAINBridge/XPLAINBridge.h
@@ -45,7 +45,6 @@
#include "AVRISPDescriptors.h"
#include "USARTDescriptors.h"
- #include "Lib/RingBuff.h"
#include "Lib/SoftUART.h"
#include <Lib/V2Protocol.h>
@@ -74,7 +73,15 @@
#define MODE_USART_BRIDGE false
/** Firmware mode define for the AVRISP Programmer mode. */
- #define MODE_PDI_PROGRAMMER true
+ #define MODE_PDI_PROGRAMMER true
+
+ /* Type Defines: */
+ typedef struct
+ {
+ uint8_t Buffer[128];
+ uint8_t* In;
+ uint8_t* Out;
+ } RingBuff_t;
/* External Variables: */
extern bool CurrentFirmwareMode;
diff --git a/Projects/XPLAINBridge/makefile b/Projects/XPLAINBridge/makefile
index 36f5c494d..c68c91da1 100644
--- a/Projects/XPLAINBridge/makefile
+++ b/Projects/XPLAINBridge/makefile
@@ -129,7 +129,6 @@ LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENAB
SRC = $(TARGET).c \
AVRISPDescriptors.c \
USARTDescriptors.c \
- Lib/RingBuff.c \
Lib/SoftUART.c \
$(AVRISP_PATH)/Lib/V2Protocol.c \
$(AVRISP_PATH)/Lib/V2ProtocolParams.c \