📄 ps2.c
字号:
dz1 = -7; b = (dz1 & 0x0f) | ((s->mouse_buttons & 0x18) << 1); ps2_queue(&s->common, b); break; } /* update deltas */ s->mouse_dx -= dx1; s->mouse_dy -= dy1; s->mouse_dz -= dz1;}static void ps2_mouse_event(void *opaque, int dx, int dy, int dz, int buttons_state){ PS2MouseState *s = opaque; /* check if deltas are recorded when disabled */ if (!(s->mouse_status & MOUSE_STATUS_ENABLED)) return; s->mouse_dx += dx; s->mouse_dy -= dy; s->mouse_dz += dz; /* XXX: SDL sometimes generates nul events: we delete them */ if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0 && 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(;;) { /* if not remote, send event. Multiple events are sent if too big deltas */ ps2_mouse_send_packet(s); if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0) break; } }}void ps2_write_mouse(void *opaque, int val){ PS2MouseState *s = (PS2MouseState *)opaque;#ifdef DEBUG_MOUSE printf("kbd: write mouse 0x%02x\n", val);#endif switch(s->common.write_cmd) { default: case -1: /* mouse command */ if (s->mouse_wrap) { if (val == AUX_RESET_WRAP) { s->mouse_wrap = 0; ps2_queue(&s->common, AUX_ACK); return; } else if (val != AUX_RESET) { ps2_queue(&s->common, val); return; } } switch(val) { case AUX_SET_SCALE11: s->mouse_status &= ~MOUSE_STATUS_SCALE21; ps2_queue(&s->common, AUX_ACK); break; case AUX_SET_SCALE21: s->mouse_status |= MOUSE_STATUS_SCALE21; ps2_queue(&s->common, AUX_ACK); break; case AUX_SET_STREAM: s->mouse_status &= ~MOUSE_STATUS_REMOTE; ps2_queue(&s->common, AUX_ACK); break; case AUX_SET_WRAP: s->mouse_wrap = 1; ps2_queue(&s->common, AUX_ACK); break; case AUX_SET_REMOTE: s->mouse_status |= MOUSE_STATUS_REMOTE; ps2_queue(&s->common, AUX_ACK); break; case AUX_GET_TYPE: ps2_queue(&s->common, AUX_ACK); ps2_queue(&s->common, s->mouse_type); break; case AUX_SET_RES: case AUX_SET_SAMPLE: s->common.write_cmd = val; ps2_queue(&s->common, AUX_ACK); break; case AUX_GET_SCALE: ps2_queue(&s->common, AUX_ACK); ps2_queue(&s->common, s->mouse_status); ps2_queue(&s->common, s->mouse_resolution); ps2_queue(&s->common, s->mouse_sample_rate); break; case AUX_POLL: ps2_queue(&s->common, AUX_ACK); ps2_mouse_send_packet(s); break; case AUX_ENABLE_DEV: s->mouse_status |= MOUSE_STATUS_ENABLED; ps2_queue(&s->common, AUX_ACK); break; case AUX_DISABLE_DEV: s->mouse_status &= ~MOUSE_STATUS_ENABLED; ps2_queue(&s->common, AUX_ACK); break; case AUX_SET_DEFAULT: s->mouse_sample_rate = 100; s->mouse_resolution = 2; s->mouse_status = 0; ps2_queue(&s->common, AUX_ACK); break; case AUX_RESET: s->mouse_sample_rate = 100; s->mouse_resolution = 2; s->mouse_status = 0; s->mouse_type = 0; ps2_queue(&s->common, AUX_ACK); ps2_queue(&s->common, 0xaa); ps2_queue(&s->common, s->mouse_type); break; default: break; } break; case AUX_SET_SAMPLE: s->mouse_sample_rate = val; /* detect IMPS/2 or IMEX */ switch(s->mouse_detect_state) { default: case 0: if (val == 200) s->mouse_detect_state = 1; break; case 1: if (val == 100) s->mouse_detect_state = 2; else if (val == 200) s->mouse_detect_state = 3; else s->mouse_detect_state = 0; break; case 2: if (val == 80) s->mouse_type = 3; /* IMPS/2 */ s->mouse_detect_state = 0; break; case 3: if (val == 80) s->mouse_type = 4; /* IMEX */ s->mouse_detect_state = 0; break; } ps2_queue(&s->common, AUX_ACK); s->common.write_cmd = -1; break; case AUX_SET_RES: s->mouse_resolution = val; ps2_queue(&s->common, AUX_ACK); s->common.write_cmd = -1; break; }}static void ps2_reset(void *opaque){ PS2State *s = (PS2State *)opaque; PS2Queue *q; s->write_cmd = -1; q = &s->queue; q->rptr = 0; q->wptr = 0; 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; 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; 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); qemu_put_8s(f, &s->mouse_wrap); qemu_put_8s(f, &s->mouse_type); qemu_put_8s(f, &s->mouse_detect_state); qemu_put_be32s(f, &s->mouse_dx); qemu_put_be32s(f, &s->mouse_dy); qemu_put_be32s(f, &s->mouse_dz); qemu_put_8s(f, &s->mouse_buttons);}static int ps2_kbd_load(QEMUFile* f, void* opaque, int version_id){ PS2KbdState *s = (PS2KbdState*)opaque; if (version_id != 2) return -EINVAL; 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 != 2) return -EINVAL; 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); qemu_get_8s(f, &s->mouse_wrap); qemu_get_8s(f, &s->mouse_type); qemu_get_8s(f, &s->mouse_detect_state); qemu_get_be32s(f, &s->mouse_dx); qemu_get_be32s(f, &s->mouse_dy); qemu_get_be32s(f, &s->mouse_dz); qemu_get_8s(f, &s->mouse_buttons); return 0;}void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg){ PS2KbdState *s = (PS2KbdState *)qemu_mallocz(sizeof(PS2KbdState)); s->common.update_irq = update_irq; s->common.update_arg = update_arg; ps2_reset(&s->common); 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;}void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg){ PS2MouseState *s = (PS2MouseState *)qemu_mallocz(sizeof(PS2MouseState)); s->common.update_irq = update_irq; s->common.update_arg = update_arg; ps2_reset(&s->common); register_savevm("ps2mouse", 0, 2, ps2_mouse_save, ps2_mouse_load, s); qemu_add_mouse_event_handler(ps2_mouse_event, s, 0); qemu_register_reset(ps2_reset, &s->common); return s;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -