aboutsummaryrefslogtreecommitdiff
path: root/platform/zynq/uart.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/zynq/uart.c')
-rw-r--r--platform/zynq/uart.c160
1 files changed, 0 insertions, 160 deletions
diff --git a/platform/zynq/uart.c b/platform/zynq/uart.c
deleted file mode 100644
index 531c051e..00000000
--- a/platform/zynq/uart.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (c) 2014 Travis Geiselbrecht
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-#include <reg.h>
-#include <stdio.h>
-#include <trace.h>
-#include <assert.h>
-#include <lib/cbuf.h>
-#include <kernel/thread.h>
-#include <platform/interrupts.h>
-#include <platform/debug.h>
-#include <platform/zynq.h>
-
-#define RXBUF_SIZE 16
-
-static cbuf_t uart_rx_buf[NUM_UARTS];
-
-static inline uintptr_t uart_to_ptr(unsigned int n) { return (n == 0) ? UART0_BASE : UART1_BASE; }
-static inline uint uart_to_irq(unsigned int n) { return (n == 0) ? UART0_INT : UART1_INT; }
-
-#define UART_REG(base, reg) (*REG32((base) + (reg)))
-
-static enum handler_return uart_irq(void *arg)
-{
- bool resched = false;
- uint port = (uint)arg;
- uintptr_t base = uart_to_ptr(port);
-
- /* read interrupt status and mask */
- uint32_t isr = UART_REG(base, UART_ISR);
- isr &= UART_REG(base, UART_IMR);
-
- if (isr & (1<<0)) { // rxtrig
- UART_REG(base, UART_ISR) = (1<< 0);
-
- while ((UART_REG(base, UART_SR) & (1<<1)) == 0) { // ~rempty
- char c = UART_REG(base, UART_FIFO);
- cbuf_write_char(&uart_rx_buf[port], c, false);
-
- resched = true;
- }
- }
-
- return resched ? INT_RESCHEDULE : INT_NO_RESCHEDULE;
-}
-
-void uart_init(void)
-{
- for (uint i = 0; i < NUM_UARTS; i++) {
- cbuf_initialize(&uart_rx_buf[i], RXBUF_SIZE);
-
- uintptr_t base = uart_to_ptr(i);
-
- // clear all irqs
- UART_REG(base, UART_IDR) = 0xffffffff;
-
- // set rx fifo trigger to 1
- UART_REG(base, UART_RXWM) = 1;
-
- // enable the receiver
- // NOTE: must clear rxdis and set rxen in the same write
- UART_REG(base, UART_CR) = (UART_REG(base, UART_CR) & ~(1<<3)) | (1 << 2);
-
- // enable rx interrupt
- UART_REG(base, UART_IER) = (1<<0); // rxtrig
-
- // set up interrupt handler
- register_int_handler(uart_to_irq(i), &uart_irq, (void *)i);
- unmask_interrupt(uart_to_irq(i));
- }
-}
-
-void uart_init_early(void)
-{
- for (uint i = 0; i < NUM_UARTS; i++) {
- uintptr_t base = uart_to_ptr(i);
-
- UART_REG(base, UART_BAUD_DIV) = UART_BRD_DIV(6);
- UART_REG(base, UART_BAUDGEN) = UART_BRG_DIV(0x3E);
-
- // reset the tx/rx path
- UART_REG(base, UART_CR) |= UART_CR_TXRES | UART_CR_RXRES;
- while ((UART_REG(base, UART_CR) & (UART_CR_TXRES | UART_CR_RXRES)) != 0)
- ;
-
- // n81, clock select ref_clk
- UART_REG(base, UART_MR) = UART_MR_PAR(0x4); // no parity
-
- // no flow
- UART_REG(base, UART_MODEMCR) = 0;
-
- UART_REG(base, UART_CR) = UART_CR_TXEN;
- }
-
- /* Configuration for the serial console */
- /*UART_REG(UART1_BASE, UART_CR) = 0x00000017;*/
- /*UART_REG(UART1_BASE, UART_MR) = 0x00000020;*/
-}
-
-int uart_putc(int port, char c)
-{
- DEBUG_ASSERT(port >= 0 && port < NUM_UARTS);
-
- uintptr_t base = uart_to_ptr(port);
-
- /* spin while fifo is full */
- while (UART_REG(base, UART_SR) & (1<<4))
- ;
- UART_REG(base, UART_FIFO) = c;
-
- return 1;
-}
-
-int uart_getc(int port, bool wait)
-{
- DEBUG_ASSERT(port >= 0 && port < NUM_UARTS);
-
- char c;
- if (cbuf_read_char(&uart_rx_buf[port], &c, wait) == 1)
- return c;
-
- return -1;
-}
-
-void uart_flush_tx(int port)
-{
- DEBUG_ASSERT(port >= 0 && port < NUM_UARTS);
-}
-
-void uart_flush_rx(int port)
-{
- DEBUG_ASSERT(port >= 0 && port < NUM_UARTS);
-}
-
-void uart_init_port(int port, uint baud)
-{
- DEBUG_ASSERT(port >= 0 && port < NUM_UARTS);
-
- PANIC_UNIMPLEMENTED;
-}
-