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
106 static void handle_kbd_command(ChannelState
*s
, int val
);
107 static int serial_can_receive(void *opaque
);
108 static void serial_receive_byte(ChannelState
*s
, int ch
);
109 static inline void set_txint(ChannelState
*s
);
111 static void clear_queue(void *opaque
)
113 ChannelState
*s
= opaque
;
114 SERIOQueue
*q
= &s
->queue
;
115 q
->rptr
= q
->wptr
= q
->count
= 0;
118 static void put_queue(void *opaque
, int b
)
120 ChannelState
*s
= opaque
;
121 SERIOQueue
*q
= &s
->queue
;
123 SER_DPRINTF("channel %c put: 0x%02x\n", CHN_C(s
), b
);
124 if (q
->count
>= SERIO_QUEUE_SIZE
)
126 q
->data
[q
->wptr
] = b
;
127 if (++q
->wptr
== SERIO_QUEUE_SIZE
)
130 serial_receive_byte(s
, 0);
133 static uint32_t get_queue(void *opaque
)
135 ChannelState
*s
= opaque
;
136 SERIOQueue
*q
= &s
->queue
;
142 val
= q
->data
[q
->rptr
];
143 if (++q
->rptr
== SERIO_QUEUE_SIZE
)
147 SER_DPRINTF("channel %c get 0x%02x\n", CHN_C(s
), val
);
149 serial_receive_byte(s
, 0);
153 static int slavio_serial_update_irq_chn(ChannelState
*s
)
155 if ((s
->wregs
[1] & 1) && // interrupts enabled
156 (((s
->wregs
[1] & 2) && s
->txint
== 1) || // tx ints enabled, pending
157 ((((s
->wregs
[1] & 0x18) == 8) || ((s
->wregs
[1] & 0x18) == 0x10)) &&
158 s
->rxint
== 1) || // rx ints enabled, pending
159 ((s
->wregs
[15] & 0x80) && (s
->rregs
[0] & 0x80)))) { // break int e&p
165 static void slavio_serial_update_irq(ChannelState
*s
)
169 irq
= slavio_serial_update_irq_chn(s
);
170 irq
|= slavio_serial_update_irq_chn(s
->otherchn
);
172 SER_DPRINTF("IRQ = %d\n", irq
);
173 qemu_set_irq(s
->irq
, irq
);
176 static void slavio_serial_reset_chn(ChannelState
*s
)
181 for (i
= 0; i
< SERIAL_MAXADDR
; i
++) {
194 s
->rxint
= s
->txint
= 0;
195 s
->rxint_under_svc
= s
->txint_under_svc
= 0;
199 static void slavio_serial_reset(void *opaque
)
201 SerialState
*s
= opaque
;
202 slavio_serial_reset_chn(&s
->chn
[0]);
203 slavio_serial_reset_chn(&s
->chn
[1]);
206 static inline void clr_rxint(ChannelState
*s
)
209 s
->rxint_under_svc
= 0;
210 if (s
->chn
== chn_a
) {
211 if (s
->wregs
[9] & 0x10)
212 s
->otherchn
->rregs
[2] = 0x60;
214 s
->otherchn
->rregs
[2] = 0x06;
215 s
->rregs
[3] &= ~0x20;
217 if (s
->wregs
[9] & 0x10)
221 s
->otherchn
->rregs
[3] &= ~4;
225 slavio_serial_update_irq(s
);
228 static inline void set_rxint(ChannelState
*s
)
231 if (!s
->txint_under_svc
) {
232 s
->rxint_under_svc
= 1;
233 if (s
->chn
== chn_a
) {
234 if (s
->wregs
[9] & 0x10)
235 s
->otherchn
->rregs
[2] = 0x30;
237 s
->otherchn
->rregs
[2] = 0x0c;
239 if (s
->wregs
[9] & 0x10)
248 s
->otherchn
->rregs
[3] |= 4;
249 slavio_serial_update_irq(s
);
252 static inline void clr_txint(ChannelState
*s
)
255 s
->txint_under_svc
= 0;
256 if (s
->chn
== chn_a
) {
257 if (s
->wregs
[9] & 0x10)
258 s
->otherchn
->rregs
[2] = 0x60;
260 s
->otherchn
->rregs
[2] = 0x06;
261 s
->rregs
[3] &= ~0x10;
263 if (s
->wregs
[9] & 0x10)
267 s
->otherchn
->rregs
[3] &= ~2;
271 slavio_serial_update_irq(s
);
274 static inline void set_txint(ChannelState
*s
)
277 if (!s
->rxint_under_svc
) {
278 s
->txint_under_svc
= 1;
279 if (s
->chn
== chn_a
) {
280 if (s
->wregs
[9] & 0x10)
281 s
->otherchn
->rregs
[2] = 0x10;
283 s
->otherchn
->rregs
[2] = 0x08;
291 s
->otherchn
->rregs
[3] |= 2;
292 slavio_serial_update_irq(s
);
295 static void slavio_serial_update_parameters(ChannelState
*s
)
297 int speed
, parity
, data_bits
, stop_bits
;
298 QEMUSerialSetParams ssp
;
300 if (!s
->chr
|| s
->type
!= ser
)
303 if (s
->wregs
[4] & 1) {
311 if ((s
->wregs
[4] & 0x0c) == 0x0c)
315 switch (s
->wregs
[5] & 0x60) {
330 speed
= 2457600 / ((s
->wregs
[12] | (s
->wregs
[13] << 8)) + 2);
331 switch (s
->wregs
[4] & 0xc0) {
347 ssp
.data_bits
= data_bits
;
348 ssp
.stop_bits
= stop_bits
;
349 SER_DPRINTF("channel %c: speed=%d parity=%c data=%d stop=%d\n", CHN_C(s
),
350 speed
, parity
, data_bits
, stop_bits
);
351 qemu_chr_ioctl(s
->chr
, CHR_IOCTL_SERIAL_SET_PARAMS
, &ssp
);
354 static void slavio_serial_mem_writeb(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
356 SerialState
*ser
= opaque
;
362 saddr
= (addr
& 3) >> 1;
363 channel
= (addr
& SERIAL_MAXADDR
) >> 2;
364 s
= &ser
->chn
[channel
];
367 SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s
), s
->reg
, val
& 0xff);
381 if (s
->rxint_under_svc
)
383 else if (s
->txint_under_svc
)
394 s
->wregs
[s
->reg
] = val
;
400 s
->wregs
[s
->reg
] = val
;
401 slavio_serial_update_parameters(s
);
404 switch (val
& 0xc0) {
409 slavio_serial_reset_chn(&ser
->chn
[1]);
412 slavio_serial_reset_chn(&ser
->chn
[0]);
415 slavio_serial_reset(ser
);
428 SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s
), val
);
429 if (s
->wregs
[5] & 8) { // tx enabled
432 qemu_chr_write(s
->chr
, &s
->tx
, 1);
433 else if (s
->type
== kbd
) {
434 handle_kbd_command(s
, val
);
436 s
->rregs
[0] |= 4; // Tx buffer empty
437 s
->rregs
[1] |= 1; // All sent
446 static uint32_t slavio_serial_mem_readb(void *opaque
, target_phys_addr_t addr
)
448 SerialState
*ser
= opaque
;
454 saddr
= (addr
& 3) >> 1;
455 channel
= (addr
& SERIAL_MAXADDR
) >> 2;
456 s
= &ser
->chn
[channel
];
459 SER_DPRINTF("Read channel %c, reg[%d] = %2.2x\n", CHN_C(s
), s
->reg
, s
->rregs
[s
->reg
]);
460 ret
= s
->rregs
[s
->reg
];
466 if (s
->type
== kbd
|| s
->type
== mouse
)
470 SER_DPRINTF("Read channel %c, ch %d\n", CHN_C(s
), ret
);
478 static int serial_can_receive(void *opaque
)
480 ChannelState
*s
= opaque
;
483 if (((s
->wregs
[3] & 1) == 0) // Rx not enabled
484 || ((s
->rregs
[0] & 1) == 1)) // char already available
488 //SER_DPRINTF("channel %c can receive %d\n", CHN_C(s), ret);
492 static void serial_receive_byte(ChannelState
*s
, int ch
)
494 SER_DPRINTF("channel %c put ch %d\n", CHN_C(s
), ch
);
500 static void serial_receive_break(ChannelState
*s
)
503 slavio_serial_update_irq(s
);
506 static void serial_receive1(void *opaque
, const uint8_t *buf
, int size
)
508 ChannelState
*s
= opaque
;
509 serial_receive_byte(s
, buf
[0]);
512 static void serial_event(void *opaque
, int event
)
514 ChannelState
*s
= opaque
;
515 if (event
== CHR_EVENT_BREAK
)
516 serial_receive_break(s
);
519 static CPUReadMemoryFunc
*slavio_serial_mem_read
[3] = {
520 slavio_serial_mem_readb
,
521 slavio_serial_mem_readb
,
522 slavio_serial_mem_readb
,
525 static CPUWriteMemoryFunc
*slavio_serial_mem_write
[3] = {
526 slavio_serial_mem_writeb
,
527 slavio_serial_mem_writeb
,
528 slavio_serial_mem_writeb
,
531 static void slavio_serial_save_chn(QEMUFile
*f
, ChannelState
*s
)
535 qemu_put_be32s(f
, &tmp
); /* unused, was IRQ. */
536 qemu_put_be32s(f
, &s
->reg
);
537 qemu_put_be32s(f
, &s
->rxint
);
538 qemu_put_be32s(f
, &s
->txint
);
539 qemu_put_be32s(f
, &s
->rxint_under_svc
);
540 qemu_put_be32s(f
, &s
->txint_under_svc
);
541 qemu_put_8s(f
, &s
->rx
);
542 qemu_put_8s(f
, &s
->tx
);
543 qemu_put_buffer(f
, s
->wregs
, 16);
544 qemu_put_buffer(f
, s
->rregs
, 16);
547 static void slavio_serial_save(QEMUFile
*f
, void *opaque
)
549 SerialState
*s
= opaque
;
551 slavio_serial_save_chn(f
, &s
->chn
[0]);
552 slavio_serial_save_chn(f
, &s
->chn
[1]);
555 static int slavio_serial_load_chn(QEMUFile
*f
, ChannelState
*s
, int version_id
)
562 qemu_get_be32s(f
, &tmp
); /* unused */
563 qemu_get_be32s(f
, &s
->reg
);
564 qemu_get_be32s(f
, &s
->rxint
);
565 qemu_get_be32s(f
, &s
->txint
);
566 if (version_id
>= 2) {
567 qemu_get_be32s(f
, &s
->rxint_under_svc
);
568 qemu_get_be32s(f
, &s
->txint_under_svc
);
570 qemu_get_8s(f
, &s
->rx
);
571 qemu_get_8s(f
, &s
->tx
);
572 qemu_get_buffer(f
, s
->wregs
, 16);
573 qemu_get_buffer(f
, s
->rregs
, 16);
577 static int slavio_serial_load(QEMUFile
*f
, void *opaque
, int version_id
)
579 SerialState
*s
= opaque
;
582 ret
= slavio_serial_load_chn(f
, &s
->chn
[0], version_id
);
585 ret
= slavio_serial_load_chn(f
, &s
->chn
[1], version_id
);
590 SerialState
*slavio_serial_init(int base
, qemu_irq irq
, CharDriverState
*chr1
,
591 CharDriverState
*chr2
)
593 int slavio_serial_io_memory
, i
;
596 s
= qemu_mallocz(sizeof(SerialState
));
600 slavio_serial_io_memory
= cpu_register_io_memory(0, slavio_serial_mem_read
, slavio_serial_mem_write
, s
);
601 cpu_register_physical_memory(base
, SERIAL_MAXADDR
, slavio_serial_io_memory
);
603 s
->chn
[0].chr
= chr1
;
604 s
->chn
[1].chr
= chr2
;
606 for (i
= 0; i
< 2; i
++) {
608 s
->chn
[i
].chn
= 1 - i
;
609 s
->chn
[i
].type
= ser
;
611 qemu_chr_add_handlers(s
->chn
[i
].chr
, serial_can_receive
,
612 serial_receive1
, serial_event
, &s
->chn
[i
]);
615 s
->chn
[0].otherchn
= &s
->chn
[1];
616 s
->chn
[1].otherchn
= &s
->chn
[0];
617 register_savevm("slavio_serial", base
, 2, slavio_serial_save
, slavio_serial_load
, s
);
618 qemu_register_reset(slavio_serial_reset
, s
);
619 slavio_serial_reset(s
);
623 static const uint8_t keycodes
[128] = {
624 127, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 53,
625 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 89, 76, 77, 78,
626 79, 80, 81, 82, 83, 84, 85, 86, 87, 42, 99, 88, 100, 101, 102, 103,
627 104, 105, 106, 107, 108, 109, 110, 47, 19, 121, 119, 5, 6, 8, 10, 12,
628 14, 16, 17, 18, 7, 98, 23, 68, 69, 70, 71, 91, 92, 93, 125, 112,
629 113, 114, 94, 50, 0, 0, 124, 9, 11, 0, 0, 0, 0, 0, 0, 0,
630 90, 0, 46, 22, 13, 111, 52, 20, 96, 24, 28, 74, 27, 123, 44, 66,
631 0, 45, 2, 4, 48, 0, 0, 21, 0, 0, 0, 0, 0, 120, 122, 67,
634 static void sunkbd_event(void *opaque
, int ch
)
636 ChannelState
*s
= opaque
;
637 int release
= ch
& 0x80;
639 ch
= keycodes
[ch
& 0x7f];
640 KBD_DPRINTF("Keycode %d (%s)\n", ch
, release
? "release" : "press");
641 put_queue(s
, ch
| release
);
644 static void handle_kbd_command(ChannelState
*s
, int val
)
646 KBD_DPRINTF("Command %d\n", val
);
648 case 1: // Reset, return type code
651 put_queue(s
, 4); // Type 4
653 case 7: // Query layout
657 put_queue(s
, 19); // XXX, layout?
664 static void sunmouse_event(void *opaque
,
665 int dx
, int dy
, int dz
, int buttons_state
)
667 ChannelState
*s
= opaque
;
670 MS_DPRINTF("dx=%d dy=%d buttons=%01x\n", dx
, dy
, buttons_state
);
672 ch
= 0x80 | 0x7; /* protocol start byte, no buttons pressed */
674 if (buttons_state
& MOUSE_EVENT_LBUTTON
)
676 if (buttons_state
& MOUSE_EVENT_MBUTTON
)
678 if (buttons_state
& MOUSE_EVENT_RBUTTON
)
690 put_queue(s
, ch
& 0xff);
699 put_queue(s
, ch
& 0xff);
701 // MSC protocol specify two extra motion bytes
707 void slavio_serial_ms_kbd_init(int base
, qemu_irq irq
)
709 int slavio_serial_io_memory
, i
;
712 s
= qemu_mallocz(sizeof(SerialState
));
715 for (i
= 0; i
< 2; i
++) {
717 s
->chn
[i
].chn
= 1 - i
;
718 s
->chn
[i
].chr
= NULL
;
720 s
->chn
[0].otherchn
= &s
->chn
[1];
721 s
->chn
[1].otherchn
= &s
->chn
[0];
722 s
->chn
[0].type
= mouse
;
723 s
->chn
[1].type
= kbd
;
725 slavio_serial_io_memory
= cpu_register_io_memory(0, slavio_serial_mem_read
, slavio_serial_mem_write
, s
);
726 cpu_register_physical_memory(base
, SERIAL_MAXADDR
, slavio_serial_io_memory
);
728 qemu_add_mouse_event_handler(sunmouse_event
, &s
->chn
[0], 0, "QEMU Sun Mouse");
729 qemu_add_kbd_event_handler(sunkbd_event
, &s
->chn
[1]);
730 register_savevm("slavio_serial_mouse", base
, 2, slavio_serial_save
, slavio_serial_load
, s
);
731 qemu_register_reset(slavio_serial_reset
, s
);
732 slavio_serial_reset(s
);