From c035f20392828c60da75d092eea4d64736316c7b Mon Sep 17 00:00:00 2001 From: Bdale Garbee Date: Wed, 9 Nov 2022 08:27:28 -0700 Subject: [PATCH] TeleMetrum v4.0 work in progress --- src/samd21/ao_dma_samd21.h | 6 ++---- src/samd21/ao_serial_samd21.c | 30 +++++++++++++++++++++++++----- src/samd21/samd21.h | 7 +++++++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/samd21/ao_dma_samd21.h b/src/samd21/ao_dma_samd21.h index f28810bb..57f54769 100644 --- a/src/samd21/ao_dma_samd21.h +++ b/src/samd21/ao_dma_samd21.h @@ -39,13 +39,11 @@ void ao_dma_dump(char *where); /* - * DMA is used for ADC and SERCOM + * DMA is only used for SERCOM */ -#define AO_SERCOM_DMA_BASE 2U +#define AO_SERCOM_DMA_BASE 0U #define AO_SERCOM_INPUT_DMA_ID(id) ((uint8_t) ((id) * 2U + 0U + AO_SERCOM_DMA_BASE)) #define AO_SERCOM_OUTPUT_DMA_ID(id) ((uint8_t) ((id) * 2U + 1U + AO_SERCOM_DMA_BASE)) -#define AO_ADC_DMA_ID 0 - #endif /* _AO_DMA_SAM21_H_ */ diff --git a/src/samd21/ao_serial_samd21.c b/src/samd21/ao_serial_samd21.c index 0741790b..504dd490 100644 --- a/src/samd21/ao_serial_samd21.c +++ b/src/samd21/ao_serial_samd21.c @@ -89,14 +89,26 @@ static const uint32_t ao_usart_speeds[] = { static void ao_usart_set_speed(struct ao_samd21_usart *usart, uint8_t speed) { + struct samd21_sercom *reg = usart->reg; uint64_t top = (uint64_t) ao_usart_speeds[speed] << (4 + 16); uint16_t baud = (uint16_t) (65536 - (top + AO_SYSCLK/2) / AO_SYSCLK); + uint32_t ctrla = reg->ctrla; + if (ctrla & (1UL << SAMD21_SERCOM_CTRLA_ENABLE)) { + usart->reg->ctrla = ctrla & ~(1UL << SAMD21_SERCOM_CTRLA_ENABLE); + while (reg->syncbusy & (1 << SAMD21_SERCOM_SYNCBUSY_ENABLE)) + ; + } usart->reg->baud = baud; + if (ctrla & (1UL << SAMD21_SERCOM_CTRLA_ENABLE)) { + usart->reg->ctrla = ctrla; + while (reg->syncbusy & (1 << SAMD21_SERCOM_SYNCBUSY_ENABLE)) + ; + } } static void -ao_usart_init(struct ao_samd21_usart *usart, bool hw_flow, uint8_t id) +ao_usart_init(struct ao_samd21_usart *usart, bool hw_flow, uint8_t id, uint8_t txpo, uint8_t rxpo) { struct samd21_sercom *reg = usart->reg; @@ -137,14 +149,17 @@ ao_usart_init(struct ao_samd21_usart *usart, bool hw_flow, uint8_t id) (1 << SAMD21_SERCOM_CTRLA_RUNSTDBY) | (0 << SAMD21_SERCOM_CTRLA_IBON) | (0 << SAMD21_SERCOM_CTRLA_SAMPR) | - (1 << SAMD21_SERCOM_CTRLA_TXPO) | /* pad[2] */ - (3 << SAMD21_SERCOM_CTRLA_RXPO) | /* pad[3] */ + (txpo << SAMD21_SERCOM_CTRLA_TXPO) | /* pad[2] */ + (rxpo << SAMD21_SERCOM_CTRLA_RXPO) | /* pad[3] */ (0 << SAMD21_SERCOM_CTRLA_SAMPA) | (0 << SAMD21_SERCOM_CTRLA_FORM) | /* no parity */ (0 << SAMD21_SERCOM_CTRLA_CMODE) | /* async */ (0 << SAMD21_SERCOM_CTRLA_CPOL) | (1 << SAMD21_SERCOM_CTRLA_DORD)); /* LSB first */ + while (reg->syncbusy & (1 << SAMD21_SERCOM_SYNCBUSY_ENABLE)) + ; + /* Enable receive interrupt */ reg->intenset = (1 << SAMD21_SERCOM_INTFLAG_RXC); } @@ -287,6 +302,7 @@ ao_serial1_set_speed(uint8_t speed) void ao_serial_init(void) { + uint8_t txpo, rxpo; #if HAS_SERIAL_0 #if SERIAL_0_PA10_PA11 @@ -294,12 +310,14 @@ ao_serial_init(void) ao_enable_port(&samd21_port_a); samd21_port_pmux_set(&samd21_port_a, 10, SAMD21_PORT_PMUX_FUNC_C); samd21_port_pmux_set(&samd21_port_a, 11, SAMD21_PORT_PMUX_FUNC_C); + txpo = SAMD21_SERCOM_CTRLA_TXPO_TX_2; /* pad 2 */ + rxpo = SAMD21_SERCOM_CTRLA_RXPO_RX_3; /* pad 3 */ #else #error "No SERIAL_0 port configuration specified" #endif ao_samd21_usart0.reg = &samd21_sercom0; - ao_usart_init(&ao_samd21_usart0, 0, 0); + ao_usart_init(&ao_samd21_usart0, 0, 0, txpo, rxpo); #if USE_SERIAL_0_STDIN ao_add_stdio(_ao_serial0_pollchar, @@ -314,12 +332,14 @@ ao_serial_init(void) ao_enable_port(&samd21_port_a); samd21_port_pmux_set(&samd21_port_a, 0, SAMD21_PORT_PMUX_FUNC_D); samd21_port_pmux_set(&samd21_port_a, 1, SAMD21_PORT_PMUX_FUNC_D); + txpo = SAMD21_SERCOM_CTRLA_TXPO_TX_0; + rxpo = SAMD21_SERCOM_CTRLA_RXPO_RX_1; #else #error "No SERIAL_1 port configuration specified" #endif ao_samd21_usart1.reg = &samd21_sercom1; - ao_usart_init(&ao_samd21_usart1, 0, 0); + ao_usart_init(&ao_samd21_usart1, 0, 1, txpo, rxpo); #if USE_SERIAL_1_STDIN ao_add_stdio(_ao_serial1_pollchar, diff --git a/src/samd21/samd21.h b/src/samd21/samd21.h index 91ad52bf..747f3ad5 100644 --- a/src/samd21/samd21.h +++ b/src/samd21/samd21.h @@ -1600,7 +1600,14 @@ extern struct samd21_sercom samd21_sercom5; #define SAMD21_SERCOM_CTRLA_IBON 8 #define SAMD21_SERCOM_CTRLA_SAMPR 13 #define SAMD21_SERCOM_CTRLA_TXPO 16 +#define SAMD21_SERCOM_CTRLA_TXPO_TX_0 0 +#define SAMD21_SERCOM_CTRLA_TXPO_TX_2 1 +#define SAMD21_SERCOM_CTRLA_TXPO_TX_0_RTS_2_CTS_3 2 #define SAMD21_SERCOM_CTRLA_RXPO 20 +#define SAMD21_SERCOM_CTRLA_RXPO_RX_0 0 +#define SAMD21_SERCOM_CTRLA_RXPO_RX_1 1 +#define SAMD21_SERCOM_CTRLA_RXPO_RX_2 2 +#define SAMD21_SERCOM_CTRLA_RXPO_RX_3 3 #define SAMD21_SERCOM_CTRLA_SAMPA 22 #define SAMD21_SERCOM_CTRLA_FORM 24 #define SAMD21_SERCOM_CTRLA_CMODE 28 -- 2.30.2