2 * QEMU PS/2 keyboard/mouse emulation
4 * Copyright (c) 2003 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
25 #include "qemu/osdep.h"
27 #include "hw/input/ps2.h"
28 #include "migration/vmstate.h"
29 #include "ui/console.h"
31 #include "sysemu/reset.h"
32 #include "sysemu/runstate.h"
36 /* Keyboard Commands */
37 #define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */
38 #define KBD_CMD_ECHO 0xEE
39 #define KBD_CMD_SCANCODE 0xF0 /* Get/set scancode set */
40 #define KBD_CMD_GET_ID 0xF2 /* get keyboard ID */
41 #define KBD_CMD_SET_RATE 0xF3 /* Set typematic rate */
42 #define KBD_CMD_ENABLE 0xF4 /* Enable scanning */
43 #define KBD_CMD_RESET_DISABLE 0xF5 /* reset and disable scanning */
44 #define KBD_CMD_RESET_ENABLE 0xF6 /* reset and enable scanning */
45 #define KBD_CMD_RESET 0xFF /* Reset */
46 #define KBD_CMD_SET_MAKE_BREAK 0xFC /* Set Make and Break mode */
47 #define KBD_CMD_SET_TYPEMATIC 0xFA /* Set Typematic Make and Break mode */
49 /* Keyboard Replies */
50 #define KBD_REPLY_POR 0xAA /* Power on reset */
51 #define KBD_REPLY_ID 0xAB /* Keyboard ID */
52 #define KBD_REPLY_ACK 0xFA /* Command ACK */
53 #define KBD_REPLY_RESEND 0xFE /* Command NACK, send the cmd again */
56 #define AUX_SET_SCALE11 0xE6 /* Set 1:1 scaling */
57 #define AUX_SET_SCALE21 0xE7 /* Set 2:1 scaling */
58 #define AUX_SET_RES 0xE8 /* Set resolution */
59 #define AUX_GET_SCALE 0xE9 /* Get scaling factor */
60 #define AUX_SET_STREAM 0xEA /* Set stream mode */
61 #define AUX_POLL 0xEB /* Poll */
62 #define AUX_RESET_WRAP 0xEC /* Reset wrap mode */
63 #define AUX_SET_WRAP 0xEE /* Set wrap mode */
64 #define AUX_SET_REMOTE 0xF0 /* Set remote mode */
65 #define AUX_GET_TYPE 0xF2 /* Get type */
66 #define AUX_SET_SAMPLE 0xF3 /* Set sample rate */
67 #define AUX_ENABLE_DEV 0xF4 /* Enable aux device */
68 #define AUX_DISABLE_DEV 0xF5 /* Disable aux device */
69 #define AUX_SET_DEFAULT 0xF6
70 #define AUX_RESET 0xFF /* Reset aux device */
71 #define AUX_ACK 0xFA /* Command byte ACK. */
73 #define MOUSE_STATUS_REMOTE 0x40
74 #define MOUSE_STATUS_ENABLED 0x20
75 #define MOUSE_STATUS_SCALE21 0x10
77 #define PS2_QUEUE_SIZE 16 /* Buffer size required by PS/2 protocol */
79 /* Bits for 'modifiers' field in PS2KbdState */
80 #define MOD_CTRL_L (1 << 0)
81 #define MOD_SHIFT_L (1 << 1)
82 #define MOD_ALT_L (1 << 2)
83 #define MOD_CTRL_R (1 << 3)
84 #define MOD_SHIFT_R (1 << 4)
85 #define MOD_ALT_R (1 << 5)
88 /* Keep the data array 256 bytes long, which compatibility
89 with older qemu versions. */
91 int rptr
, wptr
, count
;
97 void (*update_irq
)(void *, int);
105 int scancode_set
; /* 1=XT, 2=AT, 3=PS/2 */
108 unsigned int modifiers
; /* bitmask of MOD_* constants above */
113 uint8_t mouse_status
;
114 uint8_t mouse_resolution
;
115 uint8_t mouse_sample_rate
;
117 uint8_t mouse_type
; /* 0 = PS2, 3 = IMPS/2, 4 = IMEX */
118 uint8_t mouse_detect_state
;
119 int mouse_dx
; /* current values, needed for 'poll' mode */
122 uint8_t mouse_buttons
;
125 static uint8_t translate_table
[256] = {
126 0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58,
127 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59,
128 0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a,
129 0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b,
130 0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c,
131 0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d,
132 0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e,
133 0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f,
134 0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60,
135 0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61,
136 0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e,
137 0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76,
138 0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b,
139 0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f,
140 0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45,
141 0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54,
142 0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87,
143 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
144 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
145 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
146 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
147 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
148 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
149 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
150 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
151 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
152 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
153 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
154 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
155 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
156 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
157 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
160 static unsigned int ps2_modifier_bit(QKeyCode key
)
163 case Q_KEY_CODE_CTRL
:
165 case Q_KEY_CODE_CTRL_R
:
167 case Q_KEY_CODE_SHIFT
:
169 case Q_KEY_CODE_SHIFT_R
:
173 case Q_KEY_CODE_ALT_R
:
180 static void ps2_reset_queue(PS2State
*s
)
182 PS2Queue
*q
= &s
->queue
;
189 int ps2_queue_empty(PS2State
*s
)
191 return s
->queue
.count
== 0;
194 void ps2_queue_noirq(PS2State
*s
, int b
)
196 PS2Queue
*q
= &s
->queue
;
198 if (q
->count
== PS2_QUEUE_SIZE
) {
202 q
->data
[q
->wptr
] = b
;
203 if (++q
->wptr
== PS2_QUEUE_SIZE
)
208 void ps2_raise_irq(PS2State
*s
)
210 s
->update_irq(s
->update_arg
, 1);
213 void ps2_queue(PS2State
*s
, int b
)
215 if (PS2_QUEUE_SIZE
- s
->queue
.count
< 1) {
219 ps2_queue_noirq(s
, b
);
223 void ps2_queue_2(PS2State
*s
, int b1
, int b2
)
225 if (PS2_QUEUE_SIZE
- s
->queue
.count
< 2) {
229 ps2_queue_noirq(s
, b1
);
230 ps2_queue_noirq(s
, b2
);
234 void ps2_queue_3(PS2State
*s
, int b1
, int b2
, int b3
)
236 if (PS2_QUEUE_SIZE
- s
->queue
.count
< 3) {
240 ps2_queue_noirq(s
, b1
);
241 ps2_queue_noirq(s
, b2
);
242 ps2_queue_noirq(s
, b3
);
246 void ps2_queue_4(PS2State
*s
, int b1
, int b2
, int b3
, int b4
)
248 if (PS2_QUEUE_SIZE
- s
->queue
.count
< 4) {
252 ps2_queue_noirq(s
, b1
);
253 ps2_queue_noirq(s
, b2
);
254 ps2_queue_noirq(s
, b3
);
255 ps2_queue_noirq(s
, b4
);
259 /* keycode is the untranslated scancode in the current scancode set. */
260 static void ps2_put_keycode(void *opaque
, int keycode
)
262 PS2KbdState
*s
= opaque
;
264 trace_ps2_put_keycode(opaque
, keycode
);
265 qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER
, NULL
);
268 if (keycode
== 0xf0) {
269 s
->need_high_bit
= true;
270 } else if (s
->need_high_bit
) {
271 ps2_queue(&s
->common
, translate_table
[keycode
] | 0x80);
272 s
->need_high_bit
= false;
274 ps2_queue(&s
->common
, translate_table
[keycode
]);
277 ps2_queue(&s
->common
, keycode
);
281 static void ps2_keyboard_event(DeviceState
*dev
, QemuConsole
*src
,
284 PS2KbdState
*s
= (PS2KbdState
*)dev
;
285 InputKeyEvent
*key
= evt
->u
.key
.data
;
287 uint16_t keycode
= 0;
290 /* do not process events while disabled to prevent stream corruption */
291 if (!s
->scan_enabled
) {
295 qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER
, NULL
);
296 assert(evt
->type
== INPUT_EVENT_KIND_KEY
);
297 qcode
= qemu_input_key_value_to_qcode(key
->key
);
299 mod
= ps2_modifier_bit(qcode
);
300 trace_ps2_keyboard_event(s
, qcode
, key
->down
, mod
,
301 s
->modifiers
, s
->scancode_set
, s
->translate
);
305 s
->modifiers
&= ~mod
;
308 if (s
->scancode_set
== 1) {
309 if (qcode
== Q_KEY_CODE_PAUSE
) {
310 if (s
->modifiers
& (MOD_CTRL_L
| MOD_CTRL_R
)) {
312 ps2_put_keycode(s
, 0xe0);
313 ps2_put_keycode(s
, 0x46);
314 ps2_put_keycode(s
, 0xe0);
315 ps2_put_keycode(s
, 0xc6);
319 ps2_put_keycode(s
, 0xe1);
320 ps2_put_keycode(s
, 0x1d);
321 ps2_put_keycode(s
, 0x45);
322 ps2_put_keycode(s
, 0xe1);
323 ps2_put_keycode(s
, 0x9d);
324 ps2_put_keycode(s
, 0xc5);
327 } else if (qcode
== Q_KEY_CODE_PRINT
) {
328 if (s
->modifiers
& MOD_ALT_L
) {
330 ps2_put_keycode(s
, 0xb8);
331 ps2_put_keycode(s
, 0x38);
332 ps2_put_keycode(s
, 0x54);
334 ps2_put_keycode(s
, 0xd4);
335 ps2_put_keycode(s
, 0xb8);
336 ps2_put_keycode(s
, 0x38);
338 } else if (s
->modifiers
& MOD_ALT_R
) {
340 ps2_put_keycode(s
, 0xe0);
341 ps2_put_keycode(s
, 0xb8);
342 ps2_put_keycode(s
, 0xe0);
343 ps2_put_keycode(s
, 0x38);
344 ps2_put_keycode(s
, 0x54);
346 ps2_put_keycode(s
, 0xd4);
347 ps2_put_keycode(s
, 0xe0);
348 ps2_put_keycode(s
, 0xb8);
349 ps2_put_keycode(s
, 0xe0);
350 ps2_put_keycode(s
, 0x38);
352 } else if (s
->modifiers
& (MOD_SHIFT_L
| MOD_CTRL_L
|
353 MOD_SHIFT_R
| MOD_CTRL_R
)) {
355 ps2_put_keycode(s
, 0xe0);
356 ps2_put_keycode(s
, 0x37);
358 ps2_put_keycode(s
, 0xe0);
359 ps2_put_keycode(s
, 0xb7);
363 ps2_put_keycode(s
, 0xe0);
364 ps2_put_keycode(s
, 0x2a);
365 ps2_put_keycode(s
, 0xe0);
366 ps2_put_keycode(s
, 0x37);
368 ps2_put_keycode(s
, 0xe0);
369 ps2_put_keycode(s
, 0xb7);
370 ps2_put_keycode(s
, 0xe0);
371 ps2_put_keycode(s
, 0xaa);
375 if (qcode
< qemu_input_map_qcode_to_atset1_len
)
376 keycode
= qemu_input_map_qcode_to_atset1
[qcode
];
378 if (keycode
& 0xff00) {
379 ps2_put_keycode(s
, keycode
>> 8);
384 ps2_put_keycode(s
, keycode
& 0xff);
386 qemu_log_mask(LOG_UNIMP
,
387 "ps2: ignoring key with qcode %d\n", qcode
);
390 } else if (s
->scancode_set
== 2) {
391 if (qcode
== Q_KEY_CODE_PAUSE
) {
392 if (s
->modifiers
& (MOD_CTRL_L
| MOD_CTRL_R
)) {
394 ps2_put_keycode(s
, 0xe0);
395 ps2_put_keycode(s
, 0x7e);
396 ps2_put_keycode(s
, 0xe0);
397 ps2_put_keycode(s
, 0xf0);
398 ps2_put_keycode(s
, 0x7e);
402 ps2_put_keycode(s
, 0xe1);
403 ps2_put_keycode(s
, 0x14);
404 ps2_put_keycode(s
, 0x77);
405 ps2_put_keycode(s
, 0xe1);
406 ps2_put_keycode(s
, 0xf0);
407 ps2_put_keycode(s
, 0x14);
408 ps2_put_keycode(s
, 0xf0);
409 ps2_put_keycode(s
, 0x77);
412 } else if (qcode
== Q_KEY_CODE_PRINT
) {
413 if (s
->modifiers
& MOD_ALT_L
) {
415 ps2_put_keycode(s
, 0xf0);
416 ps2_put_keycode(s
, 0x11);
417 ps2_put_keycode(s
, 0x11);
418 ps2_put_keycode(s
, 0x84);
420 ps2_put_keycode(s
, 0xf0);
421 ps2_put_keycode(s
, 0x84);
422 ps2_put_keycode(s
, 0xf0);
423 ps2_put_keycode(s
, 0x11);
424 ps2_put_keycode(s
, 0x11);
426 } else if (s
->modifiers
& MOD_ALT_R
) {
428 ps2_put_keycode(s
, 0xe0);
429 ps2_put_keycode(s
, 0xf0);
430 ps2_put_keycode(s
, 0x11);
431 ps2_put_keycode(s
, 0xe0);
432 ps2_put_keycode(s
, 0x11);
433 ps2_put_keycode(s
, 0x84);
435 ps2_put_keycode(s
, 0xf0);
436 ps2_put_keycode(s
, 0x84);
437 ps2_put_keycode(s
, 0xe0);
438 ps2_put_keycode(s
, 0xf0);
439 ps2_put_keycode(s
, 0x11);
440 ps2_put_keycode(s
, 0xe0);
441 ps2_put_keycode(s
, 0x11);
443 } else if (s
->modifiers
& (MOD_SHIFT_L
| MOD_CTRL_L
|
444 MOD_SHIFT_R
| MOD_CTRL_R
)) {
446 ps2_put_keycode(s
, 0xe0);
447 ps2_put_keycode(s
, 0x7c);
449 ps2_put_keycode(s
, 0xe0);
450 ps2_put_keycode(s
, 0xf0);
451 ps2_put_keycode(s
, 0x7c);
455 ps2_put_keycode(s
, 0xe0);
456 ps2_put_keycode(s
, 0x12);
457 ps2_put_keycode(s
, 0xe0);
458 ps2_put_keycode(s
, 0x7c);
460 ps2_put_keycode(s
, 0xe0);
461 ps2_put_keycode(s
, 0xf0);
462 ps2_put_keycode(s
, 0x7c);
463 ps2_put_keycode(s
, 0xe0);
464 ps2_put_keycode(s
, 0xf0);
465 ps2_put_keycode(s
, 0x12);
469 if (qcode
< qemu_input_map_qcode_to_atset2_len
)
470 keycode
= qemu_input_map_qcode_to_atset2
[qcode
];
472 if (keycode
& 0xff00) {
473 ps2_put_keycode(s
, keycode
>> 8);
476 ps2_put_keycode(s
, 0xf0);
478 ps2_put_keycode(s
, keycode
& 0xff);
480 qemu_log_mask(LOG_UNIMP
,
481 "ps2: ignoring key with qcode %d\n", qcode
);
484 } else if (s
->scancode_set
== 3) {
485 if (qcode
< qemu_input_map_qcode_to_atset3_len
)
486 keycode
= qemu_input_map_qcode_to_atset3
[qcode
];
488 /* FIXME: break code should be configured on a key by key basis */
490 ps2_put_keycode(s
, 0xf0);
492 ps2_put_keycode(s
, keycode
);
494 qemu_log_mask(LOG_UNIMP
,
495 "ps2: ignoring key with qcode %d\n", qcode
);
500 uint32_t ps2_read_data(PS2State
*s
)
505 trace_ps2_read_data(s
);
508 /* NOTE: if no data left, we return the last keyboard one
509 (needed for EMM386) */
510 /* XXX: need a timer to do things correctly */
513 index
= PS2_QUEUE_SIZE
- 1;
514 val
= q
->data
[index
];
516 val
= q
->data
[q
->rptr
];
517 if (++q
->rptr
== PS2_QUEUE_SIZE
)
520 /* reading deasserts IRQ */
521 s
->update_irq(s
->update_arg
, 0);
522 /* reassert IRQs if data left */
524 s
->update_irq(s
->update_arg
, 1);
530 static void ps2_set_ledstate(PS2KbdState
*s
, int ledstate
)
532 trace_ps2_set_ledstate(s
, ledstate
);
533 s
->ledstate
= ledstate
;
534 kbd_put_ledstate(ledstate
);
537 static void ps2_reset_keyboard(PS2KbdState
*s
)
539 trace_ps2_reset_keyboard(s
);
542 ps2_reset_queue(&s
->common
);
543 ps2_set_ledstate(s
, 0);
546 void ps2_write_keyboard(void *opaque
, int val
)
548 PS2KbdState
*s
= (PS2KbdState
*)opaque
;
550 trace_ps2_write_keyboard(opaque
, val
);
551 switch(s
->common
.write_cmd
) {
556 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
559 ps2_queue(&s
->common
, KBD_REPLY_RESEND
);
562 /* We emulate a MF2 AT keyboard here */
564 ps2_queue_3(&s
->common
,
569 ps2_queue_3(&s
->common
,
575 ps2_queue(&s
->common
, KBD_CMD_ECHO
);
579 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
581 case KBD_CMD_SCANCODE
:
582 case KBD_CMD_SET_LEDS
:
583 case KBD_CMD_SET_RATE
:
584 case KBD_CMD_SET_MAKE_BREAK
:
585 s
->common
.write_cmd
= val
;
586 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
588 case KBD_CMD_RESET_DISABLE
:
589 ps2_reset_keyboard(s
);
591 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
593 case KBD_CMD_RESET_ENABLE
:
594 ps2_reset_keyboard(s
);
596 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
599 ps2_reset_keyboard(s
);
600 ps2_queue_2(&s
->common
,
604 case KBD_CMD_SET_TYPEMATIC
:
605 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
608 ps2_queue(&s
->common
, KBD_REPLY_RESEND
);
612 case KBD_CMD_SET_MAKE_BREAK
:
613 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
614 s
->common
.write_cmd
= -1;
616 case KBD_CMD_SCANCODE
:
618 if (s
->common
.queue
.count
<= PS2_QUEUE_SIZE
- 2) {
619 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
620 ps2_put_keycode(s
, s
->scancode_set
);
622 } else if (val
>= 1 && val
<= 3) {
623 s
->scancode_set
= val
;
624 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
626 ps2_queue(&s
->common
, KBD_REPLY_RESEND
);
628 s
->common
.write_cmd
= -1;
630 case KBD_CMD_SET_LEDS
:
631 ps2_set_ledstate(s
, val
);
632 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
633 s
->common
.write_cmd
= -1;
635 case KBD_CMD_SET_RATE
:
636 ps2_queue(&s
->common
, KBD_REPLY_ACK
);
637 s
->common
.write_cmd
= -1;
642 /* Set the scancode translation mode.
644 1 = translated scancodes (used by qemu internally). */
646 void ps2_keyboard_set_translation(void *opaque
, int mode
)
648 PS2KbdState
*s
= (PS2KbdState
*)opaque
;
649 trace_ps2_keyboard_set_translation(opaque
, mode
);
653 static int ps2_mouse_send_packet(PS2MouseState
*s
)
655 /* IMPS/2 and IMEX send 4 bytes, PS2 sends 3 bytes */
656 const int needed
= s
->mouse_type
? 4 : 3;
660 if (PS2_QUEUE_SIZE
- s
->common
.queue
.count
< needed
) {
667 /* XXX: increase range to 8 bits ? */
676 b
= 0x08 | ((dx1
< 0) << 4) | ((dy1
< 0) << 5) | (s
->mouse_buttons
& 0x07);
677 ps2_queue_noirq(&s
->common
, b
);
678 ps2_queue_noirq(&s
->common
, dx1
& 0xff);
679 ps2_queue_noirq(&s
->common
, dy1
& 0xff);
680 /* extra byte for IMPS/2 or IMEX */
681 switch(s
->mouse_type
) {
689 ps2_queue_noirq(&s
->common
, dz1
& 0xff);
696 b
= (dz1
& 0x0f) | ((s
->mouse_buttons
& 0x18) << 1);
697 ps2_queue_noirq(&s
->common
, b
);
701 ps2_raise_irq(&s
->common
);
703 trace_ps2_mouse_send_packet(s
, dx1
, dy1
, dz1
, b
);
712 static void ps2_mouse_event(DeviceState
*dev
, QemuConsole
*src
,
715 static const int bmap
[INPUT_BUTTON__MAX
] = {
716 [INPUT_BUTTON_LEFT
] = PS2_MOUSE_BUTTON_LEFT
,
717 [INPUT_BUTTON_MIDDLE
] = PS2_MOUSE_BUTTON_MIDDLE
,
718 [INPUT_BUTTON_RIGHT
] = PS2_MOUSE_BUTTON_RIGHT
,
719 [INPUT_BUTTON_SIDE
] = PS2_MOUSE_BUTTON_SIDE
,
720 [INPUT_BUTTON_EXTRA
] = PS2_MOUSE_BUTTON_EXTRA
,
722 PS2MouseState
*s
= (PS2MouseState
*)dev
;
723 InputMoveEvent
*move
;
726 /* check if deltas are recorded when disabled */
727 if (!(s
->mouse_status
& MOUSE_STATUS_ENABLED
))
731 case INPUT_EVENT_KIND_REL
:
732 move
= evt
->u
.rel
.data
;
733 if (move
->axis
== INPUT_AXIS_X
) {
734 s
->mouse_dx
+= move
->value
;
735 } else if (move
->axis
== INPUT_AXIS_Y
) {
736 s
->mouse_dy
-= move
->value
;
740 case INPUT_EVENT_KIND_BTN
:
741 btn
= evt
->u
.btn
.data
;
743 s
->mouse_buttons
|= bmap
[btn
->button
];
744 if (btn
->button
== INPUT_BUTTON_WHEEL_UP
) {
746 } else if (btn
->button
== INPUT_BUTTON_WHEEL_DOWN
) {
750 s
->mouse_buttons
&= ~bmap
[btn
->button
];
760 static void ps2_mouse_sync(DeviceState
*dev
)
762 PS2MouseState
*s
= (PS2MouseState
*)dev
;
764 /* do not sync while disabled to prevent stream corruption */
765 if (!(s
->mouse_status
& MOUSE_STATUS_ENABLED
)) {
769 if (s
->mouse_buttons
) {
770 qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER
, NULL
);
772 if (!(s
->mouse_status
& MOUSE_STATUS_REMOTE
)) {
773 /* if not remote, send event. Multiple events are sent if
775 while (ps2_mouse_send_packet(s
)) {
776 if (s
->mouse_dx
== 0 && s
->mouse_dy
== 0 && s
->mouse_dz
== 0)
782 void ps2_mouse_fake_event(void *opaque
)
784 PS2MouseState
*s
= opaque
;
785 trace_ps2_mouse_fake_event(opaque
);
787 ps2_mouse_sync(opaque
);
790 void ps2_write_mouse(void *opaque
, int val
)
792 PS2MouseState
*s
= (PS2MouseState
*)opaque
;
794 trace_ps2_write_mouse(opaque
, val
);
795 switch(s
->common
.write_cmd
) {
800 if (val
== AUX_RESET_WRAP
) {
802 ps2_queue(&s
->common
, AUX_ACK
);
804 } else if (val
!= AUX_RESET
) {
805 ps2_queue(&s
->common
, val
);
810 case AUX_SET_SCALE11
:
811 s
->mouse_status
&= ~MOUSE_STATUS_SCALE21
;
812 ps2_queue(&s
->common
, AUX_ACK
);
814 case AUX_SET_SCALE21
:
815 s
->mouse_status
|= MOUSE_STATUS_SCALE21
;
816 ps2_queue(&s
->common
, AUX_ACK
);
819 s
->mouse_status
&= ~MOUSE_STATUS_REMOTE
;
820 ps2_queue(&s
->common
, AUX_ACK
);
824 ps2_queue(&s
->common
, AUX_ACK
);
827 s
->mouse_status
|= MOUSE_STATUS_REMOTE
;
828 ps2_queue(&s
->common
, AUX_ACK
);
831 ps2_queue_2(&s
->common
,
837 s
->common
.write_cmd
= val
;
838 ps2_queue(&s
->common
, AUX_ACK
);
841 ps2_queue_4(&s
->common
,
845 s
->mouse_sample_rate
);
848 ps2_queue(&s
->common
, AUX_ACK
);
849 ps2_mouse_send_packet(s
);
852 s
->mouse_status
|= MOUSE_STATUS_ENABLED
;
853 ps2_queue(&s
->common
, AUX_ACK
);
855 case AUX_DISABLE_DEV
:
856 s
->mouse_status
&= ~MOUSE_STATUS_ENABLED
;
857 ps2_queue(&s
->common
, AUX_ACK
);
859 case AUX_SET_DEFAULT
:
860 s
->mouse_sample_rate
= 100;
861 s
->mouse_resolution
= 2;
863 ps2_queue(&s
->common
, AUX_ACK
);
866 s
->mouse_sample_rate
= 100;
867 s
->mouse_resolution
= 2;
870 ps2_reset_queue(&s
->common
);
871 ps2_queue_3(&s
->common
,
881 s
->mouse_sample_rate
= val
;
882 /* detect IMPS/2 or IMEX */
883 switch(s
->mouse_detect_state
) {
887 s
->mouse_detect_state
= 1;
891 s
->mouse_detect_state
= 2;
893 s
->mouse_detect_state
= 3;
895 s
->mouse_detect_state
= 0;
899 s
->mouse_type
= 3; /* IMPS/2 */
900 s
->mouse_detect_state
= 0;
904 s
->mouse_type
= 4; /* IMEX */
905 s
->mouse_detect_state
= 0;
908 ps2_queue(&s
->common
, AUX_ACK
);
909 s
->common
.write_cmd
= -1;
912 s
->mouse_resolution
= val
;
913 ps2_queue(&s
->common
, AUX_ACK
);
914 s
->common
.write_cmd
= -1;
919 static void ps2_common_reset(PS2State
*s
)
923 s
->update_irq(s
->update_arg
, 0);
926 static void ps2_common_post_load(PS2State
*s
)
928 PS2Queue
*q
= &s
->queue
;
930 uint8_t tmp_data
[PS2_QUEUE_SIZE
];
932 /* set the useful data buffer queue size, < PS2_QUEUE_SIZE */
936 } else if (q
->count
> PS2_QUEUE_SIZE
) {
937 size
= PS2_QUEUE_SIZE
;
940 /* move the queue elements to the start of data array */
941 for (i
= 0; i
< size
; i
++) {
942 if (q
->rptr
< 0 || q
->rptr
>= sizeof(q
->data
)) {
945 tmp_data
[i
] = q
->data
[q
->rptr
++];
947 memcpy(q
->data
, tmp_data
, size
);
949 /* reset rptr/wptr/count */
951 q
->wptr
= (size
== PS2_QUEUE_SIZE
) ? 0 : size
;
955 static void ps2_kbd_reset(void *opaque
)
957 PS2KbdState
*s
= (PS2KbdState
*) opaque
;
959 trace_ps2_kbd_reset(opaque
);
960 ps2_common_reset(&s
->common
);
967 static void ps2_mouse_reset(void *opaque
)
969 PS2MouseState
*s
= (PS2MouseState
*) opaque
;
971 trace_ps2_mouse_reset(opaque
);
972 ps2_common_reset(&s
->common
);
974 s
->mouse_resolution
= 0;
975 s
->mouse_sample_rate
= 0;
978 s
->mouse_detect_state
= 0;
982 s
->mouse_buttons
= 0;
985 static const VMStateDescription vmstate_ps2_common
= {
986 .name
= "PS2 Common State",
988 .minimum_version_id
= 2,
989 .fields
= (VMStateField
[]) {
990 VMSTATE_INT32(write_cmd
, PS2State
),
991 VMSTATE_INT32(queue
.rptr
, PS2State
),
992 VMSTATE_INT32(queue
.wptr
, PS2State
),
993 VMSTATE_INT32(queue
.count
, PS2State
),
994 VMSTATE_BUFFER(queue
.data
, PS2State
),
995 VMSTATE_END_OF_LIST()
999 static bool ps2_keyboard_ledstate_needed(void *opaque
)
1001 PS2KbdState
*s
= opaque
;
1003 return s
->ledstate
!= 0; /* 0 is default state */
1006 static int ps2_kbd_ledstate_post_load(void *opaque
, int version_id
)
1008 PS2KbdState
*s
= opaque
;
1010 kbd_put_ledstate(s
->ledstate
);
1014 static const VMStateDescription vmstate_ps2_keyboard_ledstate
= {
1015 .name
= "ps2kbd/ledstate",
1017 .minimum_version_id
= 2,
1018 .post_load
= ps2_kbd_ledstate_post_load
,
1019 .needed
= ps2_keyboard_ledstate_needed
,
1020 .fields
= (VMStateField
[]) {
1021 VMSTATE_INT32(ledstate
, PS2KbdState
),
1022 VMSTATE_END_OF_LIST()
1026 static bool ps2_keyboard_need_high_bit_needed(void *opaque
)
1028 PS2KbdState
*s
= opaque
;
1029 return s
->need_high_bit
!= 0; /* 0 is the usual state */
1032 static const VMStateDescription vmstate_ps2_keyboard_need_high_bit
= {
1033 .name
= "ps2kbd/need_high_bit",
1035 .minimum_version_id
= 1,
1036 .needed
= ps2_keyboard_need_high_bit_needed
,
1037 .fields
= (VMStateField
[]) {
1038 VMSTATE_BOOL(need_high_bit
, PS2KbdState
),
1039 VMSTATE_END_OF_LIST()
1043 static int ps2_kbd_post_load(void* opaque
, int version_id
)
1045 PS2KbdState
*s
= (PS2KbdState
*)opaque
;
1046 PS2State
*ps2
= &s
->common
;
1048 if (version_id
== 2)
1051 ps2_common_post_load(ps2
);
1056 static int ps2_kbd_pre_save(void *opaque
)
1058 PS2KbdState
*s
= (PS2KbdState
*)opaque
;
1059 PS2State
*ps2
= &s
->common
;
1061 ps2_common_post_load(ps2
);
1066 static const VMStateDescription vmstate_ps2_keyboard
= {
1069 .minimum_version_id
= 2,
1070 .post_load
= ps2_kbd_post_load
,
1071 .pre_save
= ps2_kbd_pre_save
,
1072 .fields
= (VMStateField
[]) {
1073 VMSTATE_STRUCT(common
, PS2KbdState
, 0, vmstate_ps2_common
, PS2State
),
1074 VMSTATE_INT32(scan_enabled
, PS2KbdState
),
1075 VMSTATE_INT32(translate
, PS2KbdState
),
1076 VMSTATE_INT32_V(scancode_set
, PS2KbdState
,3),
1077 VMSTATE_END_OF_LIST()
1079 .subsections
= (const VMStateDescription
*[]) {
1080 &vmstate_ps2_keyboard_ledstate
,
1081 &vmstate_ps2_keyboard_need_high_bit
,
1086 static int ps2_mouse_post_load(void *opaque
, int version_id
)
1088 PS2MouseState
*s
= (PS2MouseState
*)opaque
;
1089 PS2State
*ps2
= &s
->common
;
1091 ps2_common_post_load(ps2
);
1096 static int ps2_mouse_pre_save(void *opaque
)
1098 PS2MouseState
*s
= (PS2MouseState
*)opaque
;
1099 PS2State
*ps2
= &s
->common
;
1101 ps2_common_post_load(ps2
);
1106 static const VMStateDescription vmstate_ps2_mouse
= {
1109 .minimum_version_id
= 2,
1110 .post_load
= ps2_mouse_post_load
,
1111 .pre_save
= ps2_mouse_pre_save
,
1112 .fields
= (VMStateField
[]) {
1113 VMSTATE_STRUCT(common
, PS2MouseState
, 0, vmstate_ps2_common
, PS2State
),
1114 VMSTATE_UINT8(mouse_status
, PS2MouseState
),
1115 VMSTATE_UINT8(mouse_resolution
, PS2MouseState
),
1116 VMSTATE_UINT8(mouse_sample_rate
, PS2MouseState
),
1117 VMSTATE_UINT8(mouse_wrap
, PS2MouseState
),
1118 VMSTATE_UINT8(mouse_type
, PS2MouseState
),
1119 VMSTATE_UINT8(mouse_detect_state
, PS2MouseState
),
1120 VMSTATE_INT32(mouse_dx
, PS2MouseState
),
1121 VMSTATE_INT32(mouse_dy
, PS2MouseState
),
1122 VMSTATE_INT32(mouse_dz
, PS2MouseState
),
1123 VMSTATE_UINT8(mouse_buttons
, PS2MouseState
),
1124 VMSTATE_END_OF_LIST()
1128 static QemuInputHandler ps2_keyboard_handler
= {
1129 .name
= "QEMU PS/2 Keyboard",
1130 .mask
= INPUT_EVENT_MASK_KEY
,
1131 .event
= ps2_keyboard_event
,
1134 void *ps2_kbd_init(void (*update_irq
)(void *, int), void *update_arg
)
1136 PS2KbdState
*s
= (PS2KbdState
*)g_malloc0(sizeof(PS2KbdState
));
1138 trace_ps2_kbd_init(s
);
1139 s
->common
.update_irq
= update_irq
;
1140 s
->common
.update_arg
= update_arg
;
1141 s
->scancode_set
= 2;
1142 vmstate_register(NULL
, 0, &vmstate_ps2_keyboard
, s
);
1143 qemu_input_handler_register((DeviceState
*)s
,
1144 &ps2_keyboard_handler
);
1145 qemu_register_reset(ps2_kbd_reset
, s
);
1149 static QemuInputHandler ps2_mouse_handler
= {
1150 .name
= "QEMU PS/2 Mouse",
1151 .mask
= INPUT_EVENT_MASK_BTN
| INPUT_EVENT_MASK_REL
,
1152 .event
= ps2_mouse_event
,
1153 .sync
= ps2_mouse_sync
,
1156 void *ps2_mouse_init(void (*update_irq
)(void *, int), void *update_arg
)
1158 PS2MouseState
*s
= (PS2MouseState
*)g_malloc0(sizeof(PS2MouseState
));
1160 trace_ps2_mouse_init(s
);
1161 s
->common
.update_irq
= update_irq
;
1162 s
->common
.update_arg
= update_arg
;
1163 vmstate_register(NULL
, 0, &vmstate_ps2_mouse
, s
);
1164 qemu_input_handler_register((DeviceState
*)s
,
1165 &ps2_mouse_handler
);
1166 qemu_register_reset(ps2_mouse_reset
, s
);