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