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)
55 #define pic_set_irq_new(intctl, irq, level) \
56 do { printf("SER: set_irq(%d): %d\n", (irq), (level)); \
57 pic_set_irq_new((intctl), (irq),(level));} while (0)
59 #define SER_DPRINTF(fmt, args...)
62 #define KBD_DPRINTF(fmt, args...) \
63 do { printf("KBD: " fmt , ##args); } while (0)
65 #define KBD_DPRINTF(fmt, args...)
68 #define MS_DPRINTF(fmt, args...) \
69 do { printf("MSC: " fmt , ##args); } while (0)
71 #define MS_DPRINTF(fmt, args...)
78 #define CHN_C(s) ((s)->chn == chn_b? 'b' : 'a')
84 #define SERIO_QUEUE_SIZE 256
87 uint8_t data
[SERIO_QUEUE_SIZE
];
88 int rptr
, wptr
, count
;
91 typedef struct ChannelState
{
94 int rxint
, txint
, rxint_under_svc
, txint_under_svc
;
95 chn_id_t chn
; // this channel, A (base+4) or B (base+0)
97 struct ChannelState
*otherchn
;
98 uint8_t rx
, tx
, wregs
[16], rregs
[16];
100 CharDriverState
*chr
;
105 struct ChannelState chn
[2];
108 #define SERIAL_MAXADDR 7
110 static void handle_kbd_command(ChannelState
*s
, int val
);
111 static int serial_can_receive(void *opaque
);
112 static void serial_receive_byte(ChannelState
*s
, int ch
);
113 static inline void set_txint(ChannelState
*s
);
115 static void put_queue(void *opaque
, int b
)
117 ChannelState
*s
= opaque
;
118 SERIOQueue
*q
= &s
->queue
;
120 SER_DPRINTF("channel %c put: 0x%02x\n", CHN_C(s
), b
);
121 if (q
->count
>= SERIO_QUEUE_SIZE
)
123 q
->data
[q
->wptr
] = b
;
124 if (++q
->wptr
== SERIO_QUEUE_SIZE
)
127 serial_receive_byte(s
, 0);
130 static uint32_t get_queue(void *opaque
)
132 ChannelState
*s
= opaque
;
133 SERIOQueue
*q
= &s
->queue
;
139 val
= q
->data
[q
->rptr
];
140 if (++q
->rptr
== SERIO_QUEUE_SIZE
)
144 KBD_DPRINTF("channel %c get 0x%02x\n", CHN_C(s
), val
);
146 serial_receive_byte(s
, 0);
150 static int slavio_serial_update_irq_chn(ChannelState
*s
)
152 if ((s
->wregs
[1] & 1) && // interrupts enabled
153 (((s
->wregs
[1] & 2) && s
->txint
== 1) || // tx ints enabled, pending
154 ((((s
->wregs
[1] & 0x18) == 8) || ((s
->wregs
[1] & 0x18) == 0x10)) &&
155 s
->rxint
== 1) || // rx ints enabled, pending
156 ((s
->wregs
[15] & 0x80) && (s
->rregs
[0] & 0x80)))) { // break int e&p
162 static void slavio_serial_update_irq(ChannelState
*s
)
166 irq
= slavio_serial_update_irq_chn(s
);
167 irq
|= slavio_serial_update_irq_chn(s
->otherchn
);
169 pic_set_irq_new(s
->intctl
, s
->irq
, irq
);
172 static void slavio_serial_reset_chn(ChannelState
*s
)
177 for (i
= 0; i
< SERIAL_MAXADDR
; i
++) {
190 s
->rxint
= s
->txint
= 0;
191 s
->rxint_under_svc
= s
->txint_under_svc
= 0;
194 static void slavio_serial_reset(void *opaque
)
196 SerialState
*s
= opaque
;
197 slavio_serial_reset_chn(&s
->chn
[0]);
198 slavio_serial_reset_chn(&s
->chn
[1]);
201 static inline void clr_rxint(ChannelState
*s
)
204 s
->rxint_under_svc
= 0;
206 s
->rregs
[3] &= ~0x20;
208 s
->otherchn
->rregs
[3] &= ~4;
213 slavio_serial_update_irq(s
);
216 static inline void set_rxint(ChannelState
*s
)
219 if (!s
->txint_under_svc
) {
220 s
->rxint_under_svc
= 1;
224 s
->otherchn
->rregs
[3] |= 4;
226 slavio_serial_update_irq(s
);
230 static inline void clr_txint(ChannelState
*s
)
233 s
->txint_under_svc
= 0;
235 s
->rregs
[3] &= ~0x10;
237 s
->otherchn
->rregs
[3] &= ~2;
242 slavio_serial_update_irq(s
);
245 static inline void set_txint(ChannelState
*s
)
248 if (!s
->rxint_under_svc
) {
249 s
->txint_under_svc
= 1;
253 s
->otherchn
->rregs
[3] |= 2;
255 slavio_serial_update_irq(s
);
259 static void slavio_serial_update_parameters(ChannelState
*s
)
261 int speed
, parity
, data_bits
, stop_bits
;
262 QEMUSerialSetParams ssp
;
264 if (!s
->chr
|| s
->type
!= ser
)
267 if (s
->wregs
[4] & 1) {
275 if ((s
->wregs
[4] & 0x0c) == 0x0c)
279 switch (s
->wregs
[5] & 0x60) {
294 speed
= 2457600 / ((s
->wregs
[12] | (s
->wregs
[13] << 8)) + 2);
295 switch (s
->wregs
[4] & 0xc0) {
311 ssp
.data_bits
= data_bits
;
312 ssp
.stop_bits
= stop_bits
;
313 SER_DPRINTF("channel %c: speed=%d parity=%c data=%d stop=%d\n", CHN_C(s
),
314 speed
, parity
, data_bits
, stop_bits
);
315 qemu_chr_ioctl(s
->chr
, CHR_IOCTL_SERIAL_SET_PARAMS
, &ssp
);
318 static void slavio_serial_mem_writeb(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
320 SerialState
*ser
= opaque
;
326 saddr
= (addr
& 3) >> 1;
327 channel
= (addr
& SERIAL_MAXADDR
) >> 2;
328 s
= &ser
->chn
[channel
];
331 SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s
), s
->reg
, val
& 0xff);
345 if (s
->rxint_under_svc
)
347 else if (s
->txint_under_svc
)
358 s
->wregs
[s
->reg
] = val
;
364 s
->wregs
[s
->reg
] = val
;
365 slavio_serial_update_parameters(s
);
368 switch (val
& 0xc0) {
373 slavio_serial_reset_chn(&ser
->chn
[1]);
376 slavio_serial_reset_chn(&ser
->chn
[0]);
379 slavio_serial_reset(ser
);
392 SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s
), val
);
393 if (s
->wregs
[5] & 8) { // tx enabled
396 qemu_chr_write(s
->chr
, &s
->tx
, 1);
397 else if (s
->type
== kbd
) {
398 handle_kbd_command(s
, val
);
400 s
->rregs
[0] |= 4; // Tx buffer empty
401 s
->rregs
[1] |= 1; // All sent
410 static uint32_t slavio_serial_mem_readb(void *opaque
, target_phys_addr_t addr
)
412 SerialState
*ser
= opaque
;
418 saddr
= (addr
& 3) >> 1;
419 channel
= (addr
& SERIAL_MAXADDR
) >> 2;
420 s
= &ser
->chn
[channel
];
423 SER_DPRINTF("Read channel %c, reg[%d] = %2.2x\n", CHN_C(s
), s
->reg
, s
->rregs
[s
->reg
]);
424 ret
= s
->rregs
[s
->reg
];
430 if (s
->type
== kbd
|| s
->type
== mouse
)
434 SER_DPRINTF("Read channel %c, ch %d\n", CHN_C(s
), ret
);
442 static int serial_can_receive(void *opaque
)
444 ChannelState
*s
= opaque
;
447 if (((s
->wregs
[3] & 1) == 0) // Rx not enabled
448 || ((s
->rregs
[0] & 1) == 1)) // char already available
452 //SER_DPRINTF("channel %c can receive %d\n", CHN_C(s), ret);
456 static void serial_receive_byte(ChannelState
*s
, int ch
)
458 SER_DPRINTF("channel %c put ch %d\n", CHN_C(s
), ch
);
464 static void serial_receive_break(ChannelState
*s
)
467 slavio_serial_update_irq(s
);
470 static void serial_receive1(void *opaque
, const uint8_t *buf
, int size
)
472 ChannelState
*s
= opaque
;
473 serial_receive_byte(s
, buf
[0]);
476 static void serial_event(void *opaque
, int event
)
478 ChannelState
*s
= opaque
;
479 if (event
== CHR_EVENT_BREAK
)
480 serial_receive_break(s
);
483 static CPUReadMemoryFunc
*slavio_serial_mem_read
[3] = {
484 slavio_serial_mem_readb
,
485 slavio_serial_mem_readb
,
486 slavio_serial_mem_readb
,
489 static CPUWriteMemoryFunc
*slavio_serial_mem_write
[3] = {
490 slavio_serial_mem_writeb
,
491 slavio_serial_mem_writeb
,
492 slavio_serial_mem_writeb
,
495 static void slavio_serial_save_chn(QEMUFile
*f
, ChannelState
*s
)
497 qemu_put_be32s(f
, &s
->irq
);
498 qemu_put_be32s(f
, &s
->reg
);
499 qemu_put_be32s(f
, &s
->rxint
);
500 qemu_put_be32s(f
, &s
->txint
);
501 qemu_put_be32s(f
, &s
->rxint_under_svc
);
502 qemu_put_be32s(f
, &s
->txint_under_svc
);
503 qemu_put_8s(f
, &s
->rx
);
504 qemu_put_8s(f
, &s
->tx
);
505 qemu_put_buffer(f
, s
->wregs
, 16);
506 qemu_put_buffer(f
, s
->rregs
, 16);
509 static void slavio_serial_save(QEMUFile
*f
, void *opaque
)
511 SerialState
*s
= opaque
;
513 slavio_serial_save_chn(f
, &s
->chn
[0]);
514 slavio_serial_save_chn(f
, &s
->chn
[1]);
517 static int slavio_serial_load_chn(QEMUFile
*f
, ChannelState
*s
, int version_id
)
522 qemu_get_be32s(f
, &s
->irq
);
523 qemu_get_be32s(f
, &s
->reg
);
524 qemu_get_be32s(f
, &s
->rxint
);
525 qemu_get_be32s(f
, &s
->txint
);
526 if (version_id
>= 2) {
527 qemu_get_be32s(f
, &s
->rxint_under_svc
);
528 qemu_get_be32s(f
, &s
->txint_under_svc
);
530 qemu_get_8s(f
, &s
->rx
);
531 qemu_get_8s(f
, &s
->tx
);
532 qemu_get_buffer(f
, s
->wregs
, 16);
533 qemu_get_buffer(f
, s
->rregs
, 16);
537 static int slavio_serial_load(QEMUFile
*f
, void *opaque
, int version_id
)
539 SerialState
*s
= opaque
;
542 ret
= slavio_serial_load_chn(f
, &s
->chn
[0], version_id
);
545 ret
= slavio_serial_load_chn(f
, &s
->chn
[1], version_id
);
550 SerialState
*slavio_serial_init(int base
, int irq
, CharDriverState
*chr1
,
551 CharDriverState
*chr2
, void *intctl
)
553 int slavio_serial_io_memory
, i
;
556 s
= qemu_mallocz(sizeof(SerialState
));
560 slavio_serial_io_memory
= cpu_register_io_memory(0, slavio_serial_mem_read
, slavio_serial_mem_write
, s
);
561 cpu_register_physical_memory(base
, SERIAL_MAXADDR
, slavio_serial_io_memory
);
563 s
->chn
[0].chr
= chr1
;
564 s
->chn
[1].chr
= chr2
;
566 for (i
= 0; i
< 2; i
++) {
568 s
->chn
[i
].chn
= 1 - i
;
569 s
->chn
[i
].type
= ser
;
570 s
->chn
[i
].intctl
= intctl
;
572 qemu_chr_add_handlers(s
->chn
[i
].chr
, serial_can_receive
,
573 serial_receive1
, serial_event
, &s
->chn
[i
]);
576 s
->chn
[0].otherchn
= &s
->chn
[1];
577 s
->chn
[1].otherchn
= &s
->chn
[0];
578 register_savevm("slavio_serial", base
, 2, slavio_serial_save
, slavio_serial_load
, s
);
579 qemu_register_reset(slavio_serial_reset
, s
);
580 slavio_serial_reset(s
);
584 static const uint8_t keycodes
[128] = {
585 127, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 53,
586 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 89, 76, 77, 78,
587 79, 80, 81, 82, 83, 84, 85, 86, 87, 42, 99, 88, 100, 101, 102, 103,
588 104, 105, 106, 107, 108, 109, 110, 47, 19, 121, 119, 5, 6, 8, 10, 12,
589 14, 16, 17, 18, 7, 98, 23, 68, 69, 70, 71, 91, 92, 93, 125, 112,
590 113, 114, 94, 50, 0, 0, 124, 9, 11, 0, 0, 0, 0, 0, 0, 0,
591 90, 0, 46, 22, 13, 111, 52, 20, 96, 24, 28, 74, 27, 123, 44, 66,
592 0, 45, 2, 4, 48, 0, 0, 21, 0, 0, 0, 0, 0, 120, 122, 67,
595 static void sunkbd_event(void *opaque
, int ch
)
597 ChannelState
*s
= opaque
;
598 int release
= ch
& 0x80;
600 ch
= keycodes
[ch
& 0x7f];
601 KBD_DPRINTF("Keycode %d (%s)\n", ch
, release
? "release" : "press");
602 put_queue(s
, ch
| release
);
605 static void handle_kbd_command(ChannelState
*s
, int val
)
607 KBD_DPRINTF("Command %d\n", val
);
609 case 1: // Reset, return type code
611 put_queue(s
, 5); // Type 5
613 case 7: // Query layout
615 put_queue(s
, 0x20); // XXX, layout?
622 static void sunmouse_event(void *opaque
,
623 int dx
, int dy
, int dz
, int buttons_state
)
625 ChannelState
*s
= opaque
;
628 /* XXX: SDL sometimes generates nul events: we delete them */
629 if (dx
== 0 && dy
== 0 && dz
== 0 && buttons_state
== 0)
631 MS_DPRINTF("dx=%d dy=%d buttons=%01x\n", dx
, dy
, buttons_state
);
633 ch
= 0x80 | 0x7; /* protocol start byte, no buttons pressed */
635 if (buttons_state
& MOUSE_EVENT_LBUTTON
)
637 if (buttons_state
& MOUSE_EVENT_MBUTTON
)
639 if (buttons_state
& MOUSE_EVENT_RBUTTON
)
651 put_queue(s
, ch
& 0xff);
660 put_queue(s
, ch
& 0xff);
662 // MSC protocol specify two extra motion bytes
668 void slavio_serial_ms_kbd_init(int base
, int irq
, void *intctl
)
670 int slavio_serial_io_memory
, i
;
673 s
= qemu_mallocz(sizeof(SerialState
));
676 for (i
= 0; i
< 2; i
++) {
678 s
->chn
[i
].chn
= 1 - i
;
679 s
->chn
[i
].chr
= NULL
;
680 s
->chn
[i
].intctl
= intctl
;
682 s
->chn
[0].otherchn
= &s
->chn
[1];
683 s
->chn
[1].otherchn
= &s
->chn
[0];
684 s
->chn
[0].type
= mouse
;
685 s
->chn
[1].type
= kbd
;
687 slavio_serial_io_memory
= cpu_register_io_memory(0, slavio_serial_mem_read
, slavio_serial_mem_write
, s
);
688 cpu_register_physical_memory(base
, SERIAL_MAXADDR
, slavio_serial_io_memory
);
690 qemu_add_mouse_event_handler(sunmouse_event
, &s
->chn
[0], 0, "QEMU Sun Mouse");
691 qemu_add_kbd_event_handler(sunkbd_event
, &s
->chn
[1]);
692 qemu_register_reset(slavio_serial_reset
, s
);
693 slavio_serial_reset(s
);