2
2
* QEMU PS/2 keyboard/mouse emulation
4
4
* Copyright (c) 2003 Fabrice Bellard
6
6
* Permission is hereby granted, free of charge, to any person obtaining a copy
7
7
* of this software and associated documentation files (the "Software"), to deal
8
8
* in the Software without restriction, including without limitation the rights
34
32
/* Keyboard Commands */
35
33
#define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */
36
34
#define KBD_CMD_ECHO 0xEE
37
#define KBD_CMD_SCANCODE 0xF0 /* Get/set scancode set */
38
35
#define KBD_CMD_GET_ID 0xF2 /* get keyboard ID */
39
36
#define KBD_CMD_SET_RATE 0xF3 /* Set typematic rate */
40
37
#define KBD_CMD_ENABLE 0xF4 /* Enable scanning */
45
42
/* Keyboard Replies */
46
43
#define KBD_REPLY_POR 0xAA /* Power on reset */
47
#define KBD_REPLY_ID 0xAB /* Keyboard ID */
48
44
#define KBD_REPLY_ACK 0xFA /* Command ACK */
49
45
#define KBD_REPLY_RESEND 0xFE /* Command NACK, send the cmd again */
134
129
s->update_irq(s->update_arg, 1);
138
keycode is expressed as follow:
139
bit 7 - 0 key pressed, 1 = key released
140
bits 6-0 - translated scancode set 2
142
132
static void ps2_put_keycode(void *opaque, int keycode)
144
134
PS2KbdState *s = opaque;
146
/* XXX: add support for scancode sets 1 and 3 */
147
if (!s->translate && keycode < 0xe0 && s->scancode_set == 2)
135
if (!s->translate && keycode < 0xe0)
149
137
if (keycode & 0x80)
150
138
ps2_queue(&s->common, 0xf0);
204
191
case KBD_CMD_GET_ID:
205
192
ps2_queue(&s->common, KBD_REPLY_ACK);
206
/* We emulate a MF2 AT keyboard here */
207
ps2_queue(&s->common, KBD_REPLY_ID);
209
ps2_queue(&s->common, 0x41);
211
ps2_queue(&s->common, 0x83);
193
ps2_queue(&s->common, 0xab);
194
ps2_queue(&s->common, 0x83);
213
196
case KBD_CMD_ECHO:
214
197
ps2_queue(&s->common, KBD_CMD_ECHO);
246
case KBD_CMD_SCANCODE:
248
if (s->scancode_set == 1)
249
ps2_put_keycode(s, 0x43);
250
else if (s->scancode_set == 2)
251
ps2_put_keycode(s, 0x41);
252
else if (s->scancode_set == 3)
253
ps2_put_keycode(s, 0x3f);
255
if (val >= 1 && val <= 3)
256
s->scancode_set = val;
257
ps2_queue(&s->common, KBD_REPLY_ACK);
259
s->common.write_cmd = -1;
261
228
case KBD_CMD_SET_LEDS:
262
229
ps2_queue(&s->common, KBD_REPLY_ACK);
263
230
s->common.write_cmd = -1;
327
294
s->mouse_dz -= dz1;
330
static void ps2_mouse_event(void *opaque,
297
static void ps2_mouse_event(void *opaque,
331
298
int dx, int dy, int dz, int buttons_state)
333
300
PS2MouseState *s = opaque;
360
void ps2_mouse_fake_event(void *opaque)
362
ps2_mouse_event(opaque, 1, 0, 0, 0);
365
327
void ps2_write_mouse(void *opaque, int val)
367
329
PS2MouseState *s = (PS2MouseState *)opaque;
467
429
s->mouse_detect_state = 0;
471
433
s->mouse_type = 3; /* IMPS/2 */
472
434
s->mouse_detect_state = 0;
476
438
s->mouse_type = 4; /* IMEX */
477
439
s->mouse_detect_state = 0;
502
464
static void ps2_common_save (QEMUFile *f, PS2State *s)
504
qemu_put_be32 (f, s->write_cmd);
505
qemu_put_be32 (f, s->queue.rptr);
506
qemu_put_be32 (f, s->queue.wptr);
507
qemu_put_be32 (f, s->queue.count);
466
qemu_put_be32s (f, &s->write_cmd);
467
qemu_put_be32s (f, &s->queue.rptr);
468
qemu_put_be32s (f, &s->queue.wptr);
469
qemu_put_be32s (f, &s->queue.count);
508
470
qemu_put_buffer (f, s->queue.data, sizeof (s->queue.data));
511
473
static void ps2_common_load (QEMUFile *f, PS2State *s)
513
s->write_cmd=qemu_get_be32 (f);
514
s->queue.rptr=qemu_get_be32 (f);
515
s->queue.wptr=qemu_get_be32 (f);
516
s->queue.count=qemu_get_be32 (f);
475
qemu_get_be32s (f, &s->write_cmd);
476
qemu_get_be32s (f, &s->queue.rptr);
477
qemu_get_be32s (f, &s->queue.wptr);
478
qemu_get_be32s (f, &s->queue.count);
517
479
qemu_get_buffer (f, s->queue.data, sizeof (s->queue.data));
522
484
PS2KbdState *s = (PS2KbdState*)opaque;
524
486
ps2_common_save (f, &s->common);
525
qemu_put_be32(f, s->scan_enabled);
526
qemu_put_be32(f, s->translate);
527
qemu_put_be32(f, s->scancode_set);
487
qemu_put_be32s(f, &s->scan_enabled);
488
qemu_put_be32s(f, &s->translate);
530
491
static void ps2_mouse_save(QEMUFile* f, void* opaque)
538
499
qemu_put_8s(f, &s->mouse_wrap);
539
500
qemu_put_8s(f, &s->mouse_type);
540
501
qemu_put_8s(f, &s->mouse_detect_state);
541
qemu_put_be32(f, s->mouse_dx);
542
qemu_put_be32(f, s->mouse_dy);
543
qemu_put_be32(f, s->mouse_dz);
502
qemu_put_be32s(f, &s->mouse_dx);
503
qemu_put_be32s(f, &s->mouse_dy);
504
qemu_put_be32s(f, &s->mouse_dz);
544
505
qemu_put_8s(f, &s->mouse_buttons);
549
510
PS2KbdState *s = (PS2KbdState*)opaque;
551
if (version_id != 2 && version_id != 3)
554
515
ps2_common_load (f, &s->common);
555
s->scan_enabled=qemu_get_be32(f);
556
s->translate=qemu_get_be32(f);
558
s->scancode_set=qemu_get_be32(f);
516
qemu_get_be32s(f, &s->scan_enabled);
517
qemu_get_be32s(f, &s->translate);
575
532
qemu_get_8s(f, &s->mouse_wrap);
576
533
qemu_get_8s(f, &s->mouse_type);
577
534
qemu_get_8s(f, &s->mouse_detect_state);
578
s->mouse_dx=qemu_get_be32(f);
579
s->mouse_dy=qemu_get_be32(f);
580
s->mouse_dz=qemu_get_be32(f);
535
qemu_get_be32s(f, &s->mouse_dx);
536
qemu_get_be32s(f, &s->mouse_dy);
537
qemu_get_be32s(f, &s->mouse_dz);
581
538
qemu_get_8s(f, &s->mouse_buttons);
589
546
s->common.update_irq = update_irq;
590
547
s->common.update_arg = update_arg;
592
548
ps2_reset(&s->common);
593
register_savevm("ps2kbd", 0, 3, ps2_kbd_save, ps2_kbd_load, s);
549
register_savevm("ps2kbd", 0, 2, ps2_kbd_save, ps2_kbd_load, s);
594
550
qemu_add_kbd_event_handler(ps2_put_keycode, s);
595
551
qemu_register_reset(ps2_reset, &s->common);
604
560
s->common.update_arg = update_arg;
605
561
ps2_reset(&s->common);
606
562
register_savevm("ps2mouse", 0, 2, ps2_mouse_save, ps2_mouse_load, s);
607
qemu_add_mouse_event_handler(ps2_mouse_event, s, 0, "QEMU PS/2 Mouse");
563
qemu_add_mouse_event_handler(ps2_mouse_event, s, 0);
608
564
qemu_register_reset(ps2_reset, &s->common);