]> git.proxmox.com Git - qemu.git/blob - hw/slavio_serial.c
847710e3d14b1fbab1ca4fdd3e4b342ca5497843
[qemu.git] / hw / slavio_serial.c
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:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
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.
23 */
24 #include "vl.h"
25 /* debug serial */
26 //#define DEBUG_SERIAL
27
28 /* debug keyboard */
29 //#define DEBUG_KBD
30
31 /* debug mouse */
32 //#define DEBUG_MOUSE
33
34 /*
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
38 *
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.
42 *
43 */
44
45 /*
46 * Modifications:
47 * 2006-Aug-10 Igor Kovalenko : Renamed KBDQueue to SERIOQueue, implemented
48 * serial mouse queue.
49 * Implemented serial mouse protocol.
50 */
51
52 #ifdef DEBUG_SERIAL
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)
58 #else
59 #define SER_DPRINTF(fmt, args...)
60 #endif
61 #ifdef DEBUG_KBD
62 #define KBD_DPRINTF(fmt, args...) \
63 do { printf("KBD: " fmt , ##args); } while (0)
64 #else
65 #define KBD_DPRINTF(fmt, args...)
66 #endif
67 #ifdef DEBUG_MOUSE
68 #define MS_DPRINTF(fmt, args...) \
69 do { printf("MSC: " fmt , ##args); } while (0)
70 #else
71 #define MS_DPRINTF(fmt, args...)
72 #endif
73
74 typedef enum {
75 chn_a, chn_b,
76 } chn_id_t;
77
78 #define CHN_C(s) ((s)->chn == chn_b? 'b' : 'a')
79
80 typedef enum {
81 ser, kbd, mouse,
82 } chn_type_t;
83
84 #define SERIO_QUEUE_SIZE 256
85
86 typedef struct {
87 uint8_t data[SERIO_QUEUE_SIZE];
88 int rptr, wptr, count;
89 } SERIOQueue;
90
91 typedef struct ChannelState {
92 int irq;
93 int reg;
94 int rxint, txint, rxint_under_svc, txint_under_svc;
95 chn_id_t chn; // this channel, A (base+4) or B (base+0)
96 chn_type_t type;
97 struct ChannelState *otherchn;
98 uint8_t rx, tx, wregs[16], rregs[16];
99 SERIOQueue queue;
100 CharDriverState *chr;
101 void *intctl;
102 } ChannelState;
103
104 struct SerialState {
105 struct ChannelState chn[2];
106 };
107
108 #define SERIAL_MAXADDR 7
109
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);
114
115 static void put_queue(void *opaque, int b)
116 {
117 ChannelState *s = opaque;
118 SERIOQueue *q = &s->queue;
119
120 SER_DPRINTF("channel %c put: 0x%02x\n", CHN_C(s), b);
121 if (q->count >= SERIO_QUEUE_SIZE)
122 return;
123 q->data[q->wptr] = b;
124 if (++q->wptr == SERIO_QUEUE_SIZE)
125 q->wptr = 0;
126 q->count++;
127 serial_receive_byte(s, 0);
128 }
129
130 static uint32_t get_queue(void *opaque)
131 {
132 ChannelState *s = opaque;
133 SERIOQueue *q = &s->queue;
134 int val;
135
136 if (q->count == 0) {
137 return 0;
138 } else {
139 val = q->data[q->rptr];
140 if (++q->rptr == SERIO_QUEUE_SIZE)
141 q->rptr = 0;
142 q->count--;
143 }
144 KBD_DPRINTF("channel %c get 0x%02x\n", CHN_C(s), val);
145 if (q->count > 0)
146 serial_receive_byte(s, 0);
147 return val;
148 }
149
150 static int slavio_serial_update_irq_chn(ChannelState *s)
151 {
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
157 return 1;
158 }
159 return 0;
160 }
161
162 static void slavio_serial_update_irq(ChannelState *s)
163 {
164 int irq;
165
166 irq = slavio_serial_update_irq_chn(s);
167 irq |= slavio_serial_update_irq_chn(s->otherchn);
168
169 pic_set_irq_new(s->intctl, s->irq, irq);
170 }
171
172 static void slavio_serial_reset_chn(ChannelState *s)
173 {
174 int i;
175
176 s->reg = 0;
177 for (i = 0; i < SERIAL_MAXADDR; i++) {
178 s->rregs[i] = 0;
179 s->wregs[i] = 0;
180 }
181 s->wregs[4] = 4;
182 s->wregs[9] = 0xc0;
183 s->wregs[11] = 8;
184 s->wregs[14] = 0x30;
185 s->wregs[15] = 0xf8;
186 s->rregs[0] = 0x44;
187 s->rregs[1] = 6;
188
189 s->rx = s->tx = 0;
190 s->rxint = s->txint = 0;
191 s->rxint_under_svc = s->txint_under_svc = 0;
192 }
193
194 static void slavio_serial_reset(void *opaque)
195 {
196 SerialState *s = opaque;
197 slavio_serial_reset_chn(&s->chn[0]);
198 slavio_serial_reset_chn(&s->chn[1]);
199 }
200
201 static inline void clr_rxint(ChannelState *s)
202 {
203 s->rxint = 0;
204 s->rxint_under_svc = 0;
205 if (s->chn == chn_a)
206 s->rregs[3] &= ~0x20;
207 else
208 s->otherchn->rregs[3] &= ~4;
209 if (s->txint)
210 set_txint(s);
211 else
212 s->rregs[2] = 6;
213 slavio_serial_update_irq(s);
214 }
215
216 static inline void set_rxint(ChannelState *s)
217 {
218 s->rxint = 1;
219 if (!s->txint_under_svc) {
220 s->rxint_under_svc = 1;
221 if (s->chn == chn_a)
222 s->rregs[3] |= 0x20;
223 else
224 s->otherchn->rregs[3] |= 4;
225 s->rregs[2] = 4;
226 slavio_serial_update_irq(s);
227 }
228 }
229
230 static inline void clr_txint(ChannelState *s)
231 {
232 s->txint = 0;
233 s->txint_under_svc = 0;
234 if (s->chn == chn_a)
235 s->rregs[3] &= ~0x10;
236 else
237 s->otherchn->rregs[3] &= ~2;
238 if (s->rxint)
239 set_rxint(s);
240 else
241 s->rregs[2] = 6;
242 slavio_serial_update_irq(s);
243 }
244
245 static inline void set_txint(ChannelState *s)
246 {
247 s->txint = 1;
248 if (!s->rxint_under_svc) {
249 s->txint_under_svc = 1;
250 if (s->chn == chn_a)
251 s->rregs[3] |= 0x10;
252 else
253 s->otherchn->rregs[3] |= 2;
254 s->rregs[2] = 0;
255 slavio_serial_update_irq(s);
256 }
257 }
258
259 static void slavio_serial_update_parameters(ChannelState *s)
260 {
261 int speed, parity, data_bits, stop_bits;
262 QEMUSerialSetParams ssp;
263
264 if (!s->chr || s->type != ser)
265 return;
266
267 if (s->wregs[4] & 1) {
268 if (s->wregs[4] & 2)
269 parity = 'E';
270 else
271 parity = 'O';
272 } else {
273 parity = 'N';
274 }
275 if ((s->wregs[4] & 0x0c) == 0x0c)
276 stop_bits = 2;
277 else
278 stop_bits = 1;
279 switch (s->wregs[5] & 0x60) {
280 case 0x00:
281 data_bits = 5;
282 break;
283 case 0x20:
284 data_bits = 7;
285 break;
286 case 0x40:
287 data_bits = 6;
288 break;
289 default:
290 case 0x60:
291 data_bits = 8;
292 break;
293 }
294 speed = 2457600 / ((s->wregs[12] | (s->wregs[13] << 8)) + 2);
295 switch (s->wregs[4] & 0xc0) {
296 case 0x00:
297 break;
298 case 0x40:
299 speed /= 16;
300 break;
301 case 0x80:
302 speed /= 32;
303 break;
304 default:
305 case 0xc0:
306 speed /= 64;
307 break;
308 }
309 ssp.speed = speed;
310 ssp.parity = parity;
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);
316 }
317
318 static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
319 {
320 SerialState *ser = opaque;
321 ChannelState *s;
322 uint32_t saddr;
323 int newreg, channel;
324
325 val &= 0xff;
326 saddr = (addr & 3) >> 1;
327 channel = (addr & SERIAL_MAXADDR) >> 2;
328 s = &ser->chn[channel];
329 switch (saddr) {
330 case 0:
331 SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s), s->reg, val & 0xff);
332 newreg = 0;
333 switch (s->reg) {
334 case 0:
335 newreg = val & 7;
336 val &= 0x38;
337 switch (val) {
338 case 8:
339 newreg |= 0x8;
340 break;
341 case 0x28:
342 clr_txint(s);
343 break;
344 case 0x38:
345 if (s->rxint_under_svc)
346 clr_rxint(s);
347 else if (s->txint_under_svc)
348 clr_txint(s);
349 break;
350 default:
351 break;
352 }
353 break;
354 case 1 ... 3:
355 case 6 ... 8:
356 case 10 ... 11:
357 case 14 ... 15:
358 s->wregs[s->reg] = val;
359 break;
360 case 4:
361 case 5:
362 case 12:
363 case 13:
364 s->wregs[s->reg] = val;
365 slavio_serial_update_parameters(s);
366 break;
367 case 9:
368 switch (val & 0xc0) {
369 case 0:
370 default:
371 break;
372 case 0x40:
373 slavio_serial_reset_chn(&ser->chn[1]);
374 return;
375 case 0x80:
376 slavio_serial_reset_chn(&ser->chn[0]);
377 return;
378 case 0xc0:
379 slavio_serial_reset(ser);
380 return;
381 }
382 break;
383 default:
384 break;
385 }
386 if (s->reg == 0)
387 s->reg = newreg;
388 else
389 s->reg = 0;
390 break;
391 case 1:
392 SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s), val);
393 if (s->wregs[5] & 8) { // tx enabled
394 s->tx = val;
395 if (s->chr)
396 qemu_chr_write(s->chr, &s->tx, 1);
397 else if (s->type == kbd) {
398 handle_kbd_command(s, val);
399 }
400 s->rregs[0] |= 4; // Tx buffer empty
401 s->rregs[1] |= 1; // All sent
402 set_txint(s);
403 }
404 break;
405 default:
406 break;
407 }
408 }
409
410 static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr)
411 {
412 SerialState *ser = opaque;
413 ChannelState *s;
414 uint32_t saddr;
415 uint32_t ret;
416 int channel;
417
418 saddr = (addr & 3) >> 1;
419 channel = (addr & SERIAL_MAXADDR) >> 2;
420 s = &ser->chn[channel];
421 switch (saddr) {
422 case 0:
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];
425 s->reg = 0;
426 return ret;
427 case 1:
428 s->rregs[0] &= ~1;
429 clr_rxint(s);
430 if (s->type == kbd || s->type == mouse)
431 ret = get_queue(s);
432 else
433 ret = s->rx;
434 SER_DPRINTF("Read channel %c, ch %d\n", CHN_C(s), ret);
435 return ret;
436 default:
437 break;
438 }
439 return 0;
440 }
441
442 static int serial_can_receive(void *opaque)
443 {
444 ChannelState *s = opaque;
445 int ret;
446
447 if (((s->wregs[3] & 1) == 0) // Rx not enabled
448 || ((s->rregs[0] & 1) == 1)) // char already available
449 ret = 0;
450 else
451 ret = 1;
452 //SER_DPRINTF("channel %c can receive %d\n", CHN_C(s), ret);
453 return ret;
454 }
455
456 static void serial_receive_byte(ChannelState *s, int ch)
457 {
458 SER_DPRINTF("channel %c put ch %d\n", CHN_C(s), ch);
459 s->rregs[0] |= 1;
460 s->rx = ch;
461 set_rxint(s);
462 }
463
464 static void serial_receive_break(ChannelState *s)
465 {
466 s->rregs[0] |= 0x80;
467 slavio_serial_update_irq(s);
468 }
469
470 static void serial_receive1(void *opaque, const uint8_t *buf, int size)
471 {
472 ChannelState *s = opaque;
473 serial_receive_byte(s, buf[0]);
474 }
475
476 static void serial_event(void *opaque, int event)
477 {
478 ChannelState *s = opaque;
479 if (event == CHR_EVENT_BREAK)
480 serial_receive_break(s);
481 }
482
483 static CPUReadMemoryFunc *slavio_serial_mem_read[3] = {
484 slavio_serial_mem_readb,
485 slavio_serial_mem_readb,
486 slavio_serial_mem_readb,
487 };
488
489 static CPUWriteMemoryFunc *slavio_serial_mem_write[3] = {
490 slavio_serial_mem_writeb,
491 slavio_serial_mem_writeb,
492 slavio_serial_mem_writeb,
493 };
494
495 static void slavio_serial_save_chn(QEMUFile *f, ChannelState *s)
496 {
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);
507 }
508
509 static void slavio_serial_save(QEMUFile *f, void *opaque)
510 {
511 SerialState *s = opaque;
512
513 slavio_serial_save_chn(f, &s->chn[0]);
514 slavio_serial_save_chn(f, &s->chn[1]);
515 }
516
517 static int slavio_serial_load_chn(QEMUFile *f, ChannelState *s, int version_id)
518 {
519 if (version_id > 2)
520 return -EINVAL;
521
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);
529 }
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);
534 return 0;
535 }
536
537 static int slavio_serial_load(QEMUFile *f, void *opaque, int version_id)
538 {
539 SerialState *s = opaque;
540 int ret;
541
542 ret = slavio_serial_load_chn(f, &s->chn[0], version_id);
543 if (ret != 0)
544 return ret;
545 ret = slavio_serial_load_chn(f, &s->chn[1], version_id);
546 return ret;
547
548 }
549
550 SerialState *slavio_serial_init(int base, int irq, CharDriverState *chr1,
551 CharDriverState *chr2, void *intctl)
552 {
553 int slavio_serial_io_memory, i;
554 SerialState *s;
555
556 s = qemu_mallocz(sizeof(SerialState));
557 if (!s)
558 return NULL;
559
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);
562
563 s->chn[0].chr = chr1;
564 s->chn[1].chr = chr2;
565
566 for (i = 0; i < 2; i++) {
567 s->chn[i].irq = irq;
568 s->chn[i].chn = 1 - i;
569 s->chn[i].type = ser;
570 s->chn[i].intctl = intctl;
571 if (s->chn[i].chr) {
572 qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive,
573 serial_receive1, serial_event, &s->chn[i]);
574 }
575 }
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);
581 return s;
582 }
583
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,
593 };
594
595 static void sunkbd_event(void *opaque, int ch)
596 {
597 ChannelState *s = opaque;
598 int release = ch & 0x80;
599
600 ch = keycodes[ch & 0x7f];
601 KBD_DPRINTF("Keycode %d (%s)\n", ch, release? "release" : "press");
602 put_queue(s, ch | release);
603 }
604
605 static void handle_kbd_command(ChannelState *s, int val)
606 {
607 KBD_DPRINTF("Command %d\n", val);
608 switch (val) {
609 case 1: // Reset, return type code
610 put_queue(s, 0xff);
611 put_queue(s, 5); // Type 5
612 break;
613 case 7: // Query layout
614 put_queue(s, 0xfe);
615 put_queue(s, 0x20); // XXX, layout?
616 break;
617 default:
618 break;
619 }
620 }
621
622 static void sunmouse_event(void *opaque,
623 int dx, int dy, int dz, int buttons_state)
624 {
625 ChannelState *s = opaque;
626 int ch;
627
628 /* XXX: SDL sometimes generates nul events: we delete them */
629 if (dx == 0 && dy == 0 && dz == 0 && buttons_state == 0)
630 return;
631 MS_DPRINTF("dx=%d dy=%d buttons=%01x\n", dx, dy, buttons_state);
632
633 ch = 0x80 | 0x7; /* protocol start byte, no buttons pressed */
634
635 if (buttons_state & MOUSE_EVENT_LBUTTON)
636 ch ^= 0x4;
637 if (buttons_state & MOUSE_EVENT_MBUTTON)
638 ch ^= 0x2;
639 if (buttons_state & MOUSE_EVENT_RBUTTON)
640 ch ^= 0x1;
641
642 put_queue(s, ch);
643
644 ch = dx;
645
646 if (ch > 127)
647 ch=127;
648 else if (ch < -127)
649 ch=-127;
650
651 put_queue(s, ch & 0xff);
652
653 ch = -dy;
654
655 if (ch > 127)
656 ch=127;
657 else if (ch < -127)
658 ch=-127;
659
660 put_queue(s, ch & 0xff);
661
662 // MSC protocol specify two extra motion bytes
663
664 put_queue(s, 0);
665 put_queue(s, 0);
666 }
667
668 void slavio_serial_ms_kbd_init(int base, int irq, void *intctl)
669 {
670 int slavio_serial_io_memory, i;
671 SerialState *s;
672
673 s = qemu_mallocz(sizeof(SerialState));
674 if (!s)
675 return;
676 for (i = 0; i < 2; i++) {
677 s->chn[i].irq = irq;
678 s->chn[i].chn = 1 - i;
679 s->chn[i].chr = NULL;
680 s->chn[i].intctl = intctl;
681 }
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;
686
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);
689
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);
694 }