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