1/*
2 * Copyright 2017, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12
13#include "../../chardev.h"
14#include <string.h>
15#include <stdlib.h>
16
17#define IMXUART_DLL             0x000
18#define IMXUART_RHR             0x000
19#define IMXUART_THR             0x000
20
21#define IMXUART_LSR             0x014
22#define IMXUART_LSR_RXFIFIOE    (1<<0)
23#define IMXUART_LSR_RXOE        (1<<1)
24#define IMXUART_LSR_RXPE        (1<<2)
25#define IMXUART_LSR_RXFE        (1<<3)
26#define IMXUART_LSR_RXBI        (1<<4)
27#define IMXUART_LSR_TXFIFOE     (1<<5)
28#define IMXUART_LSR_TXSRE       (1<<6)
29#define IMXUART_LSR_RXFIFOSTS   (1<<7)
30
31#define REG_PTR(base, offset)  ((volatile uint32_t *)((char*)(base) + (offset)))
32
33int uart_getchar(ps_chardevice_t* d)
34{
35    if (*REG_PTR(d->vaddr, IMXUART_LSR) & IMXUART_LSR_RXFIFIOE) {
36        return *REG_PTR(d->vaddr, IMXUART_RHR);
37    } else {
38        return -1;
39    }
40}
41
42int uart_putchar(ps_chardevice_t* d, int c)
43{
44    if (*REG_PTR(d->vaddr, IMXUART_LSR) & IMXUART_LSR_TXFIFOE) {
45        *REG_PTR(d->vaddr, IMXUART_THR) = c;
46        return c;
47    } else {
48        return -1;
49    }
50}
51
52static void uart_handle_irq(ps_chardevice_t* d)
53{
54    /* TODO */
55}
56
57int
58uart_init(const struct dev_defn* defn,
59          const ps_io_ops_t* ops,
60          ps_chardevice_t* dev)
61{
62    void* vaddr = chardev_map(defn, ops);
63    memset(dev, 0, sizeof(*dev));
64    if (vaddr == NULL) {
65        return -1;
66    }
67    dev->id         = defn->id;
68    dev->vaddr      = vaddr;
69    dev->read       = &uart_read;
70    dev->write      = &uart_write;
71    dev->handle_irq = &uart_handle_irq;
72    dev->irqs       = defn->irqs;
73    dev->ioops      = *ops;
74
75    return 0;
76}
77