2 * QEMU ESCC (Z8030/Z8530/Z85C30/SCC/ESCC) 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 * On Sparc32 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.
47 * Z85C30 is also used on PowerMacs. There are some small differences
48 * between Sparc version (sunzilog) and PowerMac (pmac):
49 * Offset between control and data registers
50 * There is some kind of lockup bug, but we can ignore it
52 * DMA on pmac using DBDMA chip
53 * pmac can do IRDA and faster rates, sunzilog can only do 38400
54 * pmac baud rate generator clock is 3.6864 MHz, sunzilog 4.9152 MHz
59 * 2006-Aug-10 Igor Kovalenko : Renamed KBDQueue to SERIOQueue, implemented
61 * Implemented serial mouse protocol.
65 #define SER_DPRINTF(fmt, args...) \
66 do { printf("SER: " fmt , ##args); } while (0)
68 #define SER_DPRINTF(fmt, args...)
71 #define KBD_DPRINTF(fmt, args...) \
72 do { printf("KBD: " fmt , ##args); } while (0)
74 #define KBD_DPRINTF(fmt, args...)
77 #define MS_DPRINTF(fmt, args...) \
78 do { printf("MSC: " fmt , ##args); } while (0)
80 #define MS_DPRINTF(fmt, args...)
87 #define CHN_C(s) ((s)->chn == chn_b? 'b' : 'a')
93 #define SERIO_QUEUE_SIZE 256
96 uint8_t data
[SERIO_QUEUE_SIZE
];
97 int rptr
, wptr
, count
;
100 #define SERIAL_REGS 16
101 typedef struct ChannelState
{
104 uint32_t rxint
, txint
, rxint_under_svc
, txint_under_svc
;
105 chn_id_t chn
; // this channel, A (base+4) or B (base+0)
107 struct ChannelState
*otherchn
;
108 uint8_t rx
, tx
, wregs
[SERIAL_REGS
], rregs
[SERIAL_REGS
];
110 CharDriverState
*chr
;
111 int e0_mode
, led_mode
, caps_lock_mode
, num_lock_mode
;
117 struct ChannelState chn
[2];
121 #define SERIAL_CTRL 0
122 #define SERIAL_DATA 1
125 #define CMD_PTR_MASK 0x07
126 #define CMD_CMD_MASK 0x38
128 #define CMD_CLR_TXINT 0x28
129 #define CMD_CLR_IUS 0x38
131 #define INTR_INTALL 0x01
132 #define INTR_TXINT 0x02
133 #define INTR_RXMODEMSK 0x18
134 #define INTR_RXINT1ST 0x08
135 #define INTR_RXINTALL 0x10
138 #define RXCTRL_RXEN 0x01
140 #define TXCTRL1_PAREN 0x01
141 #define TXCTRL1_PAREV 0x02
142 #define TXCTRL1_1STOP 0x04
143 #define TXCTRL1_1HSTOP 0x08
144 #define TXCTRL1_2STOP 0x0c
145 #define TXCTRL1_STPMSK 0x0c
146 #define TXCTRL1_CLK1X 0x00
147 #define TXCTRL1_CLK16X 0x40
148 #define TXCTRL1_CLK32X 0x80
149 #define TXCTRL1_CLK64X 0xc0
150 #define TXCTRL1_CLKMSK 0xc0
152 #define TXCTRL2_TXEN 0x08
153 #define TXCTRL2_BITMSK 0x60
154 #define TXCTRL2_5BITS 0x00
155 #define TXCTRL2_7BITS 0x20
156 #define TXCTRL2_6BITS 0x40
157 #define TXCTRL2_8BITS 0x60
162 #define MINTR_STATUSHI 0x10
163 #define MINTR_RST_MASK 0xc0
164 #define MINTR_RST_B 0x40
165 #define MINTR_RST_A 0x80
166 #define MINTR_RST_ALL 0xc0
169 #define CLOCK_TRXC 0x08
173 #define MISC2_PLLDIS 0x30
175 #define EXTINT_DCD 0x08
176 #define EXTINT_SYNCINT 0x10
177 #define EXTINT_CTSINT 0x20
178 #define EXTINT_TXUNDRN 0x40
179 #define EXTINT_BRKINT 0x80
182 #define STATUS_RXAV 0x01
183 #define STATUS_ZERO 0x02
184 #define STATUS_TXEMPTY 0x04
185 #define STATUS_DCD 0x08
186 #define STATUS_SYNC 0x10
187 #define STATUS_CTS 0x20
188 #define STATUS_TXUNDRN 0x40
189 #define STATUS_BRK 0x80
191 #define SPEC_ALLSENT 0x01
192 #define SPEC_BITS8 0x06
194 #define IVEC_TXINTB 0x00
195 #define IVEC_LONOINT 0x06
196 #define IVEC_LORXINTA 0x0c
197 #define IVEC_LORXINTB 0x04
198 #define IVEC_LOTXINTA 0x08
199 #define IVEC_HINOINT 0x60
200 #define IVEC_HIRXINTA 0x30
201 #define IVEC_HIRXINTB 0x20
202 #define IVEC_HITXINTA 0x10
204 #define INTR_EXTINTB 0x01
205 #define INTR_TXINTB 0x02
206 #define INTR_RXINTB 0x04
207 #define INTR_EXTINTA 0x08
208 #define INTR_TXINTA 0x10
209 #define INTR_RXINTA 0x20
223 static void handle_kbd_command(ChannelState
*s
, int val
);
224 static int serial_can_receive(void *opaque
);
225 static void serial_receive_byte(ChannelState
*s
, int ch
);
227 static void clear_queue(void *opaque
)
229 ChannelState
*s
= opaque
;
230 SERIOQueue
*q
= &s
->queue
;
231 q
->rptr
= q
->wptr
= q
->count
= 0;
234 static void put_queue(void *opaque
, int b
)
236 ChannelState
*s
= opaque
;
237 SERIOQueue
*q
= &s
->queue
;
239 SER_DPRINTF("channel %c put: 0x%02x\n", CHN_C(s
), b
);
240 if (q
->count
>= SERIO_QUEUE_SIZE
)
242 q
->data
[q
->wptr
] = b
;
243 if (++q
->wptr
== SERIO_QUEUE_SIZE
)
246 serial_receive_byte(s
, 0);
249 static uint32_t get_queue(void *opaque
)
251 ChannelState
*s
= opaque
;
252 SERIOQueue
*q
= &s
->queue
;
258 val
= q
->data
[q
->rptr
];
259 if (++q
->rptr
== SERIO_QUEUE_SIZE
)
263 SER_DPRINTF("channel %c get 0x%02x\n", CHN_C(s
), val
);
265 serial_receive_byte(s
, 0);
269 static int escc_update_irq_chn(ChannelState
*s
)
271 if ((((s
->wregs
[W_INTR
] & INTR_TXINT
) && s
->txint
== 1) ||
272 // tx ints enabled, pending
273 ((((s
->wregs
[W_INTR
] & INTR_RXMODEMSK
) == INTR_RXINT1ST
) ||
274 ((s
->wregs
[W_INTR
] & INTR_RXMODEMSK
) == INTR_RXINTALL
)) &&
275 s
->rxint
== 1) || // rx ints enabled, pending
276 ((s
->wregs
[W_EXTINT
] & EXTINT_BRKINT
) &&
277 (s
->rregs
[R_STATUS
] & STATUS_BRK
)))) { // break int e&p
283 static void escc_update_irq(ChannelState
*s
)
287 irq
= escc_update_irq_chn(s
);
288 irq
|= escc_update_irq_chn(s
->otherchn
);
290 SER_DPRINTF("IRQ = %d\n", irq
);
291 qemu_set_irq(s
->irq
, irq
);
294 static void escc_reset_chn(ChannelState
*s
)
299 for (i
= 0; i
< SERIAL_REGS
; i
++) {
303 s
->wregs
[W_TXCTRL1
] = TXCTRL1_1STOP
; // 1X divisor, 1 stop bit, no parity
304 s
->wregs
[W_MINTR
] = MINTR_RST_ALL
;
305 s
->wregs
[W_CLOCK
] = CLOCK_TRXC
; // Synch mode tx clock = TRxC
306 s
->wregs
[W_MISC2
] = MISC2_PLLDIS
; // PLL disabled
307 s
->wregs
[W_EXTINT
] = EXTINT_DCD
| EXTINT_SYNCINT
| EXTINT_CTSINT
|
308 EXTINT_TXUNDRN
| EXTINT_BRKINT
; // Enable most interrupts
310 s
->rregs
[R_STATUS
] = STATUS_TXEMPTY
| STATUS_DCD
| STATUS_SYNC
|
311 STATUS_CTS
| STATUS_TXUNDRN
;
313 s
->rregs
[R_STATUS
] = STATUS_TXEMPTY
| STATUS_TXUNDRN
;
314 s
->rregs
[R_SPEC
] = SPEC_BITS8
| SPEC_ALLSENT
;
317 s
->rxint
= s
->txint
= 0;
318 s
->rxint_under_svc
= s
->txint_under_svc
= 0;
319 s
->e0_mode
= s
->led_mode
= s
->caps_lock_mode
= s
->num_lock_mode
= 0;
323 static void escc_reset(void *opaque
)
325 SerialState
*s
= opaque
;
326 escc_reset_chn(&s
->chn
[0]);
327 escc_reset_chn(&s
->chn
[1]);
330 static inline void set_rxint(ChannelState
*s
)
333 if (!s
->txint_under_svc
) {
334 s
->rxint_under_svc
= 1;
335 if (s
->chn
== chn_a
) {
336 if (s
->wregs
[W_MINTR
] & MINTR_STATUSHI
)
337 s
->otherchn
->rregs
[R_IVEC
] = IVEC_HIRXINTA
;
339 s
->otherchn
->rregs
[R_IVEC
] = IVEC_LORXINTA
;
341 if (s
->wregs
[W_MINTR
] & MINTR_STATUSHI
)
342 s
->rregs
[R_IVEC
] = IVEC_HIRXINTB
;
344 s
->rregs
[R_IVEC
] = IVEC_LORXINTB
;
348 s
->rregs
[R_INTR
] |= INTR_RXINTA
;
350 s
->otherchn
->rregs
[R_INTR
] |= INTR_RXINTB
;
354 static inline void set_txint(ChannelState
*s
)
357 if (!s
->rxint_under_svc
) {
358 s
->txint_under_svc
= 1;
359 if (s
->chn
== chn_a
) {
360 if (s
->wregs
[W_MINTR
] & MINTR_STATUSHI
)
361 s
->otherchn
->rregs
[R_IVEC
] = IVEC_HITXINTA
;
363 s
->otherchn
->rregs
[R_IVEC
] = IVEC_LOTXINTA
;
365 s
->rregs
[R_IVEC
] = IVEC_TXINTB
;
369 s
->rregs
[R_INTR
] |= INTR_TXINTA
;
371 s
->otherchn
->rregs
[R_INTR
] |= INTR_TXINTB
;
375 static inline void clr_rxint(ChannelState
*s
)
378 s
->rxint_under_svc
= 0;
379 if (s
->chn
== chn_a
) {
380 if (s
->wregs
[W_MINTR
] & MINTR_STATUSHI
)
381 s
->otherchn
->rregs
[R_IVEC
] = IVEC_HINOINT
;
383 s
->otherchn
->rregs
[R_IVEC
] = IVEC_LONOINT
;
384 s
->rregs
[R_INTR
] &= ~INTR_RXINTA
;
386 if (s
->wregs
[W_MINTR
] & MINTR_STATUSHI
)
387 s
->rregs
[R_IVEC
] = IVEC_HINOINT
;
389 s
->rregs
[R_IVEC
] = IVEC_LONOINT
;
390 s
->otherchn
->rregs
[R_INTR
] &= ~INTR_RXINTB
;
397 static inline void clr_txint(ChannelState
*s
)
400 s
->txint_under_svc
= 0;
401 if (s
->chn
== chn_a
) {
402 if (s
->wregs
[W_MINTR
] & MINTR_STATUSHI
)
403 s
->otherchn
->rregs
[R_IVEC
] = IVEC_HINOINT
;
405 s
->otherchn
->rregs
[R_IVEC
] = IVEC_LONOINT
;
406 s
->rregs
[R_INTR
] &= ~INTR_TXINTA
;
408 if (s
->wregs
[W_MINTR
] & MINTR_STATUSHI
)
409 s
->rregs
[R_IVEC
] = IVEC_HINOINT
;
411 s
->rregs
[R_IVEC
] = IVEC_LONOINT
;
412 s
->otherchn
->rregs
[R_INTR
] &= ~INTR_TXINTB
;
419 static void escc_update_parameters(ChannelState
*s
)
421 int speed
, parity
, data_bits
, stop_bits
;
422 QEMUSerialSetParams ssp
;
424 if (!s
->chr
|| s
->type
!= ser
)
427 if (s
->wregs
[W_TXCTRL1
] & TXCTRL1_PAREN
) {
428 if (s
->wregs
[W_TXCTRL1
] & TXCTRL1_PAREV
)
435 if ((s
->wregs
[W_TXCTRL1
] & TXCTRL1_STPMSK
) == TXCTRL1_2STOP
)
439 switch (s
->wregs
[W_TXCTRL2
] & TXCTRL2_BITMSK
) {
454 speed
= s
->clock
/ ((s
->wregs
[W_BRGLO
] | (s
->wregs
[W_BRGHI
] << 8)) + 2);
455 switch (s
->wregs
[W_TXCTRL1
] & TXCTRL1_CLKMSK
) {
471 ssp
.data_bits
= data_bits
;
472 ssp
.stop_bits
= stop_bits
;
473 SER_DPRINTF("channel %c: speed=%d parity=%c data=%d stop=%d\n", CHN_C(s
),
474 speed
, parity
, data_bits
, stop_bits
);
475 qemu_chr_ioctl(s
->chr
, CHR_IOCTL_SERIAL_SET_PARAMS
, &ssp
);
478 static void escc_mem_writeb(void *opaque
, target_phys_addr_t addr
, uint32_t val
)
480 SerialState
*serial
= opaque
;
486 saddr
= (addr
>> serial
->it_shift
) & 1;
487 channel
= (addr
>> (serial
->it_shift
+ 1)) & 1;
488 s
= &serial
->chn
[channel
];
491 SER_DPRINTF("Write channel %c, reg[%d] = %2.2x\n", CHN_C(s
), s
->reg
,
496 newreg
= val
& CMD_PTR_MASK
;
506 if (s
->rxint_under_svc
)
508 else if (s
->txint_under_svc
)
515 case W_INTR
... W_RXCTRL
:
516 case W_SYNC1
... W_TXBUF
:
517 case W_MISC1
... W_CLOCK
:
518 case W_MISC2
... W_EXTINT
:
519 s
->wregs
[s
->reg
] = val
;
523 s
->wregs
[s
->reg
] = val
;
524 escc_update_parameters(s
);
528 s
->wregs
[s
->reg
] = val
;
529 s
->rregs
[s
->reg
] = val
;
530 escc_update_parameters(s
);
533 switch (val
& MINTR_RST_MASK
) {
538 escc_reset_chn(&serial
->chn
[0]);
541 escc_reset_chn(&serial
->chn
[1]);
557 SER_DPRINTF("Write channel %c, ch %d\n", CHN_C(s
), val
);
559 if (s
->wregs
[W_TXCTRL2
] & TXCTRL2_TXEN
) { // tx enabled
561 qemu_chr_write(s
->chr
, &s
->tx
, 1);
562 else if (s
->type
== kbd
&& !s
->disabled
) {
563 handle_kbd_command(s
, val
);
566 s
->rregs
[R_STATUS
] |= STATUS_TXEMPTY
; // Tx buffer empty
567 s
->rregs
[R_SPEC
] |= SPEC_ALLSENT
; // All sent
575 static uint32_t escc_mem_readb(void *opaque
, target_phys_addr_t addr
)
577 SerialState
*serial
= opaque
;
583 saddr
= (addr
>> serial
->it_shift
) & 1;
584 channel
= (addr
>> (serial
->it_shift
+ 1)) & 1;
585 s
= &serial
->chn
[channel
];
588 SER_DPRINTF("Read channel %c, reg[%d] = %2.2x\n", CHN_C(s
), s
->reg
,
590 ret
= s
->rregs
[s
->reg
];
594 s
->rregs
[R_STATUS
] &= ~STATUS_RXAV
;
596 if (s
->type
== kbd
|| s
->type
== mouse
)
600 SER_DPRINTF("Read channel %c, ch %d\n", CHN_C(s
), ret
);
602 qemu_chr_accept_input(s
->chr
);
610 static int serial_can_receive(void *opaque
)
612 ChannelState
*s
= opaque
;
615 if (((s
->wregs
[W_RXCTRL
] & RXCTRL_RXEN
) == 0) // Rx not enabled
616 || ((s
->rregs
[R_STATUS
] & STATUS_RXAV
) == STATUS_RXAV
))
617 // char already available
624 static void serial_receive_byte(ChannelState
*s
, int ch
)
626 SER_DPRINTF("channel %c put ch %d\n", CHN_C(s
), ch
);
627 s
->rregs
[R_STATUS
] |= STATUS_RXAV
;
632 static void serial_receive_break(ChannelState
*s
)
634 s
->rregs
[R_STATUS
] |= STATUS_BRK
;
638 static void serial_receive1(void *opaque
, const uint8_t *buf
, int size
)
640 ChannelState
*s
= opaque
;
641 serial_receive_byte(s
, buf
[0]);
644 static void serial_event(void *opaque
, int event
)
646 ChannelState
*s
= opaque
;
647 if (event
== CHR_EVENT_BREAK
)
648 serial_receive_break(s
);
651 static CPUReadMemoryFunc
*escc_mem_read
[3] = {
657 static CPUWriteMemoryFunc
*escc_mem_write
[3] = {
663 static void escc_save_chn(QEMUFile
*f
, ChannelState
*s
)
667 qemu_put_be32s(f
, &tmp
); /* unused, was IRQ. */
668 qemu_put_be32s(f
, &s
->reg
);
669 qemu_put_be32s(f
, &s
->rxint
);
670 qemu_put_be32s(f
, &s
->txint
);
671 qemu_put_be32s(f
, &s
->rxint_under_svc
);
672 qemu_put_be32s(f
, &s
->txint_under_svc
);
673 qemu_put_8s(f
, &s
->rx
);
674 qemu_put_8s(f
, &s
->tx
);
675 qemu_put_buffer(f
, s
->wregs
, SERIAL_REGS
);
676 qemu_put_buffer(f
, s
->rregs
, SERIAL_REGS
);
679 static void escc_save(QEMUFile
*f
, void *opaque
)
681 SerialState
*s
= opaque
;
683 escc_save_chn(f
, &s
->chn
[0]);
684 escc_save_chn(f
, &s
->chn
[1]);
687 static int escc_load_chn(QEMUFile
*f
, ChannelState
*s
, int version_id
)
694 qemu_get_be32s(f
, &tmp
); /* unused */
695 qemu_get_be32s(f
, &s
->reg
);
696 qemu_get_be32s(f
, &s
->rxint
);
697 qemu_get_be32s(f
, &s
->txint
);
698 if (version_id
>= 2) {
699 qemu_get_be32s(f
, &s
->rxint_under_svc
);
700 qemu_get_be32s(f
, &s
->txint_under_svc
);
702 qemu_get_8s(f
, &s
->rx
);
703 qemu_get_8s(f
, &s
->tx
);
704 qemu_get_buffer(f
, s
->wregs
, SERIAL_REGS
);
705 qemu_get_buffer(f
, s
->rregs
, SERIAL_REGS
);
709 static int escc_load(QEMUFile
*f
, void *opaque
, int version_id
)
711 SerialState
*s
= opaque
;
714 ret
= escc_load_chn(f
, &s
->chn
[0], version_id
);
717 ret
= escc_load_chn(f
, &s
->chn
[1], version_id
);
722 int escc_init(target_phys_addr_t base
, qemu_irq irqA
, qemu_irq irqB
,
723 CharDriverState
*chrA
, CharDriverState
*chrB
,
724 int clock
, int it_shift
)
726 int escc_io_memory
, i
;
729 s
= qemu_mallocz(sizeof(SerialState
));
733 escc_io_memory
= cpu_register_io_memory(0, escc_mem_read
,
737 cpu_register_physical_memory(base
, ESCC_SIZE
<< it_shift
,
740 s
->it_shift
= it_shift
;
741 s
->chn
[0].chr
= chrB
;
742 s
->chn
[1].chr
= chrA
;
743 s
->chn
[0].disabled
= 0;
744 s
->chn
[1].disabled
= 0;
745 s
->chn
[0].irq
= irqB
;
746 s
->chn
[1].irq
= irqA
;
748 for (i
= 0; i
< 2; i
++) {
749 s
->chn
[i
].chn
= 1 - i
;
750 s
->chn
[i
].type
= ser
;
751 s
->chn
[i
].clock
= clock
/ 2;
753 qemu_chr_add_handlers(s
->chn
[i
].chr
, serial_can_receive
,
754 serial_receive1
, serial_event
, &s
->chn
[i
]);
757 s
->chn
[0].otherchn
= &s
->chn
[1];
758 s
->chn
[1].otherchn
= &s
->chn
[0];
760 register_savevm("escc", base
, 2, escc_save
, escc_load
, s
);
762 register_savevm("escc", -1, 2, escc_save
, escc_load
, s
);
763 qemu_register_reset(escc_reset
, s
);
765 return escc_io_memory
;
768 static const uint8_t keycodes
[128] = {
769 127, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 53,
770 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 89, 76, 77, 78,
771 79, 80, 81, 82, 83, 84, 85, 86, 87, 42, 99, 88, 100, 101, 102, 103,
772 104, 105, 106, 107, 108, 109, 110, 47, 19, 121, 119, 5, 6, 8, 10, 12,
773 14, 16, 17, 18, 7, 98, 23, 68, 69, 70, 71, 91, 92, 93, 125, 112,
774 113, 114, 94, 50, 0, 0, 124, 9, 11, 0, 0, 0, 0, 0, 0, 0,
775 90, 0, 46, 22, 13, 111, 52, 20, 96, 24, 28, 74, 27, 123, 44, 66,
776 0, 45, 2, 4, 48, 0, 0, 21, 0, 0, 0, 0, 0, 120, 122, 67,
779 static const uint8_t e0_keycodes
[128] = {
780 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
781 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 76, 0, 0,
782 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
783 0, 0, 0, 0, 0, 109, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0,
784 0, 0, 0, 0, 0, 0, 0, 68, 69, 70, 0, 91, 0, 93, 0, 112,
785 113, 114, 94, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
786 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
787 1, 3, 25, 26, 49, 52, 72, 73, 97, 99, 111, 118, 120, 122, 67, 0,
790 static void sunkbd_event(void *opaque
, int ch
)
792 ChannelState
*s
= opaque
;
793 int release
= ch
& 0x80;
795 KBD_DPRINTF("Untranslated keycode %2.2x (%s)\n", ch
, release
? "release" :
798 case 58: // Caps lock press
799 s
->caps_lock_mode
^= 1;
800 if (s
->caps_lock_mode
== 2)
801 return; // Drop second press
803 case 69: // Num lock press
804 s
->num_lock_mode
^= 1;
805 if (s
->num_lock_mode
== 2)
806 return; // Drop second press
808 case 186: // Caps lock release
809 s
->caps_lock_mode
^= 2;
810 if (s
->caps_lock_mode
== 3)
811 return; // Drop first release
813 case 197: // Num lock release
814 s
->num_lock_mode
^= 2;
815 if (s
->num_lock_mode
== 3)
816 return; // Drop first release
826 ch
= e0_keycodes
[ch
& 0x7f];
828 ch
= keycodes
[ch
& 0x7f];
830 KBD_DPRINTF("Translated keycode %2.2x\n", ch
);
831 put_queue(s
, ch
| release
);
834 static void handle_kbd_command(ChannelState
*s
, int val
)
836 KBD_DPRINTF("Command %d\n", val
);
837 if (s
->led_mode
) { // Ignore led byte
842 case 1: // Reset, return type code
845 put_queue(s
, 4); // Type 4
848 case 0xe: // Set leds
851 case 7: // Query layout
855 put_queue(s
, 0); // XXX, layout?
862 static void sunmouse_event(void *opaque
,
863 int dx
, int dy
, int dz
, int buttons_state
)
865 ChannelState
*s
= opaque
;
868 MS_DPRINTF("dx=%d dy=%d buttons=%01x\n", dx
, dy
, buttons_state
);
870 ch
= 0x80 | 0x7; /* protocol start byte, no buttons pressed */
872 if (buttons_state
& MOUSE_EVENT_LBUTTON
)
874 if (buttons_state
& MOUSE_EVENT_MBUTTON
)
876 if (buttons_state
& MOUSE_EVENT_RBUTTON
)
888 put_queue(s
, ch
& 0xff);
897 put_queue(s
, ch
& 0xff);
899 // MSC protocol specify two extra motion bytes
905 void slavio_serial_ms_kbd_init(target_phys_addr_t base
, qemu_irq irq
,
906 int disabled
, int clock
, int it_shift
)
908 int slavio_serial_io_memory
, i
;
911 s
= qemu_mallocz(sizeof(SerialState
));
915 s
->it_shift
= it_shift
;
916 for (i
= 0; i
< 2; i
++) {
918 s
->chn
[i
].chn
= 1 - i
;
919 s
->chn
[i
].chr
= NULL
;
920 s
->chn
[i
].clock
= clock
/ 2;
922 s
->chn
[0].otherchn
= &s
->chn
[1];
923 s
->chn
[1].otherchn
= &s
->chn
[0];
924 s
->chn
[0].type
= mouse
;
925 s
->chn
[1].type
= kbd
;
926 s
->chn
[0].disabled
= disabled
;
927 s
->chn
[1].disabled
= disabled
;
929 slavio_serial_io_memory
= cpu_register_io_memory(0, escc_mem_read
,
932 cpu_register_physical_memory(base
, ESCC_SIZE
<< it_shift
,
933 slavio_serial_io_memory
);
935 qemu_add_mouse_event_handler(sunmouse_event
, &s
->chn
[0], 0,
937 qemu_add_kbd_event_handler(sunkbd_event
, &s
->chn
[1]);
938 register_savevm("slavio_serial_mouse", base
, 2, escc_save
, escc_load
, s
);
939 qemu_register_reset(escc_reset
, s
);