xref: /qemu/include/hw/char/escc.h (revision ec150c7e09071bcf51bfaa8071fe23efb6df69f7)
1cb9c377fSPaolo Bonzini #ifndef HW_ESCC_H
2175de524SMarkus Armbruster #define HW_ESCC_H
3cb9c377fSPaolo Bonzini 
42cc75c32SLaurent Vivier #include "chardev/char-fe.h"
52cc75c32SLaurent Vivier #include "chardev/char-serial.h"
6*ec150c7eSMarkus Armbruster #include "hw/sysbus.h"
72cc75c32SLaurent Vivier #include "ui/input.h"
82cc75c32SLaurent Vivier 
9b4ed08e0Sblueswir1 /* escc.c */
1081069b20SAndreas Färber #define TYPE_ESCC "escc"
11b4ed08e0Sblueswir1 #define ESCC_SIZE 4
12b4ed08e0Sblueswir1 
132cc75c32SLaurent Vivier #define ESCC(obj) OBJECT_CHECK(ESCCState, (obj), TYPE_ESCC)
142cc75c32SLaurent Vivier 
152cc75c32SLaurent Vivier typedef enum {
162cc75c32SLaurent Vivier     escc_chn_a, escc_chn_b,
172cc75c32SLaurent Vivier } ESCCChnID;
182cc75c32SLaurent Vivier 
192cc75c32SLaurent Vivier typedef enum {
202cc75c32SLaurent Vivier     escc_serial, escc_kbd, escc_mouse,
212cc75c32SLaurent Vivier } ESCCChnType;
222cc75c32SLaurent Vivier 
232cc75c32SLaurent Vivier #define ESCC_SERIO_QUEUE_SIZE 256
242cc75c32SLaurent Vivier 
252cc75c32SLaurent Vivier typedef struct {
262cc75c32SLaurent Vivier     uint8_t data[ESCC_SERIO_QUEUE_SIZE];
272cc75c32SLaurent Vivier     int rptr, wptr, count;
282cc75c32SLaurent Vivier } ESCCSERIOQueue;
292cc75c32SLaurent Vivier 
302cc75c32SLaurent Vivier #define ESCC_SERIAL_REGS 16
312cc75c32SLaurent Vivier typedef struct ESCCChannelState {
322cc75c32SLaurent Vivier     qemu_irq irq;
332cc75c32SLaurent Vivier     uint32_t rxint, txint, rxint_under_svc, txint_under_svc;
342cc75c32SLaurent Vivier     struct ESCCChannelState *otherchn;
352cc75c32SLaurent Vivier     uint32_t reg;
362cc75c32SLaurent Vivier     uint8_t wregs[ESCC_SERIAL_REGS], rregs[ESCC_SERIAL_REGS];
372cc75c32SLaurent Vivier     ESCCSERIOQueue queue;
382cc75c32SLaurent Vivier     CharBackend chr;
392cc75c32SLaurent Vivier     int e0_mode, led_mode, caps_lock_mode, num_lock_mode;
402cc75c32SLaurent Vivier     int disabled;
412cc75c32SLaurent Vivier     int clock;
422cc75c32SLaurent Vivier     uint32_t vmstate_dummy;
432cc75c32SLaurent Vivier     ESCCChnID chn; /* this channel, A (base+4) or B (base+0) */
442cc75c32SLaurent Vivier     ESCCChnType type;
452cc75c32SLaurent Vivier     uint8_t rx, tx;
462cc75c32SLaurent Vivier     QemuInputHandlerState *hs;
472cc75c32SLaurent Vivier } ESCCChannelState;
482cc75c32SLaurent Vivier 
492cc75c32SLaurent Vivier typedef struct ESCCState {
502cc75c32SLaurent Vivier     SysBusDevice parent_obj;
512cc75c32SLaurent Vivier 
522cc75c32SLaurent Vivier     struct ESCCChannelState chn[2];
532cc75c32SLaurent Vivier     uint32_t it_shift;
542cc75c32SLaurent Vivier     MemoryRegion mmio;
552cc75c32SLaurent Vivier     uint32_t disabled;
562cc75c32SLaurent Vivier     uint32_t frequency;
572cc75c32SLaurent Vivier } ESCCState;
58cb9c377fSPaolo Bonzini 
59cb9c377fSPaolo Bonzini #endif
60