Fix keyboard serial and mouse bugs
[qemu/mini2440.git] / hw / slavio_serial.c
blob0e3a622dbec58d2d3f24dd89694e6cf5653699e2
1 /*
2 * QEMU Sparc SLAVIO 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:
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
22 * THE SOFTWARE.
24 #include "vl.h"
25 /* debug serial */
26 //#define DEBUG_SERIAL
28 /* debug keyboard */
29 //#define DEBUG_KBD
31 /* debug mouse */
32 //#define DEBUG_MOUSE
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.
46 * Modifications:
47 * 2006-Aug-10 Igor Kovalenko : Renamed KBDQueue to SERIOQueue, implemented
48 * serial mouse queue.
49 * Implemented serial mouse protocol.
52 #ifdef DEBUG_SERIAL
53 #define SER_DPRINTF(fmt, args...) \
54 do { printf("SER: " fmt , ##args); } while (0)
55 #else
56 #define SER_DPRINTF(fmt, args...)
57 #endif
58 #ifdef DEBUG_KBD
59 #define KBD_DPRINTF(fmt, args...) \
60 do { printf("KBD: " fmt , ##args); } while (0)
61 #else
62 #define KBD_DPRINTF(fmt, args...)
63 #endif
64 #ifdef DEBUG_MOUSE
65 #define MS_DPRINTF(fmt, args...) \
66 do { printf("MSC: " fmt , ##args); } while (0)
67 #else
68 #define MS_DPRINTF(fmt, args...)
69 #endif
71 typedef enum {
72 chn_a, chn_b,
73 } chn_id_t;
75 #define CHN_C(s) ((s)->chn == chn_b? 'b' : 'a')
77 typedef enum {
78 ser, kbd, mouse,
79 } chn_type_t;
81 #define SERIO_QUEUE_SIZE 256
83 typedef struct {
84 uint8_t data[SERIO_QUEUE_SIZE];
85 int rptr, wptr, count;
86 } SERIOQueue;
88 typedef struct ChannelState {
89 qemu_irq irq;
90 int reg;
91 int rxint, txint, rxint_under_svc, txint_under_svc;
92 chn_id_t chn; // this channel, A (base+4) or B (base+0)
93 chn_type_t type;
94 struct ChannelState *otherchn;
95 uint8_t rx, tx, wregs[16], rregs[16];
96 SERIOQueue queue;
97 CharDriverState *chr;
98 } ChannelState;
100 struct SerialState {
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)
125 return;
126 q->data[q->wptr] = b;
127 if (++q->wptr == SERIO_QUEUE_SIZE)
128 q->wptr = 0;
129 q->count++;
130 serial_receive_byte(s, 0);
133 static uint32_t get_queue(void *opaque)
135 ChannelState *s = opaque;
136 SERIOQueue *q = &s->queue;
137 int val;
139 if (q->count == 0) {
140 return 0;
141 } else {
142 val = q->data[q->rptr];
143 if (++q->rptr == SERIO_QUEUE_SIZE)
144 q->rptr = 0;
145 q->count--;
147 SER_DPRINTF("channel %c get 0x%02x\n", CHN_C(s), val);
148 if (q->count > 0)
149 serial_receive_byte(s, 0);
150 return val;
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
160 return 1;
162 return 0;
165 static void slavio_serial_update_irq(ChannelState *s)
167 int irq;
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)
178 int i;
180 s->reg = 0;
181 for (i = 0; i < SERIAL_MAXADDR; i++) {
182 s->rregs[i] = 0;
183 s->wregs[i] = 0;
185 s->wregs[4] = 4;
186 s->wregs[9] = 0xc0;
187 s->wregs[11] = 8;
188 s->wregs[14] = 0x30;
189 s->wregs[15] = 0xf8;
190 s->rregs[0] = 0x44;
191 s->rregs[1] = 6;
193 s->rx = s->tx = 0;
194 s->rxint = s->txint = 0;
195 s->rxint_under_svc = s->txint_under_svc = 0;
196 clear_queue(s);
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)
208 s->rxint = 0;
209 s->rxint_under_svc = 0;
210 if (s->chn == chn_a) {
211 if (s->wregs[9] & 0x10)
212 s->otherchn->rregs[2] = 0x60;
213 else
214 s->otherchn->rregs[2] = 0x06;
215 s->rregs[3] &= ~0x20;
216 } else {
217 if (s->wregs[9] & 0x10)
218 s->rregs[2] = 0x60;
219 else
220 s->rregs[2] = 0x06;
221 s->otherchn->rregs[3] &= ~4;
223 if (s->txint)
224 set_txint(s);
225 slavio_serial_update_irq(s);
228 static inline void set_rxint(ChannelState *s)
230 s->rxint = 1;
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;
236 else
237 s->otherchn->rregs[2] = 0x0c;
238 } else {
239 if (s->wregs[9] & 0x10)
240 s->rregs[2] = 0x20;
241 else
242 s->rregs[2] = 0x04;
245 if (s->chn == chn_a)
246 s->rregs[3] |= 0x20;
247 else
248 s->otherchn->rregs[3] |= 4;
249 slavio_serial_update_irq(s);
252 static inline void clr_txint(ChannelState *s)
254 s->txint = 0;
255 s->txint_under_svc = 0;
256 if (s->chn == chn_a) {
257 if (s->wregs[9] & 0x10)
258 s->otherchn->rregs[2] = 0x60;
259 else
260 s->otherchn->rregs[2] = 0x06;
261 s->rregs[3] &= ~0x10;
262 } else {
263 if (s->wregs[9] & 0x10)
264 s->rregs[2] = 0x60;
265 else
266 s->rregs[2] = 0x06;
267 s->otherchn->rregs[3] &= ~2;
269 if (s->rxint)
270 set_rxint(s);
271 slavio_serial_update_irq(s);
274 static inline void set_txint(ChannelState *s)
276 s->txint = 1;
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;
282 else
283 s->otherchn->rregs[2] = 0x08;
284 } else {
285 s->rregs[2] = 0;
288 if (s->chn == chn_a)
289 s->rregs[3] |= 0x10;
290 else
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)
301 return;
303 if (s->wregs[4] & 1) {
304 if (s->wregs[4] & 2)
305 parity = 'E';
306 else
307 parity = 'O';
308 } else {
309 parity = 'N';
311 if ((s->wregs[4] & 0x0c) == 0x0c)
312 stop_bits = 2;
313 else
314 stop_bits = 1;
315 switch (s->wregs[5] & 0x60) {
316 case 0x00:
317 data_bits = 5;
318 break;
319 case 0x20:
320 data_bits = 7;
321 break;
322 case 0x40:
323 data_bits = 6;
324 break;
325 default:
326 case 0x60:
327 data_bits = 8;
328 break;
330 speed = 2457600 / ((s->wregs[12] | (s->wregs[13] << 8)) + 2);
331 switch (s->wregs[4] & 0xc0) {
332 case 0x00:
333 break;
334 case 0x40:
335 speed /= 16;
336 break;
337 case 0x80:
338 speed /= 32;
339 break;
340 default:
341 case 0xc0:
342 speed /= 64;
343 break;
345 ssp.speed = speed;
346 ssp.parity = parity;
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;
357 ChannelState *s;
358 uint32_t saddr;
359 int newreg, channel;
361 val &= 0xff;
362 saddr = (addr & 3) >> 1;
363 channel = (addr & SERIAL_MAXADDR) >> 2;
364 s = &ser->chn[channel];
365 switch (saddr) {
366 case 0:
367 SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, val & 0xff);
368 newreg = 0;
369 switch (s->reg) {
370 case 0:
371 newreg = val & 7;
372 val &= 0x38;
373 switch (val) {
374 case 8:
375 newreg |= 0x8;
376 break;
377 case 0x28:
378 clr_txint(s);
379 break;
380 case 0x38:
381 if (s->rxint_under_svc)
382 clr_rxint(s);
383 else if (s->txint_under_svc)
384 clr_txint(s);
385 break;
386 default:
387 break;
389 break;
390 case 1 ... 3:
391 case 6 ... 8:
392 case 10 ... 11:
393 case 14 ... 15:
394 s->wregs[s->reg] = val;
395 break;
396 case 4:
397 case 5:
398 case 12:
399 case 13:
400 s->wregs[s->reg] = val;
401 slavio_serial_update_parameters(s);
402 break;
403 case 9:
404 switch (val & 0xc0) {
405 case 0:
406 default:
407 break;
408 case 0x40:
409 slavio_serial_reset_chn(&ser->chn[1]);
410 return;
411 case 0x80:
412 slavio_serial_reset_chn(&ser->chn[0]);
413 return;
414 case 0xc0:
415 slavio_serial_reset(ser);
416 return;
418 break;
419 default:
420 break;
422 if (s->reg == 0)
423 s->reg = newreg;
424 else
425 s->reg = 0;
426 break;
427 case 1:
428 SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s), val);
429 if (s->wregs[5] & 8) { // tx enabled
430 s->tx = val;
431 if (s->chr)
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
438 set_txint(s);
440 break;
441 default:
442 break;
446 static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr)
448 SerialState *ser = opaque;
449 ChannelState *s;
450 uint32_t saddr;
451 uint32_t ret;
452 int channel;
454 saddr = (addr & 3) >> 1;
455 channel = (addr & SERIAL_MAXADDR) >> 2;
456 s = &ser->chn[channel];
457 switch (saddr) {
458 case 0:
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];
461 s->reg = 0;
462 return ret;
463 case 1:
464 s->rregs[0] &= ~1;
465 clr_rxint(s);
466 if (s->type == kbd || s->type == mouse)
467 ret = get_queue(s);
468 else
469 ret = s->rx;
470 SER_DPRINTF("Read channel %c, ch %d\n", CHN_C(s), ret);
471 return ret;
472 default:
473 break;
475 return 0;
478 static int serial_can_receive(void *opaque)
480 ChannelState *s = opaque;
481 int ret;
483 if (((s->wregs[3] & 1) == 0) // Rx not enabled
484 || ((s->rregs[0] & 1) == 1)) // char already available
485 ret = 0;
486 else
487 ret = 1;
488 //SER_DPRINTF("channel %c can receive %d\n", CHN_C(s), ret);
489 return ret;
492 static void serial_receive_byte(ChannelState *s, int ch)
494 SER_DPRINTF("channel %c put ch %d\n", CHN_C(s), ch);
495 s->rregs[0] |= 1;
496 s->rx = ch;
497 set_rxint(s);
500 static void serial_receive_break(ChannelState *s)
502 s->rregs[0] |= 0x80;
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)
533 int tmp;
534 tmp = 0;
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)
557 int tmp;
559 if (version_id > 2)
560 return -EINVAL;
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);
574 return 0;
577 static int slavio_serial_load(QEMUFile *f, void *opaque, int version_id)
579 SerialState *s = opaque;
580 int ret;
582 ret = slavio_serial_load_chn(f, &s->chn[0], version_id);
583 if (ret != 0)
584 return ret;
585 ret = slavio_serial_load_chn(f, &s->chn[1], version_id);
586 return ret;
590 SerialState *slavio_serial_init(int base, qemu_irq irq, CharDriverState *chr1,
591 CharDriverState *chr2)
593 int slavio_serial_io_memory, i;
594 SerialState *s;
596 s = qemu_mallocz(sizeof(SerialState));
597 if (!s)
598 return NULL;
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++) {
607 s->chn[i].irq = irq;
608 s->chn[i].chn = 1 - i;
609 s->chn[i].type = ser;
610 if (s->chn[i].chr) {
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);
620 return 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);
647 switch (val) {
648 case 1: // Reset, return type code
649 clear_queue(s);
650 put_queue(s, 0xff);
651 put_queue(s, 4); // Type 4
652 break;
653 case 7: // Query layout
654 case 0xf:
655 clear_queue(s);
656 put_queue(s, 0xfe);
657 put_queue(s, 19); // XXX, layout?
658 break;
659 default:
660 break;
664 static void sunmouse_event(void *opaque,
665 int dx, int dy, int dz, int buttons_state)
667 ChannelState *s = opaque;
668 int ch;
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)
675 ch ^= 0x4;
676 if (buttons_state & MOUSE_EVENT_MBUTTON)
677 ch ^= 0x2;
678 if (buttons_state & MOUSE_EVENT_RBUTTON)
679 ch ^= 0x1;
681 put_queue(s, ch);
683 ch = dx;
685 if (ch > 127)
686 ch=127;
687 else if (ch < -127)
688 ch=-127;
690 put_queue(s, ch & 0xff);
692 ch = -dy;
694 if (ch > 127)
695 ch=127;
696 else if (ch < -127)
697 ch=-127;
699 put_queue(s, ch & 0xff);
701 // MSC protocol specify two extra motion bytes
703 put_queue(s, 0);
704 put_queue(s, 0);
707 void slavio_serial_ms_kbd_init(int base, qemu_irq irq)
709 int slavio_serial_io_memory, i;
710 SerialState *s;
712 s = qemu_mallocz(sizeof(SerialState));
713 if (!s)
714 return;
715 for (i = 0; i < 2; i++) {
716 s->chn[i].irq = irq;
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);