10d09e41aSPaolo Bonzini /* 20d09e41aSPaolo Bonzini * QEMU 16550A UART emulation 30d09e41aSPaolo Bonzini * 40d09e41aSPaolo Bonzini * Copyright (c) 2003-2004 Fabrice Bellard 50d09e41aSPaolo Bonzini * Copyright (c) 2008 Citrix Systems, Inc. 60d09e41aSPaolo Bonzini * 70d09e41aSPaolo Bonzini * Permission is hereby granted, free of charge, to any person obtaining a copy 80d09e41aSPaolo Bonzini * of this software and associated documentation files (the "Software"), to deal 90d09e41aSPaolo Bonzini * in the Software without restriction, including without limitation the rights 100d09e41aSPaolo Bonzini * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 110d09e41aSPaolo Bonzini * copies of the Software, and to permit persons to whom the Software is 120d09e41aSPaolo Bonzini * furnished to do so, subject to the following conditions: 130d09e41aSPaolo Bonzini * 140d09e41aSPaolo Bonzini * The above copyright notice and this permission notice shall be included in 150d09e41aSPaolo Bonzini * all copies or substantial portions of the Software. 160d09e41aSPaolo Bonzini * 170d09e41aSPaolo Bonzini * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 180d09e41aSPaolo Bonzini * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 190d09e41aSPaolo Bonzini * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 200d09e41aSPaolo Bonzini * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 210d09e41aSPaolo Bonzini * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 220d09e41aSPaolo Bonzini * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 230d09e41aSPaolo Bonzini * THE SOFTWARE. 240d09e41aSPaolo Bonzini */ 25175de524SMarkus Armbruster 260d09e41aSPaolo Bonzini #ifndef HW_SERIAL_H 27175de524SMarkus Armbruster #define HW_SERIAL_H 280d09e41aSPaolo Bonzini 294d43a603SMarc-André Lureau #include "chardev/char-fe.h" 300d09e41aSPaolo Bonzini #include "exec/memory.h" 318e8638faSPeter Crosthwaite #include "qemu/fifo8.h" 32db1015e9SEduardo Habkost #include "qom/object.h" 330d09e41aSPaolo Bonzini 340d09e41aSPaolo Bonzini #define UART_FIFO_LENGTH 16 /* 16550A Fifo Length */ 350d09e41aSPaolo Bonzini 36db1015e9SEduardo Habkost struct SerialState { 377781b88eSMarc-André Lureau DeviceState parent; 387781b88eSMarc-André Lureau 390d09e41aSPaolo Bonzini uint16_t divider; 400d09e41aSPaolo Bonzini uint8_t rbr; /* receive register */ 410d09e41aSPaolo Bonzini uint8_t thr; /* transmit holding register */ 420d09e41aSPaolo Bonzini uint8_t tsr; /* transmit shift register */ 430d09e41aSPaolo Bonzini uint8_t ier; 440d09e41aSPaolo Bonzini uint8_t iir; /* read only */ 450d09e41aSPaolo Bonzini uint8_t lcr; 460d09e41aSPaolo Bonzini uint8_t mcr; 470d09e41aSPaolo Bonzini uint8_t lsr; /* read only */ 480d09e41aSPaolo Bonzini uint8_t msr; /* read only */ 490d09e41aSPaolo Bonzini uint8_t scr; 500d09e41aSPaolo Bonzini uint8_t fcr; 510d09e41aSPaolo Bonzini uint8_t fcr_vmstate; /* we can't write directly this value 520d09e41aSPaolo Bonzini it has side effects */ 530d09e41aSPaolo Bonzini /* NOTE: this hidden state is necessary for tx irq generation as 540d09e41aSPaolo Bonzini it can be reset while reading iir */ 550d09e41aSPaolo Bonzini int thr_ipending; 560d09e41aSPaolo Bonzini qemu_irq irq; 57becdfa00SMarc-André Lureau CharBackend chr; 580d09e41aSPaolo Bonzini int last_break_enable; 5996651db4SMarc-André Lureau uint32_t baudbase; 60807464d8SPaolo Bonzini uint32_t tsr_retry; 61a1df76daSPaolo Bonzini guint watch_tag; 62*1fa2c0ebSPhilippe Mathieu-Daudé bool wakeup; 630d09e41aSPaolo Bonzini 640d09e41aSPaolo Bonzini /* Time when the last byte was successfully sent out of the tsr */ 650d09e41aSPaolo Bonzini uint64_t last_xmit_ts; 668e8638faSPeter Crosthwaite Fifo8 recv_fifo; 678e8638faSPeter Crosthwaite Fifo8 xmit_fifo; 688e8638faSPeter Crosthwaite /* Interrupt trigger level for recv_fifo */ 698e8638faSPeter Crosthwaite uint8_t recv_fifo_itl; 700d09e41aSPaolo Bonzini 711246b259SStefan Weil QEMUTimer *fifo_timeout_timer; 720d09e41aSPaolo Bonzini int timeout_ipending; /* timeout interrupt pending state */ 730d09e41aSPaolo Bonzini 740d09e41aSPaolo Bonzini uint64_t char_transmit_time; /* time to transmit a char in ticks */ 750d09e41aSPaolo Bonzini int poll_msl; 760d09e41aSPaolo Bonzini 771246b259SStefan Weil QEMUTimer *modem_status_poll; 780d09e41aSPaolo Bonzini MemoryRegion io; 79db1015e9SEduardo Habkost }; 80db1015e9SEduardo Habkost typedef struct SerialState SerialState; 810d09e41aSPaolo Bonzini 820d09e41aSPaolo Bonzini extern const VMStateDescription vmstate_serial; 830d09e41aSPaolo Bonzini extern const MemoryRegionOps serial_io_ops; 840d09e41aSPaolo Bonzini 857781b88eSMarc-André Lureau #define TYPE_SERIAL "serial" 868063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(SerialState, SERIAL) 877781b88eSMarc-André Lureau 880d09e41aSPaolo Bonzini #endif 89