Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
236 changes: 236 additions & 0 deletions cores/arduino/Uart.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,50 @@
#define NO_CTS_PIN 255
#define RTS_RX_THRESHOLD 10

// Derive SERCOM ISR symbols from PERIPH_SERIAL* tokens (e.g. sercom4 ->
// SERCOM4_Handler) so variants only need to describe the UART routing.
#define UART_SERCOM_INDEX_sercom0 0
#define UART_SERCOM_INDEX_sercom1 1
#define UART_SERCOM_INDEX_sercom2 2
#define UART_SERCOM_INDEX_sercom3 3
#define UART_SERCOM_INDEX_sercom4 4
#define UART_SERCOM_INDEX_sercom5 5
#if defined(SERCOM6)
#define UART_SERCOM_INDEX_sercom6 6
#endif
#if defined(SERCOM7)
#define UART_SERCOM_INDEX_sercom7 7
#endif

#define UART_SERCOM_INDEX(token) UART_SERCOM_INDEX_##token
#define UART_SERCOM_HANDLER_FROM_INDEX(idx) \
UART_SERCOM_HANDLER_FROM_INDEX_2(idx)
#define UART_SERCOM_HANDLER_FROM_INDEX_2(idx) SERCOM##idx##_Handler
#define UART_SERCOM_HANDLER_FROM_TOKEN(token) \
UART_SERCOM_HANDLER_FROM_INDEX(UART_SERCOM_INDEX(token))

#define UART_SERCOM_HANDLER0_FROM_INDEX(idx) \
UART_SERCOM_HANDLER0_FROM_INDEX_2(idx)
#define UART_SERCOM_HANDLER0_FROM_INDEX_2(idx) SERCOM##idx##_0_Handler
#define UART_SERCOM_HANDLER1_FROM_INDEX(idx) \
UART_SERCOM_HANDLER1_FROM_INDEX_2(idx)
#define UART_SERCOM_HANDLER1_FROM_INDEX_2(idx) SERCOM##idx##_1_Handler
#define UART_SERCOM_HANDLER2_FROM_INDEX(idx) \
UART_SERCOM_HANDLER2_FROM_INDEX_2(idx)
#define UART_SERCOM_HANDLER2_FROM_INDEX_2(idx) SERCOM##idx##_2_Handler
#define UART_SERCOM_HANDLER3_FROM_INDEX(idx) \
UART_SERCOM_HANDLER3_FROM_INDEX_2(idx)
#define UART_SERCOM_HANDLER3_FROM_INDEX_2(idx) SERCOM##idx##_3_Handler

#define UART_SERCOM_HANDLER0_FROM_TOKEN(token) \
UART_SERCOM_HANDLER0_FROM_INDEX(UART_SERCOM_INDEX(token))
#define UART_SERCOM_HANDLER1_FROM_TOKEN(token) \
UART_SERCOM_HANDLER1_FROM_INDEX(UART_SERCOM_INDEX(token))
#define UART_SERCOM_HANDLER2_FROM_TOKEN(token) \
UART_SERCOM_HANDLER2_FROM_INDEX(UART_SERCOM_INDEX(token))
#define UART_SERCOM_HANDLER3_FROM_TOKEN(token) \
UART_SERCOM_HANDLER3_FROM_INDEX(UART_SERCOM_INDEX(token))

Uart::Uart(SERCOM *_s, uint8_t _pinRX, uint8_t _pinTX, SercomRXPad _padRX, SercomUartTXPad _padTX) :
Uart(_s, _pinRX, _pinTX, _padRX, _padTX, NO_RTS_PIN, NO_CTS_PIN)
{
Expand Down Expand Up @@ -238,3 +282,195 @@ SercomParityMode Uart::extractParity(uint16_t config)
return SERCOM_ODD_PARITY;
}
}

#if defined(PERIPH_SERIAL) && !defined(UART_VARIANT_OWNS_SERIAL)
Uart Serial(&PERIPH_SERIAL, PIN_SERIAL_RX, PIN_SERIAL_TX, PAD_SERIAL_RX,
PAD_SERIAL_TX);

#ifndef SERIAL_IT_HANDLER
#define SERIAL_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL)
#endif
void SERIAL_IT_HANDLER()
{
Serial.IrqHandler();
}

#ifdef FAMILY_SAMD5X
#ifndef SERIAL_IT_HANDLER_0
#define SERIAL_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL)
#define SERIAL_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL)
#define SERIAL_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL)
#define SERIAL_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL)
#endif
void SERIAL_IT_HANDLER_0() { Serial.IrqHandler(); }
void SERIAL_IT_HANDLER_1() { Serial.IrqHandler(); }
void SERIAL_IT_HANDLER_2() { Serial.IrqHandler(); }
void SERIAL_IT_HANDLER_3() { Serial.IrqHandler(); }
#endif
#endif

#if defined(PERIPH_SERIAL_UART) && !defined(UART_VARIANT_OWNS_SERIAL_UART)
Uart SerialUART(&PERIPH_SERIAL_UART, PIN_SERIAL_UART_RX, PIN_SERIAL_UART_TX,
PAD_SERIAL_UART_RX, PAD_SERIAL_UART_TX);

#ifndef SERIAL_UART_IT_HANDLER
#define SERIAL_UART_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL_UART)
#endif
#ifndef FAMILY_SAMD5X
void SERIAL_UART_IT_HANDLER()
{
SerialUART.IrqHandler();
}
#else
#ifndef SERIAL_UART_IT_HANDLER_0
#define SERIAL_UART_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL_UART)
#define SERIAL_UART_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL_UART)
#define SERIAL_UART_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL_UART)
#define SERIAL_UART_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL_UART)
#endif
void SERIAL_UART_IT_HANDLER_0() { SerialUART.IrqHandler(); }
void SERIAL_UART_IT_HANDLER_1() { SerialUART.IrqHandler(); }
void SERIAL_UART_IT_HANDLER_2() { SerialUART.IrqHandler(); }
void SERIAL_UART_IT_HANDLER_3() { SerialUART.IrqHandler(); }
#endif
#endif

#if defined(PERIPH_SERIAL1) && !defined(UART_VARIANT_OWNS_SERIAL1)
#ifdef PIN_SERIAL1_RTS
Uart Serial1(&PERIPH_SERIAL1, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX,
PAD_SERIAL1_TX, PIN_SERIAL1_RTS, PIN_SERIAL1_CTS);
#else
Uart Serial1(&PERIPH_SERIAL1, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX,
PAD_SERIAL1_TX);
#endif

#ifndef SERIAL1_IT_HANDLER
#define SERIAL1_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL1)
#endif
#ifndef FAMILY_SAMD5X
void SERIAL1_IT_HANDLER()
{
Serial1.IrqHandler();
}
#else
#ifndef SERIAL1_IT_HANDLER_0
#define SERIAL1_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL1)
#define SERIAL1_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL1)
#define SERIAL1_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL1)
#define SERIAL1_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL1)
#endif
void SERIAL1_IT_HANDLER_0() { Serial1.IrqHandler(); }
void SERIAL1_IT_HANDLER_1() { Serial1.IrqHandler(); }
void SERIAL1_IT_HANDLER_2() { Serial1.IrqHandler(); }
void SERIAL1_IT_HANDLER_3() { Serial1.IrqHandler(); }
#endif
#endif

#if defined(PERIPH_SERIAL2) && !defined(UART_VARIANT_OWNS_SERIAL2)
#ifdef PIN_SERIAL2_RTS
Uart Serial2(&PERIPH_SERIAL2, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX,
PAD_SERIAL2_TX, PIN_SERIAL2_RTS, PIN_SERIAL2_CTS);
#else
Uart Serial2(&PERIPH_SERIAL2, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX,
PAD_SERIAL2_TX);
#endif

#ifndef SERIAL2_IT_HANDLER
#define SERIAL2_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL2)
#endif
#ifndef FAMILY_SAMD5X
void SERIAL2_IT_HANDLER()
{
Serial2.IrqHandler();
}
#else
#ifndef SERIAL2_IT_HANDLER_0
#define SERIAL2_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL2)
#define SERIAL2_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL2)
#define SERIAL2_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL2)
#define SERIAL2_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL2)
#endif
void SERIAL2_IT_HANDLER_0() { Serial2.IrqHandler(); }
void SERIAL2_IT_HANDLER_1() { Serial2.IrqHandler(); }
void SERIAL2_IT_HANDLER_2() { Serial2.IrqHandler(); }
void SERIAL2_IT_HANDLER_3() { Serial2.IrqHandler(); }
#endif
#endif

#if defined(PERIPH_SERIAL3) && !defined(UART_VARIANT_OWNS_SERIAL3)
Uart Serial3(&PERIPH_SERIAL3, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX,
PAD_SERIAL3_TX);

#ifndef SERIAL3_IT_HANDLER
#define SERIAL3_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL3)
#endif
#ifndef FAMILY_SAMD5X
void SERIAL3_IT_HANDLER()
{
Serial3.IrqHandler();
}
#else
#ifndef SERIAL3_IT_HANDLER_0
#define SERIAL3_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL3)
#define SERIAL3_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL3)
#define SERIAL3_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL3)
#define SERIAL3_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL3)
#endif
void SERIAL3_IT_HANDLER_0() { Serial3.IrqHandler(); }
void SERIAL3_IT_HANDLER_1() { Serial3.IrqHandler(); }
void SERIAL3_IT_HANDLER_2() { Serial3.IrqHandler(); }
void SERIAL3_IT_HANDLER_3() { Serial3.IrqHandler(); }
#endif
#endif

#if defined(PERIPH_SERIAL4) && !defined(UART_VARIANT_OWNS_SERIAL4)
Uart Serial4(&PERIPH_SERIAL4, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX,
PAD_SERIAL4_TX);

#ifndef SERIAL4_IT_HANDLER
#define SERIAL4_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL4)
#endif
#ifndef FAMILY_SAMD5X
void SERIAL4_IT_HANDLER()
{
Serial4.IrqHandler();
}
#else
#ifndef SERIAL4_IT_HANDLER_0
#define SERIAL4_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL4)
#define SERIAL4_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL4)
#define SERIAL4_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL4)
#define SERIAL4_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL4)
#endif
void SERIAL4_IT_HANDLER_0() { Serial4.IrqHandler(); }
void SERIAL4_IT_HANDLER_1() { Serial4.IrqHandler(); }
void SERIAL4_IT_HANDLER_2() { Serial4.IrqHandler(); }
void SERIAL4_IT_HANDLER_3() { Serial4.IrqHandler(); }
#endif
#endif

#if defined(PERIPH_SERIAL5) && !defined(UART_VARIANT_OWNS_SERIAL5)
Uart Serial5(&PERIPH_SERIAL5, PIN_SERIAL_RX, PIN_SERIAL_TX, PAD_SERIAL_RX,
PAD_SERIAL_TX);

#ifndef SERIAL5_IT_HANDLER
#define SERIAL5_IT_HANDLER UART_SERCOM_HANDLER_FROM_TOKEN(PERIPH_SERIAL5)
#endif
void SERIAL5_IT_HANDLER()
{
Serial5.IrqHandler();
}

#ifdef FAMILY_SAMD5X
#ifndef SERIAL5_IT_HANDLER_0
#define SERIAL5_IT_HANDLER_0 UART_SERCOM_HANDLER0_FROM_TOKEN(PERIPH_SERIAL5)
#define SERIAL5_IT_HANDLER_1 UART_SERCOM_HANDLER1_FROM_TOKEN(PERIPH_SERIAL5)
#define SERIAL5_IT_HANDLER_2 UART_SERCOM_HANDLER2_FROM_TOKEN(PERIPH_SERIAL5)
#define SERIAL5_IT_HANDLER_3 UART_SERCOM_HANDLER3_FROM_TOKEN(PERIPH_SERIAL5)
#endif
void SERIAL5_IT_HANDLER_0() { Serial5.IrqHandler(); }
void SERIAL5_IT_HANDLER_1() { Serial5.IrqHandler(); }
void SERIAL5_IT_HANDLER_2() { Serial5.IrqHandler(); }
void SERIAL5_IT_HANDLER_3() { Serial5.IrqHandler(); }
#endif
#endif
12 changes: 0 additions & 12 deletions variants/arduino_mzero/variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,15 +203,3 @@ SERCOM sercom2( SERCOM2 ) ;
SERCOM sercom3( SERCOM3 ) ;
SERCOM sercom4( SERCOM4 ) ;
SERCOM sercom5( SERCOM5 ) ;

Uart Serial1( &sercom0, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX, PAD_SERIAL1_TX ) ;
Uart Serial( &sercom5, PIN_SERIAL_RX, PIN_SERIAL_TX, PAD_SERIAL_RX, PAD_SERIAL_TX ) ;
void SERCOM0_Handler()
{
Serial1.IrqHandler();
}

void SERCOM5_Handler()
{
Serial.IrqHandler();
}
3 changes: 3 additions & 0 deletions variants/arduino_mzero/variant.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,14 @@ static const uint8_t DAC0 = PIN_DAC0;
#define PIN_SERIAL_TX (35ul)
#define PAD_SERIAL_TX (UART_TX_PAD_2)
#define PAD_SERIAL_RX (SERCOM_RX_PAD_3)
#define PERIPH_SERIAL sercom5

// Serial1
#define PIN_SERIAL1_RX (0ul)
#define PIN_SERIAL1_TX (1ul)
#define PAD_SERIAL1_TX (UART_TX_PAD_2)
#define PAD_SERIAL1_RX (SERCOM_RX_PAD_3)
#define PERIPH_SERIAL1 sercom0

/*
* SPI Interfaces
Expand All @@ -132,6 +134,7 @@ static const uint8_t DAC0 = PIN_DAC0;
#define PERIPH_SPI sercom4
#define PAD_SPI_TX SPI_PAD_2_SCK_3
#define PAD_SPI_RX SERCOM_RX_PAD_0
#define SPI_IT_HANDLER SERCOM4_Handler

static const uint8_t SS = 14; //GND
static const uint8_t MOSI = PIN_SPI_MOSI;
Expand Down
13 changes: 0 additions & 13 deletions variants/arduino_zero/variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,16 +212,3 @@ SERCOM sercom2( SERCOM2 ) ;
SERCOM sercom3( SERCOM3 ) ;
SERCOM sercom4( SERCOM4 ) ;
SERCOM sercom5( SERCOM5 ) ;

Uart Serial1( &sercom0, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX, PAD_SERIAL1_TX ) ;
Uart Serial5( &sercom5, PIN_SERIAL_RX, PIN_SERIAL_TX, PAD_SERIAL_RX, PAD_SERIAL_TX ) ;
void SERCOM0_Handler()
{
Serial1.IrqHandler();
}

void SERCOM5_Handler()
{
Serial5.IrqHandler();
}

3 changes: 3 additions & 0 deletions variants/arduino_zero/variant.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,14 @@ static const uint8_t ATN = PIN_ATN;
#define PIN_SERIAL_TX (30ul)
#define PAD_SERIAL_TX (UART_TX_PAD_2)
#define PAD_SERIAL_RX (SERCOM_RX_PAD_3)
#define PERIPH_SERIAL5 sercom5

// Serial1
#define PIN_SERIAL1_RX (0ul)
#define PIN_SERIAL1_TX (1ul)
#define PAD_SERIAL1_TX (UART_TX_PAD_2)
#define PAD_SERIAL1_RX (SERCOM_RX_PAD_3)
#define PERIPH_SERIAL1 sercom0

/*
* SPI Interfaces
Expand All @@ -139,6 +141,7 @@ static const uint8_t ATN = PIN_ATN;
#define PERIPH_SPI sercom4
#define PAD_SPI_TX SPI_PAD_2_SCK_3
#define PAD_SPI_RX SERCOM_RX_PAD_0
#define SPI_IT_HANDLER SERCOM4_Handler

static const uint8_t SS = PIN_A2 ; // SERCOM4 last PAD is present on A2 but HW SS isn't used. Set here only for reference.
static const uint8_t MOSI = PIN_SPI_MOSI ;
Expand Down
8 changes: 0 additions & 8 deletions variants/blm_badge/variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,3 @@ SERCOM sercom0( SERCOM0 ) ;
SERCOM sercom1( SERCOM1 ) ;
SERCOM sercom2( SERCOM2 ) ;
SERCOM sercom3( SERCOM3 ) ;

Uart Serial1( &sercom0, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX, PAD_SERIAL1_TX ) ;

void SERCOM0_Handler()
{
Serial1.IrqHandler();
}

1 change: 1 addition & 0 deletions variants/blm_badge/variant.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ static const uint8_t DAC0 = PIN_DAC0;
#define PAD_SERIAL1_RX (SERCOM_RX_PAD_2)
#define PIN_SERIAL1_TX (2ul) // captouch pad
#define PAD_SERIAL1_TX (UART_TX_PAD_0)
#define PERIPH_SERIAL1 sercom0

/*
* SPI Interfaces
Expand Down
12 changes: 2 additions & 10 deletions variants/circuitplay/variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ const PinDescription g_APinDescription[]=
{ PORTA, 11, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG), ADC_Channel19, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 }, // A8 / Light Sensor
{ PORTA, 9, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER|PIN_ATTR_ANALOG), ADC_Channel17, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_9 }, // A9 / Thermistor
{ PORTA, 4, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_ANALOG), ADC_Channel4, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_4 }, // A10 Proximity

// GPIO 25 / IR Transmit
{ PORTA, 23, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM4_CH1, TC4_CH1, EXTERNAL_INT_7 }, // GPIO D25 - IR Transmitter
// GPIO 26 / IR Remote in
Expand Down Expand Up @@ -89,7 +89,7 @@ const PinDescription g_APinDescription[]=


// 36..38 - USB
// --------------------
// --------------------
{ PORTA, 22, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // GPIO 29 - Host USB (not used)
{ PORTA, 24, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DM
{ PORTA, 25, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DP
Expand All @@ -111,11 +111,3 @@ SERCOM sercom2( SERCOM2 ) ;
SERCOM sercom3( SERCOM3 ) ;
SERCOM sercom4( SERCOM4 ) ;
SERCOM sercom5( SERCOM5 ) ;

Uart Serial1( &sercom4, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX, PAD_SERIAL1_TX ) ;

void SERCOM4_Handler()
{
Serial1.IrqHandler();
}

Loading
Loading