2 * QEMU Sparc SLAVIO serial port emulation
4 * Copyright (c) 2003-2005 Fabrice Bellard
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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
26 //#define DEBUG_SERIAL
35 * This is the serial port, mouse and keyboard part of chip STP2001
36 * (Slave I/O), also produced as NCR89C105. See
37 * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
39 * The serial ports implement full AMD AM8530 or Zilog Z8530 chips,
40 * mouse and keyboard ports don't implement all functions and they are
41 * only asynchronous. There is no DMA.
47 * 2006-Aug-10 Igor Kovalenko : Renamed KBDQueue to SERIOQueue, implemented
49 * Implemented serial mouse protocol.
53 #define SER_DPRINTF(fmt, args...) \
54 do { printf("SER: " fmt , ##args); } while (0)
56 #define SER_DPRINTF(fmt, args...)
59 #define KBD_DPRINTF(fmt, args...) \
60 do { printf("KBD: " fmt , ##args); } while (0)
62 #define KBD_DPRINTF(fmt, args...)
65 #define MS_DPRINTF(fmt, args...) \
66 do { printf("MSC: " fmt , ##args); } while (0)
68 #define MS_DPRINTF(fmt, args...)
75 #define CHN_C(s) ((s)->chn == chn_b? 'b' : 'a')
81 #define SERIO_QUEUE_SIZE 256
84 uint8_t data[SERIO_QUEUE_SIZE];
85 int rptr, wptr, count;
88 typedef struct ChannelState {
91 int rxint, txint, rxint_under_svc, txint_under_svc;
92 chn_id_t chn; // this channel, A (base+4) or B (base+0)
94 struct ChannelState *otherchn;
95 uint8_t rx, tx, wregs[16], rregs[16];
101 struct ChannelState chn[2];
104 #define SERIAL_MAXADDR 7
105 #define SERIAL_SIZE (SERIAL_MAXADDR + 1)
107 static void handle_kbd_command(ChannelState *s, int val);
108 static int serial_can_receive(void *opaque);
109 static void serial_receive_byte(ChannelState *s, int ch);
110 static inline void set_txint(ChannelState *s);
112 static void clear_queue(void *opaque)
114 ChannelState *s = opaque;
115 SERIOQueue *q = &s->queue;
116 q->rptr = q->wptr = q->count = 0;
119 static void put_queue(void *opaque, int b)
121 ChannelState *s = opaque;
122 SERIOQueue *q = &s->queue;
124 SER_DPRINTF("channel %c put: 0x%02x\n", CHN_C(s), b);
125 if (q->count >= SERIO_QUEUE_SIZE)
127 q->data[q->wptr] = b;
128 if (++q->wptr == SERIO_QUEUE_SIZE)
131 serial_receive_byte(s, 0);
134 static uint32_t get_queue(void *opaque)
136 ChannelState *s = opaque;
137 SERIOQueue *q = &s->queue;
143 val = q->data[q->rptr];
144 if (++q->rptr == SERIO_QUEUE_SIZE)
148 SER_DPRINTF("channel %c get 0x%02x\n", CHN_C(s), val);
150 serial_receive_byte(s, 0);
154 static int slavio_serial_update_irq_chn(ChannelState *s)
156 if ((s->wregs[1] & 1) && // interrupts enabled
157 (((s->wregs[1] & 2) && s->txint == 1) || // tx ints enabled, pending
158 ((((s->wregs[1] & 0x18) == 8) || ((s->wregs[1] & 0x18) == 0x10)) &&
159 s->rxint == 1) || // rx ints enabled, pending
160 ((s->wregs[15] & 0x80) && (s->rregs[0] & 0x80)))) { // break int e&p
166 static void slavio_serial_update_irq(ChannelState *s)
170 irq = slavio_serial_update_irq_chn(s);
171 irq |= slavio_serial_update_irq_chn(s->otherchn);
173 SER_DPRINTF("IRQ = %d\n", irq);
174 qemu_set_irq(s->irq, irq);
177 static void slavio_serial_reset_chn(ChannelState *s)
182 for (i = 0; i < SERIAL_SIZE; i++) {
195 s->rxint = s->txint = 0;
196 s->rxint_under_svc = s->txint_under_svc = 0;
200 static void slavio_serial_reset(void *opaque)
202 SerialState *s = opaque;
203 slavio_serial_reset_chn(&s->chn[0]);
204 slavio_serial_reset_chn(&s->chn[1]);
207 static inline void clr_rxint(ChannelState *s)
210 s->rxint_under_svc = 0;
211 if (s->chn == chn_a) {
212 if (s->wregs[9] & 0x10)
213 s->otherchn->rregs[2] = 0x60;
215 s->otherchn->rregs[2] = 0x06;
216 s->rregs[3] &= ~0x20;
218 if (s->wregs[9] & 0x10)
222 s->otherchn->rregs[3] &= ~4;
226 slavio_serial_update_irq(s);
229 static inline void set_rxint(ChannelState *s)
232 if (!s->txint_under_svc) {
233 s->rxint_under_svc = 1;
234 if (s->chn == chn_a) {
235 if (s->wregs[9] & 0x10)
236 s->otherchn->rregs[2] = 0x30;
238 s->otherchn->rregs[2] = 0x0c;
240 if (s->wregs[9] & 0x10)
249 s->otherchn->rregs[3] |= 4;
250 slavio_serial_update_irq(s);
253 static inline void clr_txint(ChannelState *s)
256 s->txint_under_svc = 0;
257 if (s->chn == chn_a) {
258 if (s->wregs[9] & 0x10)
259 s->otherchn->rregs[2] = 0x60;
261 s->otherchn->rregs[2] = 0x06;
262 s->rregs[3] &= ~0x10;
264 if (s->wregs[9] & 0x10)
268 s->otherchn->rregs[3] &= ~2;
272 slavio_serial_update_irq(s);
275 static inline void set_txint(ChannelState *s)
278 if (!s->rxint_under_svc) {
279 s->txint_under_svc = 1;
280 if (s->chn == chn_a) {
281 if (s->wregs[9] & 0x10)
282 s->otherchn->rregs[2] = 0x10;
284 s->otherchn->rregs[2] = 0x08;
292 s->otherchn->rregs[3] |= 2;
293 slavio_serial_update_irq(s);
296 static void slavio_serial_update_parameters(ChannelState *s)
298 int speed, parity, data_bits, stop_bits;
299 QEMUSerialSetParams ssp;
301 if (!s->chr || s->type != ser)
304 if (s->wregs[4] & 1) {
312 if ((s->wregs[4] & 0x0c) == 0x0c)
316 switch (s->wregs[5] & 0x60) {
331 speed = 2457600 / ((s->wregs[12] | (s->wregs[13] << 8)) + 2);
332 switch (s->wregs[4] & 0xc0) {
348 ssp.data_bits = data_bits;
349 ssp.stop_bits = stop_bits;
350 SER_DPRINTF("channel %c: speed=%d parity=%c data=%d stop=%d\n", CHN_C(s),
351 speed, parity, data_bits, stop_bits);
352 qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
355 static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
357 SerialState *serial = opaque;
363 saddr = (addr & 3) >> 1;
364 channel = (addr & SERIAL_MAXADDR) >> 2;
365 s = &serial->chn[channel];
368 SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, val & 0xff);
382 if (s->rxint_under_svc)
384 else if (s->txint_under_svc)
395 s->wregs[s->reg] = val;
401 s->wregs[s->reg] = val;
402 slavio_serial_update_parameters(s);
405 switch (val & 0xc0) {
410 slavio_serial_reset_chn(&serial->chn[1]);
413 slavio_serial_reset_chn(&serial->chn[0]);
416 slavio_serial_reset(serial);
429 SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s), val);
431 if (s->wregs[5] & 8) { // tx enabled
433 qemu_chr_write(s->chr, &s->tx, 1);
434 else if (s->type == kbd) {
435 handle_kbd_command(s, val);
438 s->rregs[0] |= 4; // Tx buffer empty
439 s->rregs[1] |= 1; // All sent
447 static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr)
449 SerialState *serial = opaque;
455 saddr = (addr & 3) >> 1;
456 channel = (addr & SERIAL_MAXADDR) >> 2;
457 s = &serial->chn[channel];
460 SER_DPRINTF("Read channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, s->rregs[s->reg]);
461 ret = s->rregs[s->reg];
467 if (s->type == kbd || s->type == mouse)
471 SER_DPRINTF("Read channel %c, ch %d\n", CHN_C(s), ret);
479 static int serial_can_receive(void *opaque)
481 ChannelState *s = opaque;
484 if (((s->wregs[3] & 1) == 0) // Rx not enabled
485 || ((s->rregs[0] & 1) == 1)) // char already available
489 //SER_DPRINTF("channel %c can receive %d\n", CHN_C(s), ret);
493 static void serial_receive_byte(ChannelState *s, int ch)
495 SER_DPRINTF("channel %c put ch %d\n", CHN_C(s), ch);
501 static void serial_receive_break(ChannelState *s)
504 slavio_serial_update_irq(s);
507 static void serial_receive1(void *opaque, const uint8_t *buf, int size)
509 ChannelState *s = opaque;
510 serial_receive_byte(s, buf[0]);
513 static void serial_event(void *opaque, int event)
515 ChannelState *s = opaque;
516 if (event == CHR_EVENT_BREAK)
517 serial_receive_break(s);
520 static CPUReadMemoryFunc *slavio_serial_mem_read[3] = {
521 slavio_serial_mem_readb,
522 slavio_serial_mem_readb,
523 slavio_serial_mem_readb,
526 static CPUWriteMemoryFunc *slavio_serial_mem_write[3] = {
527 slavio_serial_mem_writeb,
528 slavio_serial_mem_writeb,
529 slavio_serial_mem_writeb,
532 static void slavio_serial_save_chn(QEMUFile *f, ChannelState *s)
536 qemu_put_be32s(f, &tmp); /* unused, was IRQ. */
537 qemu_put_be32s(f, &s->reg);
538 qemu_put_be32s(f, &s->rxint);
539 qemu_put_be32s(f, &s->txint);
540 qemu_put_be32s(f, &s->rxint_under_svc);
541 qemu_put_be32s(f, &s->txint_under_svc);
542 qemu_put_8s(f, &s->rx);
543 qemu_put_8s(f, &s->tx);
544 qemu_put_buffer(f, s->wregs, 16);
545 qemu_put_buffer(f, s->rregs, 16);
548 static void slavio_serial_save(QEMUFile *f, void *opaque)
550 SerialState *s = opaque;
552 slavio_serial_save_chn(f, &s->chn[0]);
553 slavio_serial_save_chn(f, &s->chn[1]);
556 static int slavio_serial_load_chn(QEMUFile *f, ChannelState *s, int version_id)
563 qemu_get_be32s(f, &tmp); /* unused */
564 qemu_get_be32s(f, &s->reg);
565 qemu_get_be32s(f, &s->rxint);
566 qemu_get_be32s(f, &s->txint);
567 if (version_id >= 2) {
568 qemu_get_be32s(f, &s->rxint_under_svc);
569 qemu_get_be32s(f, &s->txint_under_svc);
571 qemu_get_8s(f, &s->rx);
572 qemu_get_8s(f, &s->tx);
573 qemu_get_buffer(f, s->wregs, 16);
574 qemu_get_buffer(f, s->rregs, 16);
578 static int slavio_serial_load(QEMUFile *f, void *opaque, int version_id)
580 SerialState *s = opaque;
583 ret = slavio_serial_load_chn(f, &s->chn[0], version_id);
586 ret = slavio_serial_load_chn(f, &s->chn[1], version_id);
591 SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq,
592 CharDriverState *chr1, CharDriverState *chr2)
594 int slavio_serial_io_memory, i;
597 s = qemu_mallocz(sizeof(SerialState));
601 slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s);
602 cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory);
604 s->chn[0].chr = chr1;
605 s->chn[1].chr = chr2;
607 for (i = 0; i < 2; i++) {
609 s->chn[i].chn = 1 - i;
610 s->chn[i].type = ser;
612 qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive,
613 serial_receive1, serial_event, &s->chn[i]);
616 s->chn[0].otherchn = &s->chn[1];
617 s->chn[1].otherchn = &s->chn[0];
618 register_savevm("slavio_serial", base, 2, slavio_serial_save, slavio_serial_load, s);
619 qemu_register_reset(slavio_serial_reset, s);
620 slavio_serial_reset(s);
624 static const uint8_t keycodes[128] = {
625 127, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 53,
626 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 89, 76, 77, 78,
627 79, 80, 81, 82, 83, 84, 85, 86, 87, 42, 99, 88, 100, 101, 102, 103,
628 104, 105, 106, 107, 108, 109, 110, 47, 19, 121, 119, 5, 6, 8, 10, 12,
629 14, 16, 17, 18, 7, 98, 23, 68, 69, 70, 71, 91, 92, 93, 125, 112,
630 113, 114, 94, 50, 0, 0, 124, 9, 11, 0, 0, 0, 0, 0, 0, 0,
631 90, 0, 46, 22, 13, 111, 52, 20, 96, 24, 28, 74, 27, 123, 44, 66,
632 0, 45, 2, 4, 48, 0, 0, 21, 0, 0, 0, 0, 0, 120, 122, 67,
635 static void sunkbd_event(void *opaque, int ch)
637 ChannelState *s = opaque;
638 int release = ch & 0x80;
640 ch = keycodes[ch & 0x7f];
641 KBD_DPRINTF("Keycode %d (%s)\n", ch, release? "release" : "press");
642 put_queue(s, ch | release);
645 static void handle_kbd_command(ChannelState *s, int val)
647 KBD_DPRINTF("Command %d\n", val);
649 case 1: // Reset, return type code
652 put_queue(s, 4); // Type 4
654 case 7: // Query layout
658 put_queue(s, 19); // XXX, layout?
665 static void sunmouse_event(void *opaque,
666 int dx, int dy, int dz, int buttons_state)
668 ChannelState *s = opaque;
671 MS_DPRINTF("dx=%d dy=%d buttons=%01x\n", dx, dy, buttons_state);
673 ch = 0x80 | 0x7; /* protocol start byte, no buttons pressed */
675 if (buttons_state & MOUSE_EVENT_LBUTTON)
677 if (buttons_state & MOUSE_EVENT_MBUTTON)
679 if (buttons_state & MOUSE_EVENT_RBUTTON)
691 put_queue(s, ch & 0xff);
700 put_queue(s, ch & 0xff);
702 // MSC protocol specify two extra motion bytes
708 void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq)
710 int slavio_serial_io_memory, i;
713 s = qemu_mallocz(sizeof(SerialState));
716 for (i = 0; i < 2; i++) {
718 s->chn[i].chn = 1 - i;
719 s->chn[i].chr = NULL;
721 s->chn[0].otherchn = &s->chn[1];
722 s->chn[1].otherchn = &s->chn[0];
723 s->chn[0].type = mouse;
724 s->chn[1].type = kbd;
726 slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s);
727 cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory);
729 qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, "QEMU Sun Mouse");
730 qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]);
731 register_savevm("slavio_serial_mouse", base, 2, slavio_serial_save, slavio_serial_load, s);
732 qemu_register_reset(slavio_serial_reset, s);
733 slavio_serial_reset(s);