diff options
Diffstat (limited to 'src/atsamd/serial.c')
-rw-r--r-- | src/atsamd/serial.c | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/src/atsamd/serial.c b/src/atsamd/serial.c index 81eda46f..91e85796 100644 --- a/src/atsamd/serial.c +++ b/src/atsamd/serial.c @@ -1,12 +1,11 @@ // samd21 serial port // -// Copyright (C) 2018 Kevin O'Connor <kevin@koconnor.net> +// Copyright (C) 2018-2019 Kevin O'Connor <kevin@koconnor.net> // // This file may be distributed under the terms of the GNU GPLv3 license. #include "board/serial_irq.h" // serial_rx_data #include "internal.h" // enable_pclock -#include "samd21.h" // SERCOM0 #include "sched.h" // DECL_INIT void @@ -20,7 +19,7 @@ serial_init(void) // Configure serial SercomUsart *su = &SERCOM0->USART; su->CTRLA.reg = 0; - uint32_t areg = (SERCOM_USART_CTRLA_MODE_USART_INT_CLK + uint32_t areg = (SERCOM_USART_CTRLA_MODE(1) | SERCOM_USART_CTRLA_DORD | SERCOM_USART_CTRLA_SAMPR(1) | SERCOM_USART_CTRLA_TXPO(1) @@ -31,13 +30,31 @@ serial_init(void) uint32_t baud8 = freq / (2 * CONFIG_SERIAL_BAUD); su->BAUD.reg = (SERCOM_USART_BAUD_FRAC_BAUD(baud8 / 8) | SERCOM_USART_BAUD_FRAC_FP(baud8 % 8)); - NVIC_SetPriority(SERCOM0_IRQn, 0); - NVIC_EnableIRQ(SERCOM0_IRQn); + // enable irqs su->INTENSET.reg = SERCOM_USART_INTENSET_RXC; su->CTRLA.reg = areg | SERCOM_USART_CTRLA_ENABLE; +#if CONFIG_MACH_SAMD21 + NVIC_SetPriority(SERCOM0_IRQn, 0); + NVIC_EnableIRQ(SERCOM0_IRQn); +#elif CONFIG_MACH_SAMD51 + NVIC_SetPriority(SERCOM0_0_IRQn, 0); + NVIC_SetPriority(SERCOM0_1_IRQn, 0); + NVIC_SetPriority(SERCOM0_2_IRQn, 0); + NVIC_SetPriority(SERCOM0_3_IRQn, 0); + NVIC_EnableIRQ(SERCOM0_0_IRQn); + NVIC_EnableIRQ(SERCOM0_1_IRQn); + NVIC_EnableIRQ(SERCOM0_2_IRQn); + NVIC_EnableIRQ(SERCOM0_3_IRQn); +#endif } DECL_INIT(serial_init); +void +serial_enable_tx_irq(void) +{ + SERCOM0->USART.INTENSET.reg = SERCOM_USART_INTENSET_DRE; +} + void __visible SERCOM0_Handler(void) { @@ -54,8 +71,12 @@ SERCOM0_Handler(void) } } -void -serial_enable_tx_irq(void) -{ - SERCOM0->USART.INTENSET.reg = SERCOM_USART_INTENSET_DRE; -} +// Aliases for irq handeler on SAMD51 +void SERCOM0_0_Handler(void) + __visible __attribute__((alias("SERCOM0_Handler"))); +void SERCOM0_1_Handler(void) + __visible __attribute__((alias("SERCOM0_Handler"))); +void SERCOM0_2_Handler(void) + __visible __attribute__((alias("SERCOM0_Handler"))); +void SERCOM0_3_Handler(void) + __visible __attribute__((alias("SERCOM0_Handler"))); |