From e50885a6f2ac2752e1f8c64d20acc7776d355779 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 15 Oct 2021 21:20:45 +0200 Subject: [PATCH] sam: simplify definition of SERCOM UART peripherals Instead of defining them separately for each board, define them once in the chip definition and later simply use &sercomUART1 etc. to refer to them. This is simpler and less error-prone. I found two bugs while working on this: - The P1AM-100 board mixed SERCOM 5 and SERCOM 3. It looks like SERCOM 5 was intended, based on the used pins. - The Adafruit Matrix Portal appears to have configured the wrong interrupt. Unfortunately, I can't test these fixes. However, they make it clear that such a change is important to avoid bugs. I tested this commit on the PyBadge and the Circuit Playground Express. --- src/machine/board_arduino_mkrwifi1010.go | 14 +------ src/machine/board_arduino_nano33.go | 6 +++ src/machine/board_arduino_nano33_baremetal.go | 26 ------------ src/machine/board_atsame54-xpro.go | 36 ++--------------- src/machine/board_circuitplay_express.go | 7 ++++ .../board_circuitplay_express_baremetal.go | 19 --------- src/machine/board_feather-m0.go | 14 +------ src/machine/board_feather-m4-can.go | 18 +-------- src/machine/board_feather-m4.go | 7 ++++ src/machine/board_feather-m4_baremetal.go | 26 ------------ src/machine/board_grandcentral-m4.go | 10 +++++ .../board_grandcentral-m4_baremetal.go | 40 ------------------- src/machine/board_itsybitsy-m0.go | 12 +----- src/machine/board_itsybitsy-m4.go | 7 ++++ src/machine/board_itsybitsy-m4_baremetal.go | 26 ------------ src/machine/board_matrixportal-m4.go | 8 ++++ .../board_matrixportal-m4_baremetal.go | 27 ------------- src/machine/board_metro-m4-airlift.go | 7 ++++ .../board_metro-m4-airlift_baremetal.go | 26 ------------ src/machine/board_p1am-100.go | 3 ++ src/machine/board_p1am-100_baremetal.go | 15 ------- src/machine/board_pybadge.go | 7 ++++ src/machine/board_pybadge_baremetal.go | 26 ------------ src/machine/board_pyportal.go | 6 +++ src/machine/board_pyportal_baremetal.go | 18 --------- src/machine/board_qtpy.go | 14 +------ src/machine/board_trinket.go | 14 +------ src/machine/board_wioterminal.go | 7 ++++ src/machine/board_wioterminal_baremetal.go | 23 ----------- src/machine/board_xiao.go | 14 +------ src/machine/machine_atsamd21.go | 8 ++-- src/machine/machine_atsamd21e18.go | 15 +++++++ src/machine/machine_atsamd21g18.go | 19 +++++++++ src/machine/machine_atsamd51.go | 22 +++++++++- src/machine/machine_generic.go | 11 +++++ 35 files changed, 156 insertions(+), 402 deletions(-) diff --git a/src/machine/board_arduino_mkrwifi1010.go b/src/machine/board_arduino_mkrwifi1010.go index e9df43cb9..e8cf76ab5 100644 --- a/src/machine/board_arduino_mkrwifi1010.go +++ b/src/machine/board_arduino_mkrwifi1010.go @@ -8,7 +8,6 @@ package machine import ( "device/sam" - "runtime/interrupt" ) // used to reset into bootloader @@ -98,18 +97,7 @@ const ( ) // UART on the Arduino MKR WiFi 1010. -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM5_USART, - SERCOM: 5, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM5, _UART1.handleInterrupt) -} +var UART1 = &sercomUSART5 // I2C on the Arduino MKR WiFi 1010. var ( diff --git a/src/machine/board_arduino_nano33.go b/src/machine/board_arduino_nano33.go index 606f5e63a..ae4a7cd87 100644 --- a/src/machine/board_arduino_nano33.go +++ b/src/machine/board_arduino_nano33.go @@ -58,6 +58,12 @@ const ( UART_RX_PIN Pin = PA23 ) +// UART1 on the Arduino Nano 33 connects to the onboard NINA-W102 WiFi chip. +var UART1 = &sercomUSART3 + +// UART2 on the Arduino Nano 33 connects to the normal TX/RX pins. +var UART2 = &sercomUSART5 + // I2C pins const ( SDA_PIN Pin = A4 // SDA: SERCOM4/PAD[1] diff --git a/src/machine/board_arduino_nano33_baremetal.go b/src/machine/board_arduino_nano33_baremetal.go index 79e62d243..708698e4a 100644 --- a/src/machine/board_arduino_nano33_baremetal.go +++ b/src/machine/board_arduino_nano33_baremetal.go @@ -4,34 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -// UART1 on the Arduino Nano 33 connects to the onboard NINA-W102 WiFi chip. -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM3_USART, - SERCOM: 3, - } -) - -// UART2 on the Arduino Nano 33 connects to the normal TX/RX pins. -var ( - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM5_USART, - SERCOM: 5, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM3, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM5, _UART2.handleInterrupt) -} - // I2C on the Arduino Nano 33. var ( I2C0 = &I2C{ diff --git a/src/machine/board_atsame54-xpro.go b/src/machine/board_atsame54-xpro.go index c61324b64..92d1d7134 100644 --- a/src/machine/board_atsame54-xpro.go +++ b/src/machine/board_atsame54-xpro.go @@ -4,7 +4,6 @@ package machine import ( "device/sam" - "runtime/interrupt" ) // Definition for compatibility, but not used @@ -240,45 +239,18 @@ var ( // UART on the SAM E54 Xplained Pro var ( // Extension Header EXT1 - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM0_USART_INT, - SERCOM: 0, - } + UART1 = &sercomUSART0 // Extension Header EXT2 - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM5_USART_INT, - SERCOM: 5, - } + UART2 = &sercomUSART5 // Extension Header EXT3 - UART3 = &_UART3 - _UART3 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM1_USART_INT, - SERCOM: 1, - } + UART3 = &sercomUSART1 // EDBG Virtual COM Port - UART4 = &_UART4 - _UART4 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM2_USART_INT, - SERCOM: 2, - } + UART4 = &sercomUSART2 ) -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM5_2, _UART2.handleInterrupt) - UART3.Interrupt = interrupt.New(sam.IRQ_SERCOM1_2, _UART3.handleInterrupt) - UART4.Interrupt = interrupt.New(sam.IRQ_SERCOM2_2, _UART4.handleInterrupt) -} - // I2C on the SAM E54 Xplained Pro var ( // Extension Header EXT1 diff --git a/src/machine/board_circuitplay_express.go b/src/machine/board_circuitplay_express.go index ad49c24bb..e39784e01 100644 --- a/src/machine/board_circuitplay_express.go +++ b/src/machine/board_circuitplay_express.go @@ -67,6 +67,13 @@ const ( UART_RX_PIN = PB09 // PORTB ) +// UART1 on the Circuit Playground Express. +var ( + UART1 = &sercomUSART4 + + DefaultUART = UART1 +) + // I2C pins const ( SDA_PIN = PB02 // I2C0 external diff --git a/src/machine/board_circuitplay_express_baremetal.go b/src/machine/board_circuitplay_express_baremetal.go index b9c41cf2e..cc5f2a62e 100644 --- a/src/machine/board_circuitplay_express_baremetal.go +++ b/src/machine/board_circuitplay_express_baremetal.go @@ -4,23 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -// UART1 on the Circuit Playground Express. -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM4_USART, - SERCOM: 4, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM4, _UART1.handleInterrupt) -} - // I2C on the Circuit Playground Express. var ( // external device @@ -47,7 +32,3 @@ var ( var ( I2S0 = I2S{Bus: sam.I2S} ) - -var ( - DefaultUART = UART1 -) diff --git a/src/machine/board_feather-m0.go b/src/machine/board_feather-m0.go index 17afc1ecf..91e238832 100644 --- a/src/machine/board_feather-m0.go +++ b/src/machine/board_feather-m0.go @@ -4,7 +4,6 @@ package machine import ( "device/sam" - "runtime/interrupt" ) // used to reset into bootloader @@ -55,18 +54,7 @@ const ( ) // UART1 on the Feather M0. -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM1_USART, - SERCOM: 1, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM1, _UART1.handleInterrupt) -} +var UART1 = &sercomUSART1 // I2C pins const ( diff --git a/src/machine/board_feather-m4-can.go b/src/machine/board_feather-m4-can.go index eebc3dd41..df2327d5a 100644 --- a/src/machine/board_feather-m4-can.go +++ b/src/machine/board_feather-m4-can.go @@ -4,7 +4,6 @@ package machine import ( "device/sam" - "runtime/interrupt" ) // used to reset into bootloader @@ -104,25 +103,12 @@ var ( ) var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM5_USART_INT, - SERCOM: 5, - } + UART1 = &sercomUSART5 - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM0_USART_INT, - SERCOM: 0, - } + UART2 = &sercomUSART0 ) func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM5_2, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, _UART2.handleInterrupt) - // turn on neopixel D7.Configure(PinConfig{Mode: PinOutput}) D7.High() diff --git a/src/machine/board_feather-m4.go b/src/machine/board_feather-m4.go index 86158ed64..b8a3854db 100644 --- a/src/machine/board_feather-m4.go +++ b/src/machine/board_feather-m4.go @@ -56,6 +56,13 @@ const ( UART2_RX_PIN = A5 ) +var ( + UART1 = &sercomUSART5 + UART2 = &sercomUSART0 + + DefaultUART = UART1 +) + // I2C pins const ( SDA_PIN = D22 // SDA: SERCOM2/PAD[0] diff --git a/src/machine/board_feather-m4_baremetal.go b/src/machine/board_feather-m4_baremetal.go index ec243f432..005de851e 100644 --- a/src/machine/board_feather-m4_baremetal.go +++ b/src/machine/board_feather-m4_baremetal.go @@ -4,30 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM5_USART_INT, - SERCOM: 5, - } - - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM0_USART_INT, - SERCOM: 0, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM5_2, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, _UART2.handleInterrupt) -} - // I2C on the Feather M4. var ( I2C0 = &I2C{ @@ -43,7 +21,3 @@ var ( SERCOM: 1, } ) - -var ( - DefaultUART = UART1 -) diff --git a/src/machine/board_grandcentral-m4.go b/src/machine/board_grandcentral-m4.go index c1b629c9e..9e8e56d0a 100644 --- a/src/machine/board_grandcentral-m4.go +++ b/src/machine/board_grandcentral-m4.go @@ -160,6 +160,16 @@ const ( UART_TX_PIN = UART1_TX_PIN // ) +// UART on the Grand Central M4 +var ( + UART1 = &sercomUSART0 + UART2 = &sercomUSART4 + UART3 = &sercomUSART1 + UART4 = &sercomUSART5 + + DefaultUART = UART1 +) + // SPI pins const ( SPI0_SCK_PIN = D66 // (PD09), also on D52 diff --git a/src/machine/board_grandcentral-m4_baremetal.go b/src/machine/board_grandcentral-m4_baremetal.go index 6f0235f9a..e862b29f8 100644 --- a/src/machine/board_grandcentral-m4_baremetal.go +++ b/src/machine/board_grandcentral-m4_baremetal.go @@ -4,42 +4,6 @@ package machine import ( "device/sam" - "runtime/interrupt" -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM4_2, _UART2.handleInterrupt) - UART3.Interrupt = interrupt.New(sam.IRQ_SERCOM1_2, _UART3.handleInterrupt) - UART4.Interrupt = interrupt.New(sam.IRQ_SERCOM5_2, _UART4.handleInterrupt) -} - -// UART on the Grand Central M4 -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM0_USART_INT, - SERCOM: 0, - } - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM4_USART_INT, - SERCOM: 4, - } - UART3 = &_UART3 - _UART3 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM1_USART_INT, - SERCOM: 1, - } - UART4 = &_UART4 - _UART4 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM5_USART_INT, - SERCOM: 5, - } ) // I2C on the Grand Central M4 @@ -65,7 +29,3 @@ var ( SERCOM: 2, } ) - -var ( - DefaultUART = UART1 -) diff --git a/src/machine/board_itsybitsy-m0.go b/src/machine/board_itsybitsy-m0.go index 788fcef4a..828b46201 100644 --- a/src/machine/board_itsybitsy-m0.go +++ b/src/machine/board_itsybitsy-m0.go @@ -4,7 +4,6 @@ package machine import ( "device/sam" - "runtime/interrupt" ) // used to reset into bootloader @@ -56,18 +55,9 @@ const ( // UART1 on the ItsyBitsy M0. var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM1_USART, - SERCOM: 1, - } + UART1 = &sercomUSART1 ) -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM1, _UART1.handleInterrupt) -} - // I2C pins const ( SDA_PIN = PA22 // SDA: SERCOM3/PAD[0] diff --git a/src/machine/board_itsybitsy-m4.go b/src/machine/board_itsybitsy-m4.go index 099ceed46..e3ad2164a 100644 --- a/src/machine/board_itsybitsy-m4.go +++ b/src/machine/board_itsybitsy-m4.go @@ -54,6 +54,13 @@ const ( UART2_RX_PIN = D2 ) +var ( + UART1 = &sercomUSART3 + UART2 = &sercomUSART0 + + DefaultUART = UART1 +) + // I2C pins const ( SDA_PIN = PA12 // SDA: SERCOM2/PAD[0] diff --git a/src/machine/board_itsybitsy-m4_baremetal.go b/src/machine/board_itsybitsy-m4_baremetal.go index b555525c0..0e779a2a5 100644 --- a/src/machine/board_itsybitsy-m4_baremetal.go +++ b/src/machine/board_itsybitsy-m4_baremetal.go @@ -4,30 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM3_USART_INT, - SERCOM: 3, - } - - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM0_USART_INT, - SERCOM: 0, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM3_2, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, _UART2.handleInterrupt) -} - // I2C on the ItsyBitsy M4. var ( I2C0 = &I2C{ @@ -43,7 +21,3 @@ var ( SERCOM: 1, } ) - -var ( - DefaultUART = UART1 -) diff --git a/src/machine/board_matrixportal-m4.go b/src/machine/board_matrixportal-m4.go index 9236e62dd..ae1753cee 100644 --- a/src/machine/board_matrixportal-m4.go +++ b/src/machine/board_matrixportal-m4.go @@ -96,6 +96,14 @@ const ( UART_TX_PIN = UART1_TX_PIN ) +// UART on the MatrixPortal M4 +var ( + UART1 = &sercomUSART1 + UART2 = &sercomUSART4 + + DefaultUART = UART1 +) + // SPI pins const ( SPI0_SCK_PIN = D34 // SERCOM3[1] (ESP32 SCK) diff --git a/src/machine/board_matrixportal-m4_baremetal.go b/src/machine/board_matrixportal-m4_baremetal.go index f60a535b8..5b9a6feeb 100644 --- a/src/machine/board_matrixportal-m4_baremetal.go +++ b/src/machine/board_matrixportal-m4_baremetal.go @@ -4,31 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -// UART on the MatrixPortal M4 -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM1_USART_INT, - SERCOM: 1, - } - - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM4_USART_INT, - SERCOM: 4, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM1_1, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM4_1, _UART2.handleInterrupt) -} - // I2C on the MatrixPortal M4 var ( I2C0 = &I2C{ @@ -50,7 +27,3 @@ var ( SERCOM: 0, } ) - -var ( - DefaultUART = UART1 -) diff --git a/src/machine/board_metro-m4-airlift.go b/src/machine/board_metro-m4-airlift.go index 4aa248150..6525286d2 100644 --- a/src/machine/board_metro-m4-airlift.go +++ b/src/machine/board_metro-m4-airlift.go @@ -57,6 +57,13 @@ const ( UART2_RX_PIN = PA07 ) +var ( + UART1 = &sercomUSART3 + UART2 = &sercomUSART0 + + DefaultUART = UART1 +) + const ( NINA_CS = PA15 NINA_ACK = PB04 diff --git a/src/machine/board_metro-m4-airlift_baremetal.go b/src/machine/board_metro-m4-airlift_baremetal.go index c390b94b8..2dd84f81b 100644 --- a/src/machine/board_metro-m4-airlift_baremetal.go +++ b/src/machine/board_metro-m4-airlift_baremetal.go @@ -4,30 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM3_USART_INT, - SERCOM: 3, - } - - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM0_USART_INT, - SERCOM: 0, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM3_2, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, _UART2.handleInterrupt) -} - // I2C on the Metro M4. var ( I2C0 = &I2C{ @@ -52,7 +30,3 @@ var ( SERCOM: 1, } ) - -var ( - DefaultUART = UART1 -) diff --git a/src/machine/board_p1am-100.go b/src/machine/board_p1am-100.go index 46964e4e7..caeaba695 100644 --- a/src/machine/board_p1am-100.go +++ b/src/machine/board_p1am-100.go @@ -79,6 +79,9 @@ const ( UART_TX_PIN Pin = PB22 // TX: SERCOM5/PAD[2] ) +// UART1 on the P1AM-100 connects to the normal TX/RX pins. +var UART1 = &sercomUSART5 + // I2C pins const ( SDA_PIN Pin = PA08 // SDA: SERCOM0/PAD[0] diff --git a/src/machine/board_p1am-100_baremetal.go b/src/machine/board_p1am-100_baremetal.go index e50dd4464..067fe07e7 100644 --- a/src/machine/board_p1am-100_baremetal.go +++ b/src/machine/board_p1am-100_baremetal.go @@ -4,23 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -// UART1 on the P1AM-100 connects to the normal TX/RX pins. -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM3_USART, - SERCOM: 5, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM5, _UART1.handleInterrupt) -} - // I2C on the P1AM-100. var ( I2C0 = &I2C{ diff --git a/src/machine/board_pybadge.go b/src/machine/board_pybadge.go index e175da683..a4cd61c7c 100644 --- a/src/machine/board_pybadge.go +++ b/src/machine/board_pybadge.go @@ -84,6 +84,13 @@ const ( UART2_RX_PIN = A5 ) +var ( + UART1 = &sercomUSART5 + UART2 = &sercomUSART0 + + DefaultUART = UART1 +) + // I2C pins const ( SDA_PIN = PA12 // SDA: SERCOM2/PAD[0] diff --git a/src/machine/board_pybadge_baremetal.go b/src/machine/board_pybadge_baremetal.go index 259e3c386..94fa7da26 100644 --- a/src/machine/board_pybadge_baremetal.go +++ b/src/machine/board_pybadge_baremetal.go @@ -4,30 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM5_USART_INT, - SERCOM: 5, - } - - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM0_USART_INT, - SERCOM: 0, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM5_2, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, _UART2.handleInterrupt) -} - // I2C on the ItsyBitsy M4. var ( I2C0 = &I2C{ @@ -51,7 +29,3 @@ var ( SERCOM: 4, } ) - -var ( - DefaultUART = UART1 -) diff --git a/src/machine/board_pyportal.go b/src/machine/board_pyportal.go index ff2fcb7fe..28badad2b 100644 --- a/src/machine/board_pyportal.go +++ b/src/machine/board_pyportal.go @@ -107,6 +107,12 @@ const ( UART_RX_PIN = D0 ) +var ( + UART1 = &sercomUSART4 + + DefaultUART = UART1 +) + // I2C pins const ( SDA_PIN = PB02 // SDA: SERCOM2/PAD[0] diff --git a/src/machine/board_pyportal_baremetal.go b/src/machine/board_pyportal_baremetal.go index 9dc03e638..9f7a77e08 100644 --- a/src/machine/board_pyportal_baremetal.go +++ b/src/machine/board_pyportal_baremetal.go @@ -4,22 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM4_USART_INT, - SERCOM: 4, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM4_2, _UART1.handleInterrupt) -} - // I2C on the PyPortal. var ( I2C0 = &I2C{ @@ -36,7 +22,3 @@ var ( } NINA_SPI = SPI0 ) - -var ( - DefaultUART = UART1 -) diff --git a/src/machine/board_qtpy.go b/src/machine/board_qtpy.go index 503ba6f74..64389331b 100644 --- a/src/machine/board_qtpy.go +++ b/src/machine/board_qtpy.go @@ -4,7 +4,6 @@ package machine import ( "device/sam" - "runtime/interrupt" ) // used to reset into bootloader @@ -60,18 +59,7 @@ const ( ) // UART1 on the QT Py M0. -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM0_USART, - SERCOM: 0, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM0, _UART1.handleInterrupt) -} +var UART1 = &sercomUSART0 // SPI pins const ( diff --git a/src/machine/board_trinket.go b/src/machine/board_trinket.go index f97a5ccba..8df249e5d 100644 --- a/src/machine/board_trinket.go +++ b/src/machine/board_trinket.go @@ -4,7 +4,6 @@ package machine import ( "device/sam" - "runtime/interrupt" ) // used to reset into bootloader @@ -46,18 +45,7 @@ const ( ) // UART1 on the Trinket M0. -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM0_USART, - SERCOM: 0, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM0, _UART1.handleInterrupt) -} +var UART1 = &sercomUSART0 // SPI pins const ( diff --git a/src/machine/board_wioterminal.go b/src/machine/board_wioterminal.go index 57bbff1b5..55631d743 100644 --- a/src/machine/board_wioterminal.go +++ b/src/machine/board_wioterminal.go @@ -343,6 +343,13 @@ const ( UART2_RX_PIN = PIN_SERIAL2_RX ) +var ( + UART1 = &sercomUSART2 + + // RTL8720D + UART2 = &sercomUSART1 +) + // I2C pins const ( SDA0_PIN = PIN_WIRE_SDA // SDA: SERCOM3/PAD[0] diff --git a/src/machine/board_wioterminal_baremetal.go b/src/machine/board_wioterminal_baremetal.go index a8657f914..da333cd50 100644 --- a/src/machine/board_wioterminal_baremetal.go +++ b/src/machine/board_wioterminal_baremetal.go @@ -4,31 +4,8 @@ package machine import ( "device/sam" - "runtime/interrupt" ) -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM2_USART_INT, - SERCOM: 2, - } - - // RTL8720D - UART2 = &_UART2 - _UART2 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM1_USART_INT, - SERCOM: 1, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM2_2, _UART1.handleInterrupt) - UART2.Interrupt = interrupt.New(sam.IRQ_SERCOM1_2, _UART2.handleInterrupt) -} - // I2C on the Wio Terminal var ( I2C0 = &I2C{ diff --git a/src/machine/board_xiao.go b/src/machine/board_xiao.go index ac5ffbdab..5cf87b7d6 100644 --- a/src/machine/board_xiao.go +++ b/src/machine/board_xiao.go @@ -4,7 +4,6 @@ package machine import ( "device/sam" - "runtime/interrupt" ) // used to reset into bootloader @@ -61,18 +60,7 @@ const ( ) // UART1 on the Xiao -var ( - UART1 = &_UART1 - _UART1 = UART{ - Buffer: NewRingBuffer(), - Bus: sam.SERCOM4_USART, - SERCOM: 4, - } -) - -func init() { - UART1.Interrupt = interrupt.New(sam.IRQ_SERCOM4, _UART1.handleInterrupt) -} +var UART1 = &sercomUSART4 // I2C pins const ( diff --git a/src/machine/machine_atsamd21.go b/src/machine/machine_atsamd21.go index dce28743f..ac02740d4 100644 --- a/src/machine/machine_atsamd21.go +++ b/src/machine/machine_atsamd21.go @@ -504,10 +504,6 @@ type UART struct { Interrupt interrupt.Interrupt } -var ( - USB = &USBCDC{Buffer: NewRingBuffer()} -) - const ( sampleRate16X = 16 lsbFirst = 1 @@ -1743,6 +1739,10 @@ type USBCDC struct { sent bool } +var ( + USB = &USBCDC{Buffer: NewRingBuffer()} +) + const ( usbcdcTxSizeMask uint8 = 0x3F usbcdcTxBankMask uint8 = ^usbcdcTxSizeMask diff --git a/src/machine/machine_atsamd21e18.go b/src/machine/machine_atsamd21e18.go index bdd53bd1c..0d62e8837 100644 --- a/src/machine/machine_atsamd21e18.go +++ b/src/machine/machine_atsamd21e18.go @@ -9,8 +9,23 @@ package machine import ( "device/sam" + "runtime/interrupt" ) +var ( + sercomUSART0 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM0_USART, SERCOM: 0} + sercomUSART1 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM1_USART, SERCOM: 1} + sercomUSART2 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM2_USART, SERCOM: 2} + sercomUSART3 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM3_USART, SERCOM: 3} +) + +func init() { + sercomUSART0.Interrupt = interrupt.New(sam.IRQ_SERCOM0, sercomUSART0.handleInterrupt) + sercomUSART1.Interrupt = interrupt.New(sam.IRQ_SERCOM1, sercomUSART1.handleInterrupt) + sercomUSART2.Interrupt = interrupt.New(sam.IRQ_SERCOM2, sercomUSART2.handleInterrupt) + sercomUSART3.Interrupt = interrupt.New(sam.IRQ_SERCOM3, sercomUSART3.handleInterrupt) +} + // Return the register and mask to enable a given GPIO pin. This can be used to // implement bit-banged drivers. func (p Pin) PortMaskSet() (*uint32, uint32) { diff --git a/src/machine/machine_atsamd21g18.go b/src/machine/machine_atsamd21g18.go index b5f905b37..b836b0eb2 100644 --- a/src/machine/machine_atsamd21g18.go +++ b/src/machine/machine_atsamd21g18.go @@ -9,8 +9,27 @@ package machine import ( "device/sam" + "runtime/interrupt" ) +var ( + sercomUSART0 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM0_USART, SERCOM: 0} + sercomUSART1 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM1_USART, SERCOM: 1} + sercomUSART2 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM2_USART, SERCOM: 2} + sercomUSART3 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM3_USART, SERCOM: 3} + sercomUSART4 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM4_USART, SERCOM: 4} + sercomUSART5 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM5_USART, SERCOM: 5} +) + +func init() { + sercomUSART0.Interrupt = interrupt.New(sam.IRQ_SERCOM0, sercomUSART0.handleInterrupt) + sercomUSART1.Interrupt = interrupt.New(sam.IRQ_SERCOM1, sercomUSART1.handleInterrupt) + sercomUSART2.Interrupt = interrupt.New(sam.IRQ_SERCOM2, sercomUSART2.handleInterrupt) + sercomUSART3.Interrupt = interrupt.New(sam.IRQ_SERCOM3, sercomUSART3.handleInterrupt) + sercomUSART4.Interrupt = interrupt.New(sam.IRQ_SERCOM4, sercomUSART4.handleInterrupt) + sercomUSART5.Interrupt = interrupt.New(sam.IRQ_SERCOM5, sercomUSART5.handleInterrupt) +} + // Return the register and mask to enable a given GPIO pin. This can be used to // implement bit-banged drivers. func (p Pin) PortMaskSet() (*uint32, uint32) { diff --git a/src/machine/machine_atsamd51.go b/src/machine/machine_atsamd51.go index 4fc5bc62a..b7c96339f 100644 --- a/src/machine/machine_atsamd51.go +++ b/src/machine/machine_atsamd51.go @@ -951,10 +951,23 @@ type UART struct { } var ( - // USB is a USB CDC interface. - USB = &USBCDC{Buffer: NewRingBuffer()} + sercomUSART0 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM0_USART_INT, SERCOM: 0} + sercomUSART1 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM1_USART_INT, SERCOM: 1} + sercomUSART2 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM2_USART_INT, SERCOM: 2} + sercomUSART3 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM3_USART_INT, SERCOM: 3} + sercomUSART4 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM4_USART_INT, SERCOM: 4} + sercomUSART5 = UART{Buffer: NewRingBuffer(), Bus: sam.SERCOM5_USART_INT, SERCOM: 5} ) +func init() { + sercomUSART0.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, sercomUSART0.handleInterrupt) + sercomUSART1.Interrupt = interrupt.New(sam.IRQ_SERCOM1_2, sercomUSART1.handleInterrupt) + sercomUSART2.Interrupt = interrupt.New(sam.IRQ_SERCOM2_2, sercomUSART2.handleInterrupt) + sercomUSART3.Interrupt = interrupt.New(sam.IRQ_SERCOM3_2, sercomUSART3.handleInterrupt) + sercomUSART4.Interrupt = interrupt.New(sam.IRQ_SERCOM4_2, sercomUSART4.handleInterrupt) + sercomUSART5.Interrupt = interrupt.New(sam.IRQ_SERCOM5_2, sercomUSART5.handleInterrupt) +} + const ( sampleRate16X = 16 lsbFirst = 1 @@ -1950,6 +1963,11 @@ type USBCDC struct { sent bool } +var ( + // USB is a USB CDC interface. + USB = &USBCDC{Buffer: NewRingBuffer()} +) + const ( usbcdcTxSizeMask uint8 = 0x3F usbcdcTxBankMask uint8 = ^usbcdcTxSizeMask diff --git a/src/machine/machine_generic.go b/src/machine/machine_generic.go index 70551e27a..8e6821fa4 100644 --- a/src/machine/machine_generic.go +++ b/src/machine/machine_generic.go @@ -165,3 +165,14 @@ func uartRead(bus uint8, buf *byte, bufLen int) int //export __tinygo_uart_write func uartWrite(bus uint8, buf *byte, bufLen int) int + +// Some objects used by Atmel SAM D chips (samd21, samd51). +// Defined here (without build tag) for convenience. +var ( + sercomUSART0 = UART{0} + sercomUSART1 = UART{1} + sercomUSART2 = UART{2} + sercomUSART3 = UART{3} + sercomUSART4 = UART{4} + sercomUSART5 = UART{5} +)