xref: /qemu/include/hw/char/escc.h (revision 8063396bf3459a810d24e3efd6110b8480f0de5b)
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"
6ec150c7eSMarkus Armbruster #include "hw/sysbus.h"
72cc75c32SLaurent Vivier #include "ui/input.h"
8db1015e9SEduardo Habkost #include "qom/object.h"
92cc75c32SLaurent Vivier 
10b4ed08e0Sblueswir1 /* escc.c */
1181069b20SAndreas Färber #define TYPE_ESCC "escc"
12b4ed08e0Sblueswir1 #define ESCC_SIZE 4
13b4ed08e0Sblueswir1 
14*8063396bSEduardo 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;
482cc75c32SLaurent Vivier } ESCCChannelState;
492cc75c32SLaurent Vivier 
50db1015e9SEduardo Habkost struct ESCCState {
512cc75c32SLaurent Vivier     SysBusDevice parent_obj;
522cc75c32SLaurent Vivier 
532cc75c32SLaurent Vivier     struct ESCCChannelState chn[2];
542cc75c32SLaurent Vivier     uint32_t it_shift;
55b43047a2SLaurent Vivier     bool bit_swap;
562cc75c32SLaurent Vivier     MemoryRegion mmio;
572cc75c32SLaurent Vivier     uint32_t disabled;
582cc75c32SLaurent Vivier     uint32_t frequency;
59db1015e9SEduardo Habkost };
60cb9c377fSPaolo Bonzini 
61cb9c377fSPaolo Bonzini #endif
62