X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=hw%2Fps2.c;h=5367df10ce4ec4b89589766dd19b929d7ee9005f;hb=cd346349b45ef056f138a184f660b8c34c3213cc;hp=be6b31ce7c614b1e8e4c14bb6ba98d37e756c8c5;hpb=f94f5d717c14d18e0a4af2b157ca5a231d7bcc38;p=qemu diff --git a/hw/ps2.c b/hw/ps2.c index be6b31c..5367df1 100644 --- a/hw/ps2.c +++ b/hw/ps2.c @@ -1,8 +1,8 @@ /* * QEMU PS/2 keyboard/mouse emulation - * + * * Copyright (c) 2003 Fabrice Bellard - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights @@ -146,7 +146,7 @@ uint32_t ps2_read_data(void *opaque) PS2State *s = (PS2State *)opaque; PS2Queue *q; int val, index; - + q = &s->queue; if (q->count == 0) { /* NOTE: if no data left, we return the last keyboard one @@ -294,7 +294,7 @@ static void ps2_mouse_send_packet(PS2MouseState *s) s->mouse_dz -= dz1; } -static void ps2_mouse_event(void *opaque, +static void ps2_mouse_event(void *opaque, int dx, int dy, int dz, int buttons_state) { PS2MouseState *s = opaque; @@ -311,7 +311,7 @@ static void ps2_mouse_event(void *opaque, s->mouse_buttons == buttons_state) return; s->mouse_buttons = buttons_state; - + if (!(s->mouse_status & MOUSE_STATUS_REMOTE) && (s->common.queue.count < (PS2_QUEUE_SIZE - 16))) { for(;;) { @@ -324,6 +324,11 @@ static void ps2_mouse_event(void *opaque, } } +void ps2_mouse_fake_event(void *opaque) +{ + ps2_mouse_event(opaque, 1, 0, 0, 0); +} + void ps2_write_mouse(void *opaque, int val) { PS2MouseState *s = (PS2MouseState *)opaque; @@ -429,12 +434,12 @@ void ps2_write_mouse(void *opaque, int val) s->mouse_detect_state = 0; break; case 2: - if (val == 80) + if (val == 80) s->mouse_type = 3; /* IMPS/2 */ s->mouse_detect_state = 0; break; case 3: - if (val == 80) + if (val == 80) s->mouse_type = 4; /* IMEX */ s->mouse_detect_state = 0; break; @@ -461,19 +466,38 @@ static void ps2_reset(void *opaque) q->count = 0; } +static void ps2_common_save (QEMUFile *f, PS2State *s) +{ + qemu_put_be32s (f, &s->write_cmd); + qemu_put_be32s (f, &s->queue.rptr); + qemu_put_be32s (f, &s->queue.wptr); + qemu_put_be32s (f, &s->queue.count); + qemu_put_buffer (f, s->queue.data, sizeof (s->queue.data)); +} + +static void ps2_common_load (QEMUFile *f, PS2State *s) +{ + qemu_get_be32s (f, &s->write_cmd); + qemu_get_be32s (f, &s->queue.rptr); + qemu_get_be32s (f, &s->queue.wptr); + qemu_get_be32s (f, &s->queue.count); + qemu_get_buffer (f, s->queue.data, sizeof (s->queue.data)); +} + static void ps2_kbd_save(QEMUFile* f, void* opaque) { PS2KbdState *s = (PS2KbdState*)opaque; - - qemu_put_be32s(f, &s->common.write_cmd); + + ps2_common_save (f, &s->common); qemu_put_be32s(f, &s->scan_enabled); + qemu_put_be32s(f, &s->translate); } static void ps2_mouse_save(QEMUFile* f, void* opaque) { PS2MouseState *s = (PS2MouseState*)opaque; - - qemu_put_be32s(f, &s->common.write_cmd); + + ps2_common_save (f, &s->common); qemu_put_8s(f, &s->mouse_status); qemu_put_8s(f, &s->mouse_resolution); qemu_put_8s(f, &s->mouse_sample_rate); @@ -489,21 +513,24 @@ static void ps2_mouse_save(QEMUFile* f, void* opaque) static int ps2_kbd_load(QEMUFile* f, void* opaque, int version_id) { PS2KbdState *s = (PS2KbdState*)opaque; - - if (version_id != 1) + + if (version_id != 2) return -EINVAL; - qemu_get_be32s(f, &s->common.write_cmd); + + ps2_common_load (f, &s->common); qemu_get_be32s(f, &s->scan_enabled); + qemu_get_be32s(f, &s->translate); return 0; } static int ps2_mouse_load(QEMUFile* f, void* opaque, int version_id) { PS2MouseState *s = (PS2MouseState*)opaque; - - if (version_id != 1) + + if (version_id != 2) return -EINVAL; - qemu_get_be32s(f, &s->common.write_cmd); + + ps2_common_load (f, &s->common); qemu_get_8s(f, &s->mouse_status); qemu_get_8s(f, &s->mouse_resolution); qemu_get_8s(f, &s->mouse_sample_rate); @@ -524,7 +551,7 @@ void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg) s->common.update_irq = update_irq; s->common.update_arg = update_arg; ps2_reset(&s->common); - register_savevm("ps2kbd", 0, 1, ps2_kbd_save, ps2_kbd_load, s); + register_savevm("ps2kbd", 0, 2, ps2_kbd_save, ps2_kbd_load, s); qemu_add_kbd_event_handler(ps2_put_keycode, s); qemu_register_reset(ps2_reset, &s->common); return s; @@ -537,8 +564,8 @@ void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg) s->common.update_irq = update_irq; s->common.update_arg = update_arg; ps2_reset(&s->common); - register_savevm("ps2mouse", 0, 1, ps2_mouse_save, ps2_mouse_load, s); - qemu_add_mouse_event_handler(ps2_mouse_event, s); + register_savevm("ps2mouse", 0, 2, ps2_mouse_save, ps2_mouse_load, s); + qemu_add_mouse_event_handler(ps2_mouse_event, s, 0, "QEMU PS/2 Mouse"); qemu_register_reset(ps2_reset, &s->common); return s; }