From 191634d2854dfed448fc323195f9b65c305e2d77 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Tue, 14 Dec 2021 19:18:32 +0530 Subject: Add ns16550 serial device emulation The ns16550 is a widely use serial device so we add a simplified ns16550 device emulation which is good enough for Linux, OpenSBI, and hypervisors to use as console. Signed-off-by: Anup Patel --- riscv/devices.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'riscv/devices.h') diff --git a/riscv/devices.h b/riscv/devices.h index c9e4f66..df7b289 100644 --- a/riscv/devices.h +++ b/riscv/devices.h @@ -7,6 +7,7 @@ #include "abstract_interrupt_controller.h" #include "platform.h" #include +#include #include #include @@ -117,6 +118,36 @@ class plic_t : public abstract_device_t, public abstract_interrupt_controller_t reg_t offset, uint32_t val); }; +class ns16550_t : public abstract_device_t { + public: + ns16550_t(class bus_t *bus, abstract_interrupt_controller_t *intctrl, + uint32_t interrupt_id, uint32_t reg_shift, uint32_t reg_io_width); + bool load(reg_t addr, size_t len, uint8_t* bytes); + bool store(reg_t addr, size_t len, const uint8_t* bytes); + void tick(void); + size_t size() { return NS16550_SIZE; } + private: + class bus_t *bus; + abstract_interrupt_controller_t *intctrl; + uint32_t interrupt_id; + uint32_t reg_shift; + uint32_t reg_io_width; + std::queue rx_queue; + uint8_t dll; + uint8_t dlm; + uint8_t iir; + uint8_t ier; + uint8_t fcr; + uint8_t lcr; + uint8_t mcr; + uint8_t lsr; + uint8_t msr; + uint8_t scr; + void update_interrupt(void); + uint8_t rx_byte(void); + void tx_byte(uint8_t val); +}; + class mmio_plugin_device_t : public abstract_device_t { public: mmio_plugin_device_t(const std::string& name, const std::string& args); -- cgit v1.1