xref: /qemu/hw/char/escc.c (revision 5086c997)
1 /*
2  * QEMU ESCC (Z8030/Z8530/Z85C30/SCC/ESCC) serial port emulation
3  *
4  * Copyright (c) 2003-2005 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 
25 #include "qemu/osdep.h"
26 #include "hw/irq.h"
27 #include "hw/qdev-properties.h"
28 #include "hw/qdev-properties-system.h"
29 #include "hw/sysbus.h"
30 #include "migration/vmstate.h"
31 #include "qemu/module.h"
32 #include "hw/char/escc.h"
33 #include "ui/console.h"
34 #include "trace.h"
35 
36 /*
37  * Chipset docs:
38  * "Z80C30/Z85C30/Z80230/Z85230/Z85233 SCC/ESCC User Manual",
39  * http://www.zilog.com/docs/serial/scc_escc_um.pdf
40  *
41  * On Sparc32 this is the serial port, mouse and keyboard part of chip STP2001
42  * (Slave I/O), also produced as NCR89C105. See
43  * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
44  *
45  * The serial ports implement full AMD AM8530 or Zilog Z8530 chips,
46  * mouse and keyboard ports don't implement all functions and they are
47  * only asynchronous. There is no DMA.
48  *
49  * Z85C30 is also used on PowerMacs and m68k Macs.
50  *
51  * There are some small differences between Sparc version (sunzilog)
52  * and PowerMac (pmac):
53  *  Offset between control and data registers
54  *  There is some kind of lockup bug, but we can ignore it
55  *  CTS is inverted
56  *  DMA on pmac using DBDMA chip
57  *  pmac can do IRDA and faster rates, sunzilog can only do 38400
58  *  pmac baud rate generator clock is 3.6864 MHz, sunzilog 4.9152 MHz
59  *
60  * Linux driver for m68k Macs is the same as for PowerMac (pmac_zilog),
61  * but registers are grouped by type and not by channel:
62  * channel is selected by bit 0 of the address (instead of bit 1)
63  * and register is selected by bit 1 of the address (instead of bit 0).
64  */
65 
66 /*
67  * Modifications:
68  *  2006-Aug-10  Igor Kovalenko :   Renamed KBDQueue to SERIOQueue, implemented
69  *                                  serial mouse queue.
70  *                                  Implemented serial mouse protocol.
71  *
72  *  2010-May-23  Artyom Tarasenko:  Reworked IUS logic
73  */
74 
75 #define CHN_C(s) ((s)->chn == escc_chn_b ? 'b' : 'a')
76 
77 #define SERIAL_CTRL 0
78 #define SERIAL_DATA 1
79 
80 #define W_CMD     0
81 #define CMD_PTR_MASK   0x07
82 #define CMD_CMD_MASK   0x38
83 #define CMD_HI         0x08
84 #define CMD_CLR_TXINT  0x28
85 #define CMD_CLR_IUS    0x38
86 #define W_INTR    1
87 #define INTR_INTALL    0x01
88 #define INTR_TXINT     0x02
89 #define INTR_RXMODEMSK 0x18
90 #define INTR_RXINT1ST  0x08
91 #define INTR_RXINTALL  0x10
92 #define W_IVEC    2
93 #define W_RXCTRL  3
94 #define RXCTRL_RXEN    0x01
95 #define W_TXCTRL1 4
96 #define TXCTRL1_PAREN  0x01
97 #define TXCTRL1_PAREV  0x02
98 #define TXCTRL1_1STOP  0x04
99 #define TXCTRL1_1HSTOP 0x08
100 #define TXCTRL1_2STOP  0x0c
101 #define TXCTRL1_STPMSK 0x0c
102 #define TXCTRL1_CLK1X  0x00
103 #define TXCTRL1_CLK16X 0x40
104 #define TXCTRL1_CLK32X 0x80
105 #define TXCTRL1_CLK64X 0xc0
106 #define TXCTRL1_CLKMSK 0xc0
107 #define W_TXCTRL2 5
108 #define TXCTRL2_TXEN   0x08
109 #define TXCTRL2_BITMSK 0x60
110 #define TXCTRL2_5BITS  0x00
111 #define TXCTRL2_7BITS  0x20
112 #define TXCTRL2_6BITS  0x40
113 #define TXCTRL2_8BITS  0x60
114 #define W_SYNC1   6
115 #define W_SYNC2   7
116 #define W_TXBUF   8
117 #define W_MINTR   9
118 #define MINTR_STATUSHI 0x10
119 #define MINTR_RST_MASK 0xc0
120 #define MINTR_RST_B    0x40
121 #define MINTR_RST_A    0x80
122 #define MINTR_RST_ALL  0xc0
123 #define W_MISC1  10
124 #define W_CLOCK  11
125 #define CLOCK_TRXC     0x08
126 #define W_BRGLO  12
127 #define W_BRGHI  13
128 #define W_MISC2  14
129 #define MISC2_PLLDIS   0x30
130 #define W_EXTINT 15
131 #define EXTINT_DCD     0x08
132 #define EXTINT_SYNCINT 0x10
133 #define EXTINT_CTSINT  0x20
134 #define EXTINT_TXUNDRN 0x40
135 #define EXTINT_BRKINT  0x80
136 
137 #define R_STATUS  0
138 #define STATUS_RXAV    0x01
139 #define STATUS_ZERO    0x02
140 #define STATUS_TXEMPTY 0x04
141 #define STATUS_DCD     0x08
142 #define STATUS_SYNC    0x10
143 #define STATUS_CTS     0x20
144 #define STATUS_TXUNDRN 0x40
145 #define STATUS_BRK     0x80
146 #define R_SPEC    1
147 #define SPEC_ALLSENT   0x01
148 #define SPEC_BITS8     0x06
149 #define R_IVEC    2
150 #define IVEC_TXINTB    0x00
151 #define IVEC_LONOINT   0x06
152 #define IVEC_LORXINTA  0x0c
153 #define IVEC_LORXINTB  0x04
154 #define IVEC_LOTXINTA  0x08
155 #define IVEC_HINOINT   0x60
156 #define IVEC_HIRXINTA  0x30
157 #define IVEC_HIRXINTB  0x20
158 #define IVEC_HITXINTA  0x10
159 #define R_INTR    3
160 #define INTR_EXTINTB   0x01
161 #define INTR_TXINTB    0x02
162 #define INTR_RXINTB    0x04
163 #define INTR_EXTINTA   0x08
164 #define INTR_TXINTA    0x10
165 #define INTR_RXINTA    0x20
166 #define R_IPEN    4
167 #define R_TXCTRL1 5
168 #define R_TXCTRL2 6
169 #define R_BC      7
170 #define R_RXBUF   8
171 #define R_RXCTRL  9
172 #define R_MISC   10
173 #define R_MISC1  11
174 #define R_BRGLO  12
175 #define R_BRGHI  13
176 #define R_MISC1I 14
177 #define R_EXTINT 15
178 
179 static void handle_kbd_command(ESCCChannelState *s, int val);
180 static int serial_can_receive(void *opaque);
181 static void serial_receive_byte(ESCCChannelState *s, int ch);
182 
183 static int reg_shift(ESCCState *s)
184 {
185     return s->bit_swap ? s->it_shift + 1 : s->it_shift;
186 }
187 
188 static int chn_shift(ESCCState *s)
189 {
190     return s->bit_swap ? s->it_shift : s->it_shift + 1;
191 }
192 
193 static void clear_queue(void *opaque)
194 {
195     ESCCChannelState *s = opaque;
196     ESCCSERIOQueue *q = &s->queue;
197     q->rptr = q->wptr = q->count = 0;
198 }
199 
200 static void put_queue(void *opaque, int b)
201 {
202     ESCCChannelState *s = opaque;
203     ESCCSERIOQueue *q = &s->queue;
204 
205     trace_escc_put_queue(CHN_C(s), b);
206     if (q->count >= ESCC_SERIO_QUEUE_SIZE) {
207         return;
208     }
209     q->data[q->wptr] = b;
210     if (++q->wptr == ESCC_SERIO_QUEUE_SIZE) {
211         q->wptr = 0;
212     }
213     q->count++;
214     serial_receive_byte(s, 0);
215 }
216 
217 static uint32_t get_queue(void *opaque)
218 {
219     ESCCChannelState *s = opaque;
220     ESCCSERIOQueue *q = &s->queue;
221     int val;
222 
223     if (q->count == 0) {
224         return 0;
225     } else {
226         val = q->data[q->rptr];
227         if (++q->rptr == ESCC_SERIO_QUEUE_SIZE) {
228             q->rptr = 0;
229         }
230         q->count--;
231     }
232     trace_escc_get_queue(CHN_C(s), val);
233     if (q->count > 0)
234         serial_receive_byte(s, 0);
235     return val;
236 }
237 
238 static int escc_update_irq_chn(ESCCChannelState *s)
239 {
240     if ((((s->wregs[W_INTR] & INTR_TXINT) && (s->txint == 1)) ||
241          // tx ints enabled, pending
242          ((((s->wregs[W_INTR] & INTR_RXMODEMSK) == INTR_RXINT1ST) ||
243            ((s->wregs[W_INTR] & INTR_RXMODEMSK) == INTR_RXINTALL)) &&
244           s->rxint == 1) || // rx ints enabled, pending
245          ((s->wregs[W_EXTINT] & EXTINT_BRKINT) &&
246           (s->rregs[R_STATUS] & STATUS_BRK)))) { // break int e&p
247         return 1;
248     }
249     return 0;
250 }
251 
252 static void escc_update_irq(ESCCChannelState *s)
253 {
254     int irq;
255 
256     irq = escc_update_irq_chn(s);
257     irq |= escc_update_irq_chn(s->otherchn);
258 
259     trace_escc_update_irq(irq);
260     qemu_set_irq(s->irq, irq);
261 }
262 
263 static void escc_reset_chn(ESCCChannelState *s)
264 {
265     int i;
266 
267     s->reg = 0;
268     for (i = 0; i < ESCC_SERIAL_REGS; i++) {
269         s->rregs[i] = 0;
270         s->wregs[i] = 0;
271     }
272     s->wregs[W_TXCTRL1] = TXCTRL1_1STOP; // 1X divisor, 1 stop bit, no parity
273     s->wregs[W_MINTR] = MINTR_RST_ALL;
274     s->wregs[W_CLOCK] = CLOCK_TRXC; // Synch mode tx clock = TRxC
275     s->wregs[W_MISC2] = MISC2_PLLDIS; // PLL disabled
276     s->wregs[W_EXTINT] = EXTINT_DCD | EXTINT_SYNCINT | EXTINT_CTSINT |
277         EXTINT_TXUNDRN | EXTINT_BRKINT; // Enable most interrupts
278     if (s->disabled)
279         s->rregs[R_STATUS] = STATUS_TXEMPTY | STATUS_DCD | STATUS_SYNC |
280             STATUS_CTS | STATUS_TXUNDRN;
281     else
282         s->rregs[R_STATUS] = STATUS_TXEMPTY | STATUS_TXUNDRN;
283     s->rregs[R_SPEC] = SPEC_BITS8 | SPEC_ALLSENT;
284 
285     s->rx = s->tx = 0;
286     s->rxint = s->txint = 0;
287     s->rxint_under_svc = s->txint_under_svc = 0;
288     s->e0_mode = s->led_mode = s->caps_lock_mode = s->num_lock_mode = 0;
289     clear_queue(s);
290 }
291 
292 static void escc_reset(DeviceState *d)
293 {
294     ESCCState *s = ESCC(d);
295 
296     escc_reset_chn(&s->chn[0]);
297     escc_reset_chn(&s->chn[1]);
298 }
299 
300 static inline void set_rxint(ESCCChannelState *s)
301 {
302     s->rxint = 1;
303     /* XXX: missing daisy chainnig: escc_chn_b rx should have a lower priority
304        than chn_a rx/tx/special_condition service*/
305     s->rxint_under_svc = 1;
306     if (s->chn == escc_chn_a) {
307         s->rregs[R_INTR] |= INTR_RXINTA;
308         if (s->wregs[W_MINTR] & MINTR_STATUSHI)
309             s->otherchn->rregs[R_IVEC] = IVEC_HIRXINTA;
310         else
311             s->otherchn->rregs[R_IVEC] = IVEC_LORXINTA;
312     } else {
313         s->otherchn->rregs[R_INTR] |= INTR_RXINTB;
314         if (s->wregs[W_MINTR] & MINTR_STATUSHI)
315             s->rregs[R_IVEC] = IVEC_HIRXINTB;
316         else
317             s->rregs[R_IVEC] = IVEC_LORXINTB;
318     }
319     escc_update_irq(s);
320 }
321 
322 static inline void set_txint(ESCCChannelState *s)
323 {
324     s->txint = 1;
325     if (!s->rxint_under_svc) {
326         s->txint_under_svc = 1;
327         if (s->chn == escc_chn_a) {
328             if (s->wregs[W_INTR] & INTR_TXINT) {
329                 s->rregs[R_INTR] |= INTR_TXINTA;
330             }
331             if (s->wregs[W_MINTR] & MINTR_STATUSHI)
332                 s->otherchn->rregs[R_IVEC] = IVEC_HITXINTA;
333             else
334                 s->otherchn->rregs[R_IVEC] = IVEC_LOTXINTA;
335         } else {
336             s->rregs[R_IVEC] = IVEC_TXINTB;
337             if (s->wregs[W_INTR] & INTR_TXINT) {
338                 s->otherchn->rregs[R_INTR] |= INTR_TXINTB;
339             }
340         }
341     escc_update_irq(s);
342     }
343 }
344 
345 static inline void clr_rxint(ESCCChannelState *s)
346 {
347     s->rxint = 0;
348     s->rxint_under_svc = 0;
349     if (s->chn == escc_chn_a) {
350         if (s->wregs[W_MINTR] & MINTR_STATUSHI)
351             s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;
352         else
353             s->otherchn->rregs[R_IVEC] = IVEC_LONOINT;
354         s->rregs[R_INTR] &= ~INTR_RXINTA;
355     } else {
356         if (s->wregs[W_MINTR] & MINTR_STATUSHI)
357             s->rregs[R_IVEC] = IVEC_HINOINT;
358         else
359             s->rregs[R_IVEC] = IVEC_LONOINT;
360         s->otherchn->rregs[R_INTR] &= ~INTR_RXINTB;
361     }
362     if (s->txint)
363         set_txint(s);
364     escc_update_irq(s);
365 }
366 
367 static inline void clr_txint(ESCCChannelState *s)
368 {
369     s->txint = 0;
370     s->txint_under_svc = 0;
371     if (s->chn == escc_chn_a) {
372         if (s->wregs[W_MINTR] & MINTR_STATUSHI)
373             s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;
374         else
375             s->otherchn->rregs[R_IVEC] = IVEC_LONOINT;
376         s->rregs[R_INTR] &= ~INTR_TXINTA;
377     } else {
378         s->otherchn->rregs[R_INTR] &= ~INTR_TXINTB;
379         if (s->wregs[W_MINTR] & MINTR_STATUSHI)
380             s->rregs[R_IVEC] = IVEC_HINOINT;
381         else
382             s->rregs[R_IVEC] = IVEC_LONOINT;
383         s->otherchn->rregs[R_INTR] &= ~INTR_TXINTB;
384     }
385     if (s->rxint)
386         set_rxint(s);
387     escc_update_irq(s);
388 }
389 
390 static void escc_update_parameters(ESCCChannelState *s)
391 {
392     int speed, parity, data_bits, stop_bits;
393     QEMUSerialSetParams ssp;
394 
395     if (!qemu_chr_fe_backend_connected(&s->chr) || s->type != escc_serial)
396         return;
397 
398     if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREN) {
399         if (s->wregs[W_TXCTRL1] & TXCTRL1_PAREV)
400             parity = 'E';
401         else
402             parity = 'O';
403     } else {
404         parity = 'N';
405     }
406     if ((s->wregs[W_TXCTRL1] & TXCTRL1_STPMSK) == TXCTRL1_2STOP)
407         stop_bits = 2;
408     else
409         stop_bits = 1;
410     switch (s->wregs[W_TXCTRL2] & TXCTRL2_BITMSK) {
411     case TXCTRL2_5BITS:
412         data_bits = 5;
413         break;
414     case TXCTRL2_7BITS:
415         data_bits = 7;
416         break;
417     case TXCTRL2_6BITS:
418         data_bits = 6;
419         break;
420     default:
421     case TXCTRL2_8BITS:
422         data_bits = 8;
423         break;
424     }
425     speed = s->clock / ((s->wregs[W_BRGLO] | (s->wregs[W_BRGHI] << 8)) + 2);
426     switch (s->wregs[W_TXCTRL1] & TXCTRL1_CLKMSK) {
427     case TXCTRL1_CLK1X:
428         break;
429     case TXCTRL1_CLK16X:
430         speed /= 16;
431         break;
432     case TXCTRL1_CLK32X:
433         speed /= 32;
434         break;
435     default:
436     case TXCTRL1_CLK64X:
437         speed /= 64;
438         break;
439     }
440     ssp.speed = speed;
441     ssp.parity = parity;
442     ssp.data_bits = data_bits;
443     ssp.stop_bits = stop_bits;
444     trace_escc_update_parameters(CHN_C(s), speed, parity, data_bits, stop_bits);
445     qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
446 }
447 
448 static void escc_mem_write(void *opaque, hwaddr addr,
449                            uint64_t val, unsigned size)
450 {
451     ESCCState *serial = opaque;
452     ESCCChannelState *s;
453     uint32_t saddr;
454     int newreg, channel;
455 
456     val &= 0xff;
457     saddr = (addr >> reg_shift(serial)) & 1;
458     channel = (addr >> chn_shift(serial)) & 1;
459     s = &serial->chn[channel];
460     switch (saddr) {
461     case SERIAL_CTRL:
462         trace_escc_mem_writeb_ctrl(CHN_C(s), s->reg, val & 0xff);
463         newreg = 0;
464         switch (s->reg) {
465         case W_CMD:
466             newreg = val & CMD_PTR_MASK;
467             val &= CMD_CMD_MASK;
468             switch (val) {
469             case CMD_HI:
470                 newreg |= CMD_HI;
471                 break;
472             case CMD_CLR_TXINT:
473                 clr_txint(s);
474                 break;
475             case CMD_CLR_IUS:
476                 if (s->rxint_under_svc) {
477                     s->rxint_under_svc = 0;
478                     if (s->txint) {
479                         set_txint(s);
480                     }
481                 } else if (s->txint_under_svc) {
482                     s->txint_under_svc = 0;
483                 }
484                 escc_update_irq(s);
485                 break;
486             default:
487                 break;
488             }
489             break;
490         case W_INTR ... W_RXCTRL:
491         case W_SYNC1 ... W_TXBUF:
492         case W_MISC1 ... W_CLOCK:
493         case W_MISC2 ... W_EXTINT:
494             s->wregs[s->reg] = val;
495             break;
496         case W_TXCTRL1:
497         case W_TXCTRL2:
498             s->wregs[s->reg] = val;
499             escc_update_parameters(s);
500             break;
501         case W_BRGLO:
502         case W_BRGHI:
503             s->wregs[s->reg] = val;
504             s->rregs[s->reg] = val;
505             escc_update_parameters(s);
506             break;
507         case W_MINTR:
508             switch (val & MINTR_RST_MASK) {
509             case 0:
510             default:
511                 break;
512             case MINTR_RST_B:
513                 escc_reset_chn(&serial->chn[0]);
514                 return;
515             case MINTR_RST_A:
516                 escc_reset_chn(&serial->chn[1]);
517                 return;
518             case MINTR_RST_ALL:
519                 escc_reset(DEVICE(serial));
520                 return;
521             }
522             break;
523         default:
524             break;
525         }
526         if (s->reg == 0)
527             s->reg = newreg;
528         else
529             s->reg = 0;
530         break;
531     case SERIAL_DATA:
532         trace_escc_mem_writeb_data(CHN_C(s), val);
533         /*
534          * Lower the irq when data is written to the Tx buffer and no other
535          * interrupts are currently pending. The irq will be raised again once
536          * the Tx buffer becomes empty below.
537          */
538         s->txint = 0;
539         escc_update_irq(s);
540         s->tx = val;
541         if (s->wregs[W_TXCTRL2] & TXCTRL2_TXEN) { // tx enabled
542             if (qemu_chr_fe_backend_connected(&s->chr)) {
543                 /* XXX this blocks entire thread. Rewrite to use
544                  * qemu_chr_fe_write and background I/O callbacks */
545                 qemu_chr_fe_write_all(&s->chr, &s->tx, 1);
546             } else if (s->type == escc_kbd && !s->disabled) {
547                 handle_kbd_command(s, val);
548             }
549         }
550         s->rregs[R_STATUS] |= STATUS_TXEMPTY; // Tx buffer empty
551         s->rregs[R_SPEC] |= SPEC_ALLSENT; // All sent
552         set_txint(s);
553         break;
554     default:
555         break;
556     }
557 }
558 
559 static uint64_t escc_mem_read(void *opaque, hwaddr addr,
560                               unsigned size)
561 {
562     ESCCState *serial = opaque;
563     ESCCChannelState *s;
564     uint32_t saddr;
565     uint32_t ret;
566     int channel;
567 
568     saddr = (addr >> reg_shift(serial)) & 1;
569     channel = (addr >> chn_shift(serial)) & 1;
570     s = &serial->chn[channel];
571     switch (saddr) {
572     case SERIAL_CTRL:
573         trace_escc_mem_readb_ctrl(CHN_C(s), s->reg, s->rregs[s->reg]);
574         ret = s->rregs[s->reg];
575         s->reg = 0;
576         return ret;
577     case SERIAL_DATA:
578         s->rregs[R_STATUS] &= ~STATUS_RXAV;
579         clr_rxint(s);
580         if (s->type == escc_kbd || s->type == escc_mouse) {
581             ret = get_queue(s);
582         } else {
583             ret = s->rx;
584         }
585         trace_escc_mem_readb_data(CHN_C(s), ret);
586         qemu_chr_fe_accept_input(&s->chr);
587         return ret;
588     default:
589         break;
590     }
591     return 0;
592 }
593 
594 static const MemoryRegionOps escc_mem_ops = {
595     .read = escc_mem_read,
596     .write = escc_mem_write,
597     .endianness = DEVICE_NATIVE_ENDIAN,
598     .valid = {
599         .min_access_size = 1,
600         .max_access_size = 1,
601     },
602 };
603 
604 static int serial_can_receive(void *opaque)
605 {
606     ESCCChannelState *s = opaque;
607     int ret;
608 
609     if (((s->wregs[W_RXCTRL] & RXCTRL_RXEN) == 0) // Rx not enabled
610         || ((s->rregs[R_STATUS] & STATUS_RXAV) == STATUS_RXAV))
611         // char already available
612         ret = 0;
613     else
614         ret = 1;
615     return ret;
616 }
617 
618 static void serial_receive_byte(ESCCChannelState *s, int ch)
619 {
620     trace_escc_serial_receive_byte(CHN_C(s), ch);
621     s->rregs[R_STATUS] |= STATUS_RXAV;
622     s->rx = ch;
623     set_rxint(s);
624 }
625 
626 static void serial_receive_break(ESCCChannelState *s)
627 {
628     s->rregs[R_STATUS] |= STATUS_BRK;
629     escc_update_irq(s);
630 }
631 
632 static void serial_receive1(void *opaque, const uint8_t *buf, int size)
633 {
634     ESCCChannelState *s = opaque;
635     serial_receive_byte(s, buf[0]);
636 }
637 
638 static void serial_event(void *opaque, QEMUChrEvent event)
639 {
640     ESCCChannelState *s = opaque;
641     if (event == CHR_EVENT_BREAK)
642         serial_receive_break(s);
643 }
644 
645 static const VMStateDescription vmstate_escc_chn = {
646     .name ="escc_chn",
647     .version_id = 2,
648     .minimum_version_id = 1,
649     .fields = (VMStateField[]) {
650         VMSTATE_UINT32(vmstate_dummy, ESCCChannelState),
651         VMSTATE_UINT32(reg, ESCCChannelState),
652         VMSTATE_UINT32(rxint, ESCCChannelState),
653         VMSTATE_UINT32(txint, ESCCChannelState),
654         VMSTATE_UINT32(rxint_under_svc, ESCCChannelState),
655         VMSTATE_UINT32(txint_under_svc, ESCCChannelState),
656         VMSTATE_UINT8(rx, ESCCChannelState),
657         VMSTATE_UINT8(tx, ESCCChannelState),
658         VMSTATE_BUFFER(wregs, ESCCChannelState),
659         VMSTATE_BUFFER(rregs, ESCCChannelState),
660         VMSTATE_END_OF_LIST()
661     }
662 };
663 
664 static const VMStateDescription vmstate_escc = {
665     .name ="escc",
666     .version_id = 2,
667     .minimum_version_id = 1,
668     .fields = (VMStateField[]) {
669         VMSTATE_STRUCT_ARRAY(chn, ESCCState, 2, 2, vmstate_escc_chn,
670                              ESCCChannelState),
671         VMSTATE_END_OF_LIST()
672     }
673 };
674 
675 static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src,
676                                 InputEvent *evt)
677 {
678     ESCCChannelState *s = (ESCCChannelState *)dev;
679     int qcode, keycode;
680     InputKeyEvent *key;
681 
682     assert(evt->type == INPUT_EVENT_KIND_KEY);
683     key = evt->u.key.data;
684     qcode = qemu_input_key_value_to_qcode(key->key);
685     trace_escc_sunkbd_event_in(qcode, QKeyCode_str(qcode),
686                                key->down);
687 
688     if (qcode == Q_KEY_CODE_CAPS_LOCK) {
689         if (key->down) {
690             s->caps_lock_mode ^= 1;
691             if (s->caps_lock_mode == 2) {
692                 return; /* Drop second press */
693             }
694         } else {
695             s->caps_lock_mode ^= 2;
696             if (s->caps_lock_mode == 3) {
697                 return; /* Drop first release */
698             }
699         }
700     }
701 
702     if (qcode == Q_KEY_CODE_NUM_LOCK) {
703         if (key->down) {
704             s->num_lock_mode ^= 1;
705             if (s->num_lock_mode == 2) {
706                 return; /* Drop second press */
707             }
708         } else {
709             s->num_lock_mode ^= 2;
710             if (s->num_lock_mode == 3) {
711                 return; /* Drop first release */
712             }
713         }
714     }
715 
716     if (qcode > qemu_input_map_qcode_to_sun_len) {
717         return;
718     }
719 
720     keycode = qemu_input_map_qcode_to_sun[qcode];
721     if (!key->down) {
722         keycode |= 0x80;
723     }
724     trace_escc_sunkbd_event_out(keycode);
725     put_queue(s, keycode);
726 }
727 
728 static QemuInputHandler sunkbd_handler = {
729     .name  = "sun keyboard",
730     .mask  = INPUT_EVENT_MASK_KEY,
731     .event = sunkbd_handle_event,
732 };
733 
734 static void handle_kbd_command(ESCCChannelState *s, int val)
735 {
736     trace_escc_kbd_command(val);
737     if (s->led_mode) { // Ignore led byte
738         s->led_mode = 0;
739         return;
740     }
741     switch (val) {
742     case 1: // Reset, return type code
743         clear_queue(s);
744         put_queue(s, 0xff);
745         put_queue(s, 4); // Type 4
746         put_queue(s, 0x7f);
747         break;
748     case 0xe: // Set leds
749         s->led_mode = 1;
750         break;
751     case 7: // Query layout
752     case 0xf:
753         clear_queue(s);
754         put_queue(s, 0xfe);
755         put_queue(s, 0x21); /*  en-us layout */
756         break;
757     default:
758         break;
759     }
760 }
761 
762 static void sunmouse_event(void *opaque,
763                                int dx, int dy, int dz, int buttons_state)
764 {
765     ESCCChannelState *s = opaque;
766     int ch;
767 
768     trace_escc_sunmouse_event(dx, dy, buttons_state);
769     ch = 0x80 | 0x7; /* protocol start byte, no buttons pressed */
770 
771     if (buttons_state & MOUSE_EVENT_LBUTTON)
772         ch ^= 0x4;
773     if (buttons_state & MOUSE_EVENT_MBUTTON)
774         ch ^= 0x2;
775     if (buttons_state & MOUSE_EVENT_RBUTTON)
776         ch ^= 0x1;
777 
778     put_queue(s, ch);
779 
780     ch = dx;
781 
782     if (ch > 127)
783         ch = 127;
784     else if (ch < -127)
785         ch = -127;
786 
787     put_queue(s, ch & 0xff);
788 
789     ch = -dy;
790 
791     if (ch > 127)
792         ch = 127;
793     else if (ch < -127)
794         ch = -127;
795 
796     put_queue(s, ch & 0xff);
797 
798     // MSC protocol specify two extra motion bytes
799 
800     put_queue(s, 0);
801     put_queue(s, 0);
802 }
803 
804 static void escc_init1(Object *obj)
805 {
806     ESCCState *s = ESCC(obj);
807     SysBusDevice *dev = SYS_BUS_DEVICE(obj);
808     unsigned int i;
809 
810     for (i = 0; i < 2; i++) {
811         sysbus_init_irq(dev, &s->chn[i].irq);
812         s->chn[i].chn = 1 - i;
813     }
814     s->chn[0].otherchn = &s->chn[1];
815     s->chn[1].otherchn = &s->chn[0];
816 
817     sysbus_init_mmio(dev, &s->mmio);
818 }
819 
820 static void escc_realize(DeviceState *dev, Error **errp)
821 {
822     ESCCState *s = ESCC(dev);
823     unsigned int i;
824 
825     s->chn[0].disabled = s->disabled;
826     s->chn[1].disabled = s->disabled;
827 
828     memory_region_init_io(&s->mmio, OBJECT(dev), &escc_mem_ops, s, "escc",
829                           ESCC_SIZE << s->it_shift);
830 
831     for (i = 0; i < 2; i++) {
832         if (qemu_chr_fe_backend_connected(&s->chn[i].chr)) {
833             s->chn[i].clock = s->frequency / 2;
834             qemu_chr_fe_set_handlers(&s->chn[i].chr, serial_can_receive,
835                                      serial_receive1, serial_event, NULL,
836                                      &s->chn[i], NULL, true);
837         }
838     }
839 
840     if (s->chn[0].type == escc_mouse) {
841         qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0,
842                                      "QEMU Sun Mouse");
843     }
844     if (s->chn[1].type == escc_kbd) {
845         s->chn[1].hs = qemu_input_handler_register((DeviceState *)(&s->chn[1]),
846                                                    &sunkbd_handler);
847     }
848 }
849 
850 static Property escc_properties[] = {
851     DEFINE_PROP_UINT32("frequency", ESCCState, frequency,   0),
852     DEFINE_PROP_UINT32("it_shift",  ESCCState, it_shift,    0),
853     DEFINE_PROP_BOOL("bit_swap",    ESCCState, bit_swap,    false),
854     DEFINE_PROP_UINT32("disabled",  ESCCState, disabled,    0),
855     DEFINE_PROP_UINT32("chnBtype",  ESCCState, chn[0].type, 0),
856     DEFINE_PROP_UINT32("chnAtype",  ESCCState, chn[1].type, 0),
857     DEFINE_PROP_CHR("chrB", ESCCState, chn[0].chr),
858     DEFINE_PROP_CHR("chrA", ESCCState, chn[1].chr),
859     DEFINE_PROP_END_OF_LIST(),
860 };
861 
862 static void escc_class_init(ObjectClass *klass, void *data)
863 {
864     DeviceClass *dc = DEVICE_CLASS(klass);
865 
866     dc->reset = escc_reset;
867     dc->realize = escc_realize;
868     dc->vmsd = &vmstate_escc;
869     device_class_set_props(dc, escc_properties);
870     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
871 }
872 
873 static const TypeInfo escc_info = {
874     .name          = TYPE_ESCC,
875     .parent        = TYPE_SYS_BUS_DEVICE,
876     .instance_size = sizeof(ESCCState),
877     .instance_init = escc_init1,
878     .class_init    = escc_class_init,
879 };
880 
881 static void escc_register_types(void)
882 {
883     type_register_static(&escc_info);
884 }
885 
886 type_init(escc_register_types)
887