1/**
2 * \file
3 * \brief Virtual 16550 UART controller.
4 */
5
6/*
7 * Copyright (c) 2009, 2012, ETH Zurich.
8 * All rights reserved.
9 *
10 * This file is distributed under the terms in the attached LICENSE file.
11 * If you do not find this file, copies can be found by writing to:
12 * ETH Zurich D-INFK, CAB F.78, Universitaetstrasse 6, CH-8092 Zurich,
13 * Attn: Systems Group.
14 */
15
16#ifndef PC16550D_H
17#define PC16550D_H
18
19#include <barrelfish/waitset.h>
20#include <if/serial_defs.h>
21
22#include <stdbool.h>
23#include <stdint.h>
24
25#include "lpc.h"
26#include <dev/pc16550d_mem_dev.h>
27
28#define PC16550D_FIFO_BITS      4
29#define PC16550D_FIFO_SIZE      (1 << PC16550D_FIFO_BITS)
30#define PC16550D_FIFO_MASK      (PC16550D_FIFO_SIZE - 1)
31
32enum pc16550d_forward {
33    PC16550d_FORWARD_NONE, ///< do not forward data (disconnected)
34    PC16550d_FORWARD_UART, ///< forward data to host uart
35    PC16550d_FORWARD_FILE, ///< NYI
36};
37
38struct pc16550d_forward_uart {
39    bool connected;
40    struct waitset *ws;
41    struct serial_binding *binding;
42};
43
44struct pc16550d {
45    uint16_t        base_port;
46    uint8_t         irq;
47    struct lpc      *lpc;
48    pc16550d_mem_t  dev;
49    uint8_t         regs[12];
50    char            fifo_in[PC16550D_FIFO_SIZE];
51    unsigned int    fifo_in_produced;
52    unsigned int    fifo_in_consumed;
53    enum pc16550d_forward forward_state;
54    struct pc16550d_forward_uart *forward_uart_state;
55};
56
57struct pc16550d *pc16550d_new (uint16_t base_port, uint8_t irq, struct lpc *lpc);
58int pc16550d_handle_pio_read (struct pc16550d *u, uint16_t port,
59                              enum opsize size, uint32_t *val);
60int pc16550d_handle_pio_write (struct pc16550d *u, uint16_t port,
61                               enum opsize size, uint32_t val);
62void pc16550d_attach_to_host_uart (struct pc16550d *user_data,
63                                   const char *host_uart);
64
65#endif //PC16550D_H
66