⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2.c

📁 qemu虚拟机代码
💻 C
📖 第 1 页 / 共 2 页
字号:
            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 + -