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 #include "qemu-char.h"
30 //#define DEBUG_SERIAL
39 * This is the serial port, mouse and keyboard part of chip STP2001
40 * (Slave I/O), also produced as NCR89C105. See
41 * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
43 * The serial ports implement full AMD AM8530 or Zilog Z8530 chips,
44 * mouse and keyboard ports don't implement all functions and they are
45 * only asynchronous. There is no DMA.
51 * 2006-Aug-10 Igor Kovalenko : Renamed KBDQueue to SERIOQueue, implemented
53 * Implemented serial mouse protocol.
57 #define SER_DPRINTF(fmt, args...) \
58 do { printf("SER: " fmt , ##args); } while (0)
60 #define SER_DPRINTF(fmt, args...)
63 #define KBD_DPRINTF(fmt, args...) \
64 do { printf("KBD: " fmt , ##args); } while (0)
66 #define KBD_DPRINTF(fmt, args...)
69 #define MS_DPRINTF(fmt, args...) \
70 do { printf("MSC: " fmt , ##args); } while (0)
72 #define MS_DPRINTF(fmt, args...)
79 #define CHN_C(s) ((s)->chn == chn_b? 'b' : 'a')
85 #define SERIO_QUEUE_SIZE 256
88 uint8_t data[SERIO_QUEUE_SIZE];
89 int rptr, wptr, count;
92 typedef struct ChannelState {
95 int rxint, txint, rxint_under_svc, txint_under_svc;
96 chn_id_t chn; // this channel, A (base+4) or B (base+0)
98 struct ChannelState *otherchn;
99 uint8_t rx, tx, wregs[16], rregs[16];
101 CharDriverState *chr;
102 int e0_mode, led_mode, caps_lock_mode, num_lock_mode;
107 struct ChannelState chn[2];
110 #define SERIAL_MAXADDR 7
111 #define SERIAL_SIZE (SERIAL_MAXADDR + 1)
113 static void handle_kbd_command(ChannelState *s, int val);
114 static int serial_can_receive(void *opaque);
115 static void serial_receive_byte(ChannelState *s, int ch);
116 static inline void set_txint(ChannelState *s);
118 static void clear_queue(void *opaque)
120 ChannelState *s = opaque;
121 SERIOQueue *q = &s->queue;
122 q->rptr = q->wptr = q->count = 0;
125 static void put_queue(void *opaque, int b)
127 ChannelState *s = opaque;
128 SERIOQueue *q = &s->queue;
130 SER_DPRINTF("channel %c put: 0x%02x\n", CHN_C(s), b);
131 if (q->count >= SERIO_QUEUE_SIZE)
133 q->data[q->wptr] = b;
134 if (++q->wptr == SERIO_QUEUE_SIZE)
137 serial_receive_byte(s, 0);
140 static uint32_t get_queue(void *opaque)
142 ChannelState *s = opaque;
143 SERIOQueue *q = &s->queue;
149 val = q->data[q->rptr];
150 if (++q->rptr == SERIO_QUEUE_SIZE)
154 SER_DPRINTF("channel %c get 0x%02x\n", CHN_C(s), val);
156 serial_receive_byte(s, 0);
160 static int slavio_serial_update_irq_chn(ChannelState *s)
162 if ((s->wregs[1] & 1) && // interrupts enabled
163 (((s->wregs[1] & 2) && s->txint == 1) || // tx ints enabled, pending
164 ((((s->wregs[1] & 0x18) == 8) || ((s->wregs[1] & 0x18) == 0x10)) &&
165 s->rxint == 1) || // rx ints enabled, pending
166 ((s->wregs[15] & 0x80) && (s->rregs[0] & 0x80)))) { // break int e&p
172 static void slavio_serial_update_irq(ChannelState *s)
176 irq = slavio_serial_update_irq_chn(s);
177 irq |= slavio_serial_update_irq_chn(s->otherchn);
179 SER_DPRINTF("IRQ = %d\n", irq);
180 qemu_set_irq(s->irq, irq);
183 static void slavio_serial_reset_chn(ChannelState *s)
188 for (i = 0; i < SERIAL_SIZE; i++) {
204 s->rxint = s->txint = 0;
205 s->rxint_under_svc = s->txint_under_svc = 0;
206 s->e0_mode = s->led_mode = s->caps_lock_mode = s->num_lock_mode = 0;
210 static void slavio_serial_reset(void *opaque)
212 SerialState *s = opaque;
213 slavio_serial_reset_chn(&s->chn[0]);
214 slavio_serial_reset_chn(&s->chn[1]);
217 static inline void clr_rxint(ChannelState *s)
220 s->rxint_under_svc = 0;
221 if (s->chn == chn_a) {
222 if (s->wregs[9] & 0x10)
223 s->otherchn->rregs[2] = 0x60;
225 s->otherchn->rregs[2] = 0x06;
226 s->rregs[3] &= ~0x20;
228 if (s->wregs[9] & 0x10)
232 s->otherchn->rregs[3] &= ~4;
236 slavio_serial_update_irq(s);
239 static inline void set_rxint(ChannelState *s)
242 if (!s->txint_under_svc) {
243 s->rxint_under_svc = 1;
244 if (s->chn == chn_a) {
245 if (s->wregs[9] & 0x10)
246 s->otherchn->rregs[2] = 0x30;
248 s->otherchn->rregs[2] = 0x0c;
250 if (s->wregs[9] & 0x10)
259 s->otherchn->rregs[3] |= 4;
260 slavio_serial_update_irq(s);
263 static inline void clr_txint(ChannelState *s)
266 s->txint_under_svc = 0;
267 if (s->chn == chn_a) {
268 if (s->wregs[9] & 0x10)
269 s->otherchn->rregs[2] = 0x60;
271 s->otherchn->rregs[2] = 0x06;
272 s->rregs[3] &= ~0x10;
274 if (s->wregs[9] & 0x10)
278 s->otherchn->rregs[3] &= ~2;
282 slavio_serial_update_irq(s);
285 static inline void set_txint(ChannelState *s)
288 if (!s->rxint_under_svc) {
289 s->txint_under_svc = 1;
290 if (s->chn == chn_a) {
291 if (s->wregs[9] & 0x10)
292 s->otherchn->rregs[2] = 0x10;
294 s->otherchn->rregs[2] = 0x08;
302 s->otherchn->rregs[3] |= 2;
303 slavio_serial_update_irq(s);
306 static void slavio_serial_update_parameters(ChannelState *s)
308 int speed, parity, data_bits, stop_bits;
309 QEMUSerialSetParams ssp;
311 if (!s->chr || s->type != ser)
314 if (s->wregs[4] & 1) {
322 if ((s->wregs[4] & 0x0c) == 0x0c)
326 switch (s->wregs[5] & 0x60) {
341 speed = 2457600 / ((s->wregs[12] | (s->wregs[13] << 8)) + 2);
342 switch (s->wregs[4] & 0xc0) {
358 ssp.data_bits = data_bits;
359 ssp.stop_bits = stop_bits;
360 SER_DPRINTF("channel %c: speed=%d parity=%c data=%d stop=%d\n", CHN_C(s),
361 speed, parity, data_bits, stop_bits);
362 qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
365 static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
367 SerialState *serial = opaque;
373 saddr = (addr & 3) >> 1;
374 channel = (addr & SERIAL_MAXADDR) >> 2;
375 s = &serial->chn[channel];
378 SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, val & 0xff);
392 if (s->rxint_under_svc)
394 else if (s->txint_under_svc)
405 s->wregs[s->reg] = val;
411 s->wregs[s->reg] = val;
412 slavio_serial_update_parameters(s);
415 switch (val & 0xc0) {
420 slavio_serial_reset_chn(&serial->chn[1]);
423 slavio_serial_reset_chn(&serial->chn[0]);
426 slavio_serial_reset(serial);
439 SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s), val);
441 if (s->wregs[5] & 8) { // tx enabled
443 qemu_chr_write(s->chr, &s->tx, 1);
444 else if (s->type == kbd && !s->disabled) {
445 handle_kbd_command(s, val);
448 s->rregs[0] |= 4; // Tx buffer empty
449 s->rregs[1] |= 1; // All sent
457 static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr)
459 SerialState *serial = opaque;
465 saddr = (addr & 3) >> 1;
466 channel = (addr & SERIAL_MAXADDR) >> 2;
467 s = &serial->chn[channel];
470 SER_DPRINTF("Read channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, s->rregs[s->reg]);
471 ret = s->rregs[s->reg];
477 if (s->type == kbd || s->type == mouse)
481 SER_DPRINTF("Read channel %c, ch %d\n", CHN_C(s), ret);
483 qemu_chr_accept_input(s->chr);
491 static int serial_can_receive(void *opaque)
493 ChannelState *s = opaque;
496 if (((s->wregs[3] & 1) == 0) // Rx not enabled
497 || ((s->rregs[0] & 1) == 1)) // char already available
501 //SER_DPRINTF("channel %c can receive %d\n", CHN_C(s), ret);
505 static void serial_receive_byte(ChannelState *s, int ch)
507 SER_DPRINTF("channel %c put ch %d\n", CHN_C(s), ch);
513 static void serial_receive_break(ChannelState *s)
516 slavio_serial_update_irq(s);
519 static void serial_receive1(void *opaque, const uint8_t *buf, int size)
521 ChannelState *s = opaque;
522 serial_receive_byte(s, buf[0]);
525 static void serial_event(void *opaque, int event)
527 ChannelState *s = opaque;
528 if (event == CHR_EVENT_BREAK)
529 serial_receive_break(s);
532 static CPUReadMemoryFunc *slavio_serial_mem_read[3] = {
533 slavio_serial_mem_readb,
534 slavio_serial_mem_readb,
535 slavio_serial_mem_readb,
538 static CPUWriteMemoryFunc *slavio_serial_mem_write[3] = {
539 slavio_serial_mem_writeb,
540 slavio_serial_mem_writeb,
541 slavio_serial_mem_writeb,
544 static void slavio_serial_save_chn(QEMUFile *f, ChannelState *s)
548 qemu_put_be32s(f, &tmp); /* unused, was IRQ. */
549 qemu_put_be32s(f, &s->reg);
550 qemu_put_be32s(f, &s->rxint);
551 qemu_put_be32s(f, &s->txint);
552 qemu_put_be32s(f, &s->rxint_under_svc);
553 qemu_put_be32s(f, &s->txint_under_svc);
554 qemu_put_8s(f, &s->rx);
555 qemu_put_8s(f, &s->tx);
556 qemu_put_buffer(f, s->wregs, 16);
557 qemu_put_buffer(f, s->rregs, 16);
560 static void slavio_serial_save(QEMUFile *f, void *opaque)
562 SerialState *s = opaque;
564 slavio_serial_save_chn(f, &s->chn[0]);
565 slavio_serial_save_chn(f, &s->chn[1]);
568 static int slavio_serial_load_chn(QEMUFile *f, ChannelState *s, int version_id)
575 qemu_get_be32s(f, &tmp); /* unused */
576 qemu_get_be32s(f, &s->reg);
577 qemu_get_be32s(f, &s->rxint);
578 qemu_get_be32s(f, &s->txint);
579 if (version_id >= 2) {
580 qemu_get_be32s(f, &s->rxint_under_svc);
581 qemu_get_be32s(f, &s->txint_under_svc);
583 qemu_get_8s(f, &s->rx);
584 qemu_get_8s(f, &s->tx);
585 qemu_get_buffer(f, s->wregs, 16);
586 qemu_get_buffer(f, s->rregs, 16);
590 static int slavio_serial_load(QEMUFile *f, void *opaque, int version_id)
592 SerialState *s = opaque;
595 ret = slavio_serial_load_chn(f, &s->chn[0], version_id);
598 ret = slavio_serial_load_chn(f, &s->chn[1], version_id);
603 SerialState *slavio_serial_init(target_phys_addr_t base, qemu_irq irq,
604 CharDriverState *chr1, CharDriverState *chr2)
606 int slavio_serial_io_memory, i;
609 s = qemu_mallocz(sizeof(SerialState));
613 slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s);
614 cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory);
616 s->chn[0].chr = chr1;
617 s->chn[1].chr = chr2;
618 s->chn[0].disabled = 0;
619 s->chn[1].disabled = 0;
621 for (i = 0; i < 2; i++) {
623 s->chn[i].chn = 1 - i;
624 s->chn[i].type = ser;
626 qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive,
627 serial_receive1, serial_event, &s->chn[i]);
630 s->chn[0].otherchn = &s->chn[1];
631 s->chn[1].otherchn = &s->chn[0];
632 register_savevm("slavio_serial", base, 2, slavio_serial_save, slavio_serial_load, s);
633 qemu_register_reset(slavio_serial_reset, s);
634 slavio_serial_reset(s);
638 static const uint8_t keycodes[128] = {
639 127, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 53,
640 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 89, 76, 77, 78,
641 79, 80, 81, 82, 83, 84, 85, 86, 87, 42, 99, 88, 100, 101, 102, 103,
642 104, 105, 106, 107, 108, 109, 110, 47, 19, 121, 119, 5, 6, 8, 10, 12,
643 14, 16, 17, 18, 7, 98, 23, 68, 69, 70, 71, 91, 92, 93, 125, 112,
644 113, 114, 94, 50, 0, 0, 124, 9, 11, 0, 0, 0, 0, 0, 0, 0,
645 90, 0, 46, 22, 13, 111, 52, 20, 96, 24, 28, 74, 27, 123, 44, 66,
646 0, 45, 2, 4, 48, 0, 0, 21, 0, 0, 0, 0, 0, 120, 122, 67,
649 static const uint8_t e0_keycodes[128] = {
650 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
651 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 76, 0, 0,
652 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
653 0, 0, 0, 0, 0, 109, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0,
654 0, 0, 0, 0, 0, 0, 0, 68, 69, 70, 0, 91, 0, 93, 0, 112,
655 113, 114, 94, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
656 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
657 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
660 static void sunkbd_event(void *opaque, int ch)
662 ChannelState *s = opaque;
663 int release = ch & 0x80;
665 KBD_DPRINTF("Untranslated keycode %2.2x (%s)\n", ch, release? "release" : "press");
667 case 58: // Caps lock press
668 s->caps_lock_mode ^= 1;
669 if (s->caps_lock_mode == 2)
670 return; // Drop second press
672 case 69: // Num lock press
673 s->num_lock_mode ^= 1;
674 if (s->num_lock_mode == 2)
675 return; // Drop second press
677 case 186: // Caps lock release
678 s->caps_lock_mode ^= 2;
679 if (s->caps_lock_mode == 3)
680 return; // Drop first release
682 case 197: // Num lock release
683 s->num_lock_mode ^= 2;
684 if (s->num_lock_mode == 3)
685 return; // Drop first release
695 ch = e0_keycodes[ch & 0x7f];
697 ch = keycodes[ch & 0x7f];
699 KBD_DPRINTF("Translated keycode %2.2x\n", ch);
700 put_queue(s, ch | release);
703 static void handle_kbd_command(ChannelState *s, int val)
705 KBD_DPRINTF("Command %d\n", val);
706 if (s->led_mode) { // Ignore led byte
711 case 1: // Reset, return type code
714 put_queue(s, 4); // Type 4
717 case 0xe: // Set leds
720 case 7: // Query layout
724 put_queue(s, 0); // XXX, layout?
731 static void sunmouse_event(void *opaque,
732 int dx, int dy, int dz, int buttons_state)
734 ChannelState *s = opaque;
737 MS_DPRINTF("dx=%d dy=%d buttons=%01x\n", dx, dy, buttons_state);
739 ch = 0x80 | 0x7; /* protocol start byte, no buttons pressed */
741 if (buttons_state & MOUSE_EVENT_LBUTTON)
743 if (buttons_state & MOUSE_EVENT_MBUTTON)
745 if (buttons_state & MOUSE_EVENT_RBUTTON)
757 put_queue(s, ch & 0xff);
766 put_queue(s, ch & 0xff);
768 // MSC protocol specify two extra motion bytes
774 void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq,
777 int slavio_serial_io_memory, i;
780 s = qemu_mallocz(sizeof(SerialState));
783 for (i = 0; i < 2; i++) {
785 s->chn[i].chn = 1 - i;
786 s->chn[i].chr = NULL;
788 s->chn[0].otherchn = &s->chn[1];
789 s->chn[1].otherchn = &s->chn[0];
790 s->chn[0].type = mouse;
791 s->chn[1].type = kbd;
792 s->chn[0].disabled = disabled;
793 s->chn[1].disabled = disabled;
795 slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s);
796 cpu_register_physical_memory(base, SERIAL_SIZE, slavio_serial_io_memory);
798 qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, "QEMU Sun Mouse");
799 qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]);
800 register_savevm("slavio_serial_mouse", base, 2, slavio_serial_save, slavio_serial_load, s);
801 qemu_register_reset(slavio_serial_reset, s);
802 slavio_serial_reset(s);