10d09e41aSPaolo Bonzini #ifndef HW_ESCC_H 2175de524SMarkus Armbruster #define HW_ESCC_H 30d09e41aSPaolo Bonzini 42cc75c32SLaurent Vivier #include "chardev/char-fe.h" 52cc75c32SLaurent Vivier #include "chardev/char-serial.h" 6ec150c7eSMarkus Armbruster #include "hw/sysbus.h" 72cc75c32SLaurent Vivier #include "ui/input.h" 8db1015e9SEduardo Habkost #include "qom/object.h" 92cc75c32SLaurent Vivier 100d09e41aSPaolo Bonzini /* escc.c */ 1181069b20SAndreas Färber #define TYPE_ESCC "escc" 120d09e41aSPaolo Bonzini #define ESCC_SIZE 4 130d09e41aSPaolo Bonzini 148063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(ESCCState, ESCC) 152cc75c32SLaurent Vivier 162cc75c32SLaurent Vivier typedef enum { 172cc75c32SLaurent Vivier escc_chn_a, escc_chn_b, 182cc75c32SLaurent Vivier } ESCCChnID; 192cc75c32SLaurent Vivier 202cc75c32SLaurent Vivier typedef enum { 212cc75c32SLaurent Vivier escc_serial, escc_kbd, escc_mouse, 222cc75c32SLaurent Vivier } ESCCChnType; 232cc75c32SLaurent Vivier 242cc75c32SLaurent Vivier #define ESCC_SERIO_QUEUE_SIZE 256 252cc75c32SLaurent Vivier 262cc75c32SLaurent Vivier typedef struct { 272cc75c32SLaurent Vivier uint8_t data[ESCC_SERIO_QUEUE_SIZE]; 282cc75c32SLaurent Vivier int rptr, wptr, count; 292cc75c32SLaurent Vivier } ESCCSERIOQueue; 302cc75c32SLaurent Vivier 312cc75c32SLaurent Vivier #define ESCC_SERIAL_REGS 16 322cc75c32SLaurent Vivier typedef struct ESCCChannelState { 332cc75c32SLaurent Vivier qemu_irq irq; 342cc75c32SLaurent Vivier uint32_t rxint, txint, rxint_under_svc, txint_under_svc; 352cc75c32SLaurent Vivier struct ESCCChannelState *otherchn; 362cc75c32SLaurent Vivier uint32_t reg; 372cc75c32SLaurent Vivier uint8_t wregs[ESCC_SERIAL_REGS], rregs[ESCC_SERIAL_REGS]; 382cc75c32SLaurent Vivier ESCCSERIOQueue queue; 392cc75c32SLaurent Vivier CharBackend chr; 402cc75c32SLaurent Vivier int e0_mode, led_mode, caps_lock_mode, num_lock_mode; 412cc75c32SLaurent Vivier int disabled; 422cc75c32SLaurent Vivier int clock; 432cc75c32SLaurent Vivier uint32_t vmstate_dummy; 442cc75c32SLaurent Vivier ESCCChnID chn; /* this channel, A (base+4) or B (base+0) */ 452cc75c32SLaurent Vivier ESCCChnType type; 462cc75c32SLaurent Vivier uint8_t rx, tx; 472cc75c32SLaurent Vivier QemuInputHandlerState *hs; 486b90a4cdSHenrik Carlqvist char *sunkbd_layout; 49*34acb67fSMark Cave-Ayland int sunmouse_dx; 50*34acb67fSMark Cave-Ayland int sunmouse_dy; 51*34acb67fSMark Cave-Ayland int sunmouse_buttons; 522cc75c32SLaurent Vivier } ESCCChannelState; 532cc75c32SLaurent Vivier 54db1015e9SEduardo Habkost struct ESCCState { 552cc75c32SLaurent Vivier SysBusDevice parent_obj; 562cc75c32SLaurent Vivier 572cc75c32SLaurent Vivier struct ESCCChannelState chn[2]; 582cc75c32SLaurent Vivier uint32_t it_shift; 59b43047a2SLaurent Vivier bool bit_swap; 602cc75c32SLaurent Vivier MemoryRegion mmio; 612cc75c32SLaurent Vivier uint32_t disabled; 622cc75c32SLaurent Vivier uint32_t frequency; 63db1015e9SEduardo Habkost }; 640d09e41aSPaolo Bonzini 650d09e41aSPaolo Bonzini #endif 66