aboutsummaryrefslogtreecommitdiffstats
path: root/src/sam3/serial.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sam3/serial.c')
-rw-r--r--src/sam3/serial.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/src/sam3/serial.c b/src/sam3/serial.c
index 1fe55751..e0249448 100644
--- a/src/sam3/serial.c
+++ b/src/sam3/serial.c
@@ -1,4 +1,4 @@
-// sam3x8e serial port
+// sam3/sam4 serial port
//
// Copyright (C) 2016-2018 Kevin O'Connor <kevin@koconnor.net>
//
@@ -7,50 +7,65 @@
#include "autoconf.h" // CONFIG_SERIAL_BAUD
#include "board/serial_irq.h" // serial_rx_data
#include "internal.h" // gpio_peripheral
-#include "sam3x8e.h" // UART
#include "sched.h" // DECL_INIT
+// Serial port pins
+#if CONFIG_MACH_SAM3X8E
+#define Serial_IRQ_Handler UART_Handler
+static Uart * const Port = UART;
+static const uint32_t Pmc_id = ID_UART, Irq_id = UART_IRQn;
+static const uint32_t rx_pin = GPIO('A', 8);
+static const uint32_t tx_pin = GPIO('A', 9);
+#elif CONFIG_MACH_SAM4E8E
+#define Serial_IRQ_Handler UART0_Handler
+static Uart * const Port = UART0;
+static const uint32_t Pmc_id = ID_UART0, Irq_id = UART0_IRQn;
+static const uint32_t rx_pin = GPIO('A', 9);
+static const uint32_t tx_pin = GPIO('A', 10);
+#endif
+
void
serial_init(void)
{
- gpio_peripheral(GPIO('A', 8), 'A', 1);
- gpio_peripheral(GPIO('A', 9), 'A', 0);
+ gpio_peripheral(rx_pin, 'A', 1);
+ gpio_peripheral(tx_pin, 'A', 0);
// Reset uart
- PMC->PMC_PCER0 = 1 << ID_UART;
- UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
- UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
- UART->UART_IDR = 0xFFFFFFFF;
+ PMC->PMC_PCER0 = 1 << Pmc_id;
+ Port->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
+ Port->UART_CR = (UART_CR_RSTRX | UART_CR_RSTTX
+ | UART_CR_RXDIS | UART_CR_TXDIS);
+ Port->UART_IDR = 0xFFFFFFFF;
// Enable uart
- UART->UART_MR = (US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO
+ Port->UART_MR = (US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO
| UART_MR_CHMODE_NORMAL);
- UART->UART_BRGR = SystemCoreClock / (16 * CONFIG_SERIAL_BAUD);
- UART->UART_IER = UART_IER_RXRDY;
- NVIC_EnableIRQ(UART_IRQn);
- NVIC_SetPriority(UART_IRQn, 0);
- UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
+ Port->UART_BRGR = SystemCoreClock / (16 * CONFIG_SERIAL_BAUD);
+ Port->UART_IER = UART_IER_RXRDY;
+ NVIC_EnableIRQ(Irq_id);
+ NVIC_SetPriority(Irq_id, 0);
+ Port->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
}
DECL_INIT(serial_init);
void __visible
-UART_Handler(void)
+Serial_IRQ_Handler(void)
{
- uint32_t status = UART->UART_SR;
+ uint32_t status = Port->UART_SR;
if (status & UART_SR_RXRDY)
- serial_rx_byte(UART->UART_RHR);
+ serial_rx_byte(Port->UART_RHR);
if (status & UART_SR_TXRDY) {
uint8_t data;
int ret = serial_get_tx_byte(&data);
if (ret)
- UART->UART_IDR = UART_IDR_TXRDY;
+ Port->UART_IDR = UART_IDR_TXRDY;
else
- UART->UART_THR = data;
+ Port->UART_THR = data;
}
}
void
serial_enable_tx_irq(void)
{
- UART->UART_IER = UART_IDR_TXRDY;
+ Port->UART_IER = UART_IDR_TXRDY;
}