Skip to content

Commit 7399a1a

Browse files
authored
Merge pull request #634 from dhalbert/3.0_UART
Implement UART for 3.0 + related fixes.
2 parents 0a3d9cf + 5f101f3 commit 7399a1a

File tree

21 files changed

+1048
-467
lines changed

21 files changed

+1048
-467
lines changed

ports/atmel-samd/Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ INC += -I. \
3636
-Iasf4/$(CHIP_FAMILY)/hal/utils/include \
3737
-Iasf4/$(CHIP_FAMILY)/hri \
3838
-Iasf4/$(CHIP_FAMILY)/hpl/core \
39+
-Iasf4/$(CHIP_FAMILY)/hpl/gclk \
3940
-Iasf4/$(CHIP_FAMILY)/hpl/pm \
4041
-Iasf4/$(CHIP_FAMILY)/hpl/port \
4142
-Iasf4/$(CHIP_FAMILY)/hpl/tc \
@@ -96,6 +97,7 @@ ifeq ($(DEBUG), 1)
9697
# Turn on Python modules useful for debugging (e.g. uheap, ustack).
9798
CFLAGS += -ggdb
9899
CFLAGS += -flto
100+
## CFLAGS += -fno-inline
99101
ifeq ($(CHIP_FAMILY), samd21)
100102
CFLAGS += -DENABLE_MICRO_TRACE_BUFFER
101103
endif
@@ -178,6 +180,7 @@ SRC_ASF := \
178180
hal/src/hal_sleep.c \
179181
hal/src/hal_spi_m_sync.c \
180182
hal/src/hal_timer.c \
183+
hal/src/hal_usart_async.c \
181184
hal/src/hal_usb_device.c \
182185
hpl/adc/hpl_adc.c \
183186
hpl/core/hpl_init.c \
@@ -194,6 +197,7 @@ SRC_ASF := \
194197
usb/device/usbdc.c \
195198
usb/usb_protocol.c \
196199
hal/utils/src/utils_list.c \
200+
hal/utils/src/utils_ringbuffer.c \
197201

198202
ifeq ($(CHIP_FAMILY), samd21)
199203
SRC_ASF += \
@@ -263,6 +267,7 @@ SRC_COMMON_HAL = \
263267
busio/__init__.c \
264268
busio/I2C.c \
265269
busio/SPI.c \
270+
busio/UART.c \
266271
digitalio/__init__.c \
267272
digitalio/DigitalInOut.c \
268273
microcontroller/__init__.c \
@@ -283,7 +288,6 @@ SRC_COMMON_HAL = \
283288
audiobusio/PDMIn.c \
284289
audioio/__init__.c \
285290
audioio/AudioOut.c \
286-
busio/UART.c \
287291
nvm/__init__.c \
288292
nvm/ByteArray.c \
289293
touchio/__init__.c \

ports/atmel-samd/asf4

Submodule asf4 updated 58 files

ports/atmel-samd/asf4_conf/samd21/hpl_gclk_config.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
// Circuit Python SAMD21 clock tree:
2+
// DFLL48M (with USBCRM on to sync with external USB ref) -> GCLK0
3+
// GCLK0 (48MHz) -> peripherals
4+
5+
// We'd like to use XOSC32K as a ref for DFLL48M on boards with a 32kHz crystal,
6+
// but haven't figured that out yet.
7+
8+
// Used in hpl/core/hpl_init.c to define which clocks should be initialized first.
9+
#define CIRCUITPY_GCLK_INIT_1ST (1 << 0)
10+
11+
112
/* Auto-generated config file hpl_gclk_config.h */
213
#ifndef HPL_GCLK_CONFIG_H
314
#define HPL_GCLK_CONFIG_H

ports/atmel-samd/asf4_conf/samd21/hpl_sercom_config.h

Lines changed: 186 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@
33
//
44
// SERCOM0: SPI with hal_spi_m_sync.c driver: spi master synchronous
55
// SERCOM1: I2C with hal_i2c_m_sync.c driver: i2c master synchronous
6-
// SERCOM2: USART with hal_usart_sync.c driver: usart synchronous
6+
// SERCOM2: USART with hal_usart_async.c driver: usart asynchronous
7+
// SERCOM3: SPI with hal_spi_m_dma.c: spi master DMA
78

89
#define PROTOTYPE_SERCOM_SPI_M_SYNC SERCOM0
910
#define PROTOTYPE_SERCOM_SPI_M_SYNC_CLOCK_FREQUENCY CONF_GCLK_SERCOM0_CORE_FREQUENCY
1011

1112
#define PROTOTYPE_SERCOM_I2CM_SYNC SERCOM1
12-
#define PROTOTYPE_SERCOM_USART_SYNC SERCOM2
1313

14+
#define PROTOTYPE_SERCOM_USART_ASYNC SERCOM2
15+
#define PROTOTYPE_SERCOM_USART_ASYNC_CLOCK_FREQUENCY CONF_GCLK_SERCOM2_CORE_FREQUENCY
1416

1517
/* Auto-generated config file hpl_sercom_config.h */
1618
#ifndef HPL_SERCOM_CONFIG_H
@@ -543,6 +545,188 @@
543545
#endif
544546
#endif
545547

548+
#include <peripheral_clk_config.h>
549+
550+
// Enable configuration of module
551+
#ifndef CONF_SERCOM_3_SPI_ENABLE
552+
#define CONF_SERCOM_3_SPI_ENABLE 1
553+
#endif
554+
555+
//<o> SPI DMA TX Channel <0-32>
556+
//<i> This defines DMA channel to be used
557+
//<id> spi_master_dma_tx_channel
558+
#ifndef CONF_SERCOM_3_SPI_M_DMA_TX_CHANNEL
559+
#define CONF_SERCOM_3_SPI_M_DMA_TX_CHANNEL 0
560+
#endif
561+
562+
// <e> SPI RX Channel Enable
563+
// <id> spi_master_rx_channel
564+
#ifndef CONF_SERCOM_3_SPI_RX_CHANNEL
565+
#define CONF_SERCOM_3_SPI_RX_CHANNEL 1
566+
#endif
567+
568+
//<o> DMA Channel <0-32>
569+
//<i> This defines DMA channel to be used
570+
//<id> spi_master_dma_rx_channel
571+
#ifndef CONF_SERCOM_3_SPI_M_DMA_RX_CHANNEL
572+
#define CONF_SERCOM_3_SPI_M_DMA_RX_CHANNEL 1
573+
#endif
574+
575+
// </e>
576+
577+
// Set module in SPI Master mode
578+
#ifndef CONF_SERCOM_3_SPI_MODE
579+
#define CONF_SERCOM_3_SPI_MODE 0x03
580+
#endif
581+
582+
// <h> Basic Configuration
583+
584+
// <q> Receive buffer enable
585+
// <i> Enable receive buffer to receive data from slave (RXEN)
586+
// <id> spi_master_rx_enable
587+
#ifndef CONF_SERCOM_3_SPI_RXEN
588+
#define CONF_SERCOM_3_SPI_RXEN 0x1
589+
#endif
590+
591+
// <o> Character Size
592+
// <i> Bit size for all characters sent over the SPI bus (CHSIZE)
593+
// <0x0=>8 bits
594+
// <0x1=>9 bits
595+
// <id> spi_master_character_size
596+
#ifndef CONF_SERCOM_3_SPI_CHSIZE
597+
#define CONF_SERCOM_3_SPI_CHSIZE 0x0
598+
#endif
599+
600+
// <o> Baud rate <1-12000000>
601+
// <i> The SPI data transfer rate
602+
// <id> spi_master_baud_rate
603+
#ifndef CONF_SERCOM_3_SPI_BAUD
604+
#define CONF_SERCOM_3_SPI_BAUD 50000
605+
#endif
606+
607+
// </h>
608+
609+
// <e> Advanced Configuration
610+
// <id> spi_master_advanced
611+
#ifndef CONF_SERCOM_3_SPI_ADVANCED
612+
#define CONF_SERCOM_3_SPI_ADVANCED 0
613+
#endif
614+
615+
// <o> Dummy byte <0x00-0x1ff>
616+
// <id> spi_master_dummybyte
617+
// <i> Dummy byte used when reading data from the slave without sending any data
618+
#ifndef CONF_SERCOM_3_SPI_DUMMYBYTE
619+
#define CONF_SERCOM_3_SPI_DUMMYBYTE 0x1ff
620+
#endif
621+
622+
// <o> Data Order
623+
// <0=>MSB first
624+
// <1=>LSB first
625+
// <i> I least significant or most significant bit is shifted out first (DORD)
626+
// <id> spi_master_arch_dord
627+
#ifndef CONF_SERCOM_3_SPI_DORD
628+
#define CONF_SERCOM_3_SPI_DORD 0x0
629+
#endif
630+
631+
// <o> Clock Polarity
632+
// <0=>SCK is low when idle
633+
// <1=>SCK is high when idle
634+
// <i> Determines if the leading edge is rising or falling with a corresponding opposite edge at the trailing edge. (CPOL)
635+
// <id> spi_master_arch_cpol
636+
#ifndef CONF_SERCOM_3_SPI_CPOL
637+
#define CONF_SERCOM_3_SPI_CPOL 0x0
638+
#endif
639+
640+
// <o> Clock Phase
641+
// <0x0=>Sample input on leading edge
642+
// <0x1=>Sample input on trailing edge
643+
// <i> Determines if input data is sampled on leading or trailing SCK edge. (CPHA)
644+
// <id> spi_master_arch_cpha
645+
#ifndef CONF_SERCOM_3_SPI_CPHA
646+
#define CONF_SERCOM_3_SPI_CPHA 0x0
647+
#endif
648+
649+
// <o> Immediate Buffer Overflow Notification
650+
// <i> Controls when OVF is asserted (IBON)
651+
// <0x0=>In data stream
652+
// <0x1=>On buffer overflow
653+
// <id> spi_master_arch_ibon
654+
#ifndef CONF_SERCOM_3_SPI_IBON
655+
#define CONF_SERCOM_3_SPI_IBON 0x0
656+
#endif
657+
658+
// <q> Run in stand-by
659+
// <i> Module stays active in stand-by sleep mode. (RUNSTDBY)
660+
// <id> spi_master_arch_runstdby
661+
#ifndef CONF_SERCOM_3_SPI_RUNSTDBY
662+
#define CONF_SERCOM_3_SPI_RUNSTDBY 0x0
663+
#endif
664+
665+
// <o> Debug Stop Mode
666+
// <i> Behavior of the baud-rate generator when CPU is halted by external debugger. (DBGSTOP)
667+
// <0=>Keep running
668+
// <1=>Halt
669+
// <id> spi_master_arch_dbgstop
670+
#ifndef CONF_SERCOM_3_SPI_DBGSTOP
671+
#define CONF_SERCOM_3_SPI_DBGSTOP 0
672+
#endif
673+
674+
// </e>
675+
676+
// Address mode disabled in master mode
677+
#ifndef CONF_SERCOM_3_SPI_AMODE_EN
678+
#define CONF_SERCOM_3_SPI_AMODE_EN 0
679+
#endif
680+
681+
#ifndef CONF_SERCOM_3_SPI_AMODE
682+
#define CONF_SERCOM_3_SPI_AMODE 0
683+
#endif
684+
685+
#ifndef CONF_SERCOM_3_SPI_ADDR
686+
#define CONF_SERCOM_3_SPI_ADDR 0
687+
#endif
688+
689+
#ifndef CONF_SERCOM_3_SPI_ADDRMASK
690+
#define CONF_SERCOM_3_SPI_ADDRMASK 0
691+
#endif
692+
693+
#ifndef CONF_SERCOM_3_SPI_SSDE
694+
#define CONF_SERCOM_3_SPI_SSDE 0
695+
#endif
696+
697+
#ifndef CONF_SERCOM_3_SPI_MSSEN
698+
#define CONF_SERCOM_3_SPI_MSSEN 0x0
699+
#endif
700+
701+
#ifndef CONF_SERCOM_3_SPI_PLOADEN
702+
#define CONF_SERCOM_3_SPI_PLOADEN 0
703+
#endif
704+
705+
// <o> Receive Data Pinout
706+
// <0x0=>PAD[0]
707+
// <0x1=>PAD[1]
708+
// <0x2=>PAD[2]
709+
// <0x3=>PAD[3]
710+
// <id> spi_master_rxpo
711+
#ifndef CONF_SERCOM_3_SPI_RXPO
712+
#define CONF_SERCOM_3_SPI_RXPO 0
713+
#endif
714+
715+
// <o> Transmit Data Pinout
716+
// <0x0=>PAD[0,1]_DO_SCK
717+
// <0x1=>PAD[2,3]_DO_SCK
718+
// <0x2=>PAD[3,1]_DO_SCK
719+
// <0x3=>PAD[0,3]_DO_SCK
720+
// <id> spi_master_txpo
721+
#ifndef CONF_SERCOM_3_SPI_TXPO
722+
#define CONF_SERCOM_3_SPI_TXPO 1
723+
#endif
724+
725+
// Calculate baud register value from requested baudrate value
726+
#ifndef CONF_SERCOM_3_SPI_BAUD_RATE
727+
#define CONF_SERCOM_3_SPI_BAUD_RATE ((float)CONF_GCLK_SERCOM3_CORE_FREQUENCY / (float)(2 * CONF_SERCOM_3_SPI_BAUD)) - 1
728+
#endif
729+
546730
// <<< end of configuration section >>>
547731

548732
#endif // HPL_SERCOM_CONFIG_H

0 commit comments

Comments
 (0)