aboutsummaryrefslogtreecommitdiffstats
path: root/src/atsamd/serial.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2019-01-14 18:21:50 -0500
committerKevin O'Connor <kevin@koconnor.net>2019-01-28 20:02:16 -0500
commit8cd83b4c2dcaeac1fe68f18eadd7f25ff42476c2 (patch)
tree780a7aa17ffd41969e5e6d63751b0efe7a9d108c /src/atsamd/serial.c
parentf6ce875818a1341ff7a0279699505453d8ca0db4 (diff)
downloadkutter-8cd83b4c2dcaeac1fe68f18eadd7f25ff42476c2.tar.gz
kutter-8cd83b4c2dcaeac1fe68f18eadd7f25ff42476c2.tar.xz
kutter-8cd83b4c2dcaeac1fe68f18eadd7f25ff42476c2.zip
atsamd: Initial support for SAMD51
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/atsamd/serial.c')
-rw-r--r--src/atsamd/serial.c41
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")));