xref: /openbmc/qemu/include/hw/char/escc.h (revision ea9cdbcf3a0b8d5497cddf87990f1b39d8f3bb0a)
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