diff options
Diffstat (limited to 'src/sam3/serial.c')
-rw-r--r-- | src/sam3/serial.c | 55 |
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; } |