static void kbd_queue(KBDState *s, int b, int aux) { if (aux) ps2_queue(s->mouse, b); else ps2_queue(s->kbd, b); }
/* keycode is expressed as follow: bit 7 - 0 key pressed, 1 = key released bits 6-0 - translated scancode set 2 */ static void ps2_put_keycode(void *opaque, int keycode) { #ifdef CONFIG_TCG_TAINT DECAF_keystroke_place(keycode); if(taint_keystroke_enabled) { ps2_put_keycode_taint(opaque,keycode); return; } #endif /* CONFIG_TCG_TAINT */ PS2KbdState *s = opaque; /* XXX: add support for scancode set 1 */ if (!s->translate && keycode < 0xe0 && s->scancode_set > 1) { if (keycode & 0x80) { ps2_queue(&s->common, 0xf0); } if (s->scancode_set == 2) { keycode = ps2_raw_keycode[keycode & 0x7f]; } else if (s->scancode_set == 3) { keycode = ps2_raw_keycode_set3[keycode & 0x7f]; } } ps2_queue(&s->common, keycode); }
static void ps2_put_keycode(void *opaque, int keycode) { PS2KbdState *s = opaque; if (!s->translate && keycode < 0xe0) { if (keycode & 0x80) ps2_queue(&s->common, 0xf0); keycode = ps2_raw_keycode[keycode & 0x7f]; } ps2_queue(&s->common, keycode); }
/* keycode is expressed as follow: bit 7 - 0 key pressed, 1 = key released bits 6-0 - translated scancode set 2 */ static void ps2_put_keycode(void *opaque, int keycode) { PS2KbdState *s = opaque; /* XXX: add support for scancode sets 1 and 3 */ if (!s->translate && keycode < 0xe0 && s->scancode_set == 2) { if (keycode & 0x80) ps2_queue(&s->common, 0xf0); keycode = ps2_raw_keycode[keycode & 0x7f]; } ps2_queue(&s->common, keycode); }
/* keycode is expressed as follow: bit 7 - 0 key pressed, 1 = key released bits 6-0 - translated scancode set 2 */ static void ps2_put_keycode(void *opaque, int keycode) { PS2KbdState *s = opaque; qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); /* XXX: add support for scancode sets 1 and 3 */ if (!s->translate && keycode < 0xe0 && s->scancode_set == 2) { if (keycode & 0x80) ps2_queue(&s->common, 0xf0); keycode = ps2_raw_keycode[keycode & 0x7f]; } ps2_queue(&s->common, keycode); }
static void ps2_mouse_send_packet(PS2MouseState *s) { unsigned int b; int dx1, dy1, dz1; dx1 = s->mouse_dx; dy1 = s->mouse_dy; dz1 = s->mouse_dz; /* XXX: increase range to 8 bits ? */ if (dx1 > 127) dx1 = 127; else if (dx1 < -127) dx1 = -127; if (dy1 > 127) dy1 = 127; else if (dy1 < -127) dy1 = -127; b = 0x08 | ((dx1 < 0) << 4) | ((dy1 < 0) << 5) | (s->mouse_buttons & 0x07); ps2_queue(&s->common, b); ps2_queue(&s->common, dx1 & 0xff); ps2_queue(&s->common, dy1 & 0xff); /* extra byte for IMPS/2 or IMEX */ switch(s->mouse_type) { default: break; case 3: if (dz1 > 127) dz1 = 127; else if (dz1 < -127) dz1 = -127; ps2_queue(&s->common, dz1 & 0xff); break; case 4: if (dz1 > 7) dz1 = 7; else if (dz1 < -7) dz1 = -7; b = (dz1 & 0x0f) | ((s->mouse_buttons & 0x18) << 1); ps2_queue(&s->common, b); break; } trace_ps2_mouse_send_packet(s, dx1, dy1, dz1, b); /* update deltas */ s->mouse_dx -= dx1; s->mouse_dy -= dy1; s->mouse_dz -= dz1; }
/* keycode is the untranslated scancode in the current scancode set. */ static void ps2_put_keycode(void *opaque, int keycode) { PS2KbdState *s = opaque; trace_ps2_put_keycode(opaque, keycode); qemu_system_wakeup_request(QEMU_WAKEUP_REASON_OTHER); if (s->translate) { if (keycode == 0xf0) { s->need_high_bit = true; } else if (s->need_high_bit) { ps2_queue(&s->common, translate_table[keycode] | 0x80); s->need_high_bit = false; } else { ps2_queue(&s->common, translate_table[keycode]); } } else { ps2_queue(&s->common, keycode); } }
void ps2_write_keyboard(void *opaque, int val) { PS2KbdState *s = (PS2KbdState *)opaque; trace_ps2_write_keyboard(opaque, val); switch(s->common.write_cmd) { default: case -1: switch(val) { case 0x00: ps2_queue(&s->common, KBD_REPLY_ACK); break; case 0x05: ps2_queue(&s->common, KBD_REPLY_RESEND); break; case KBD_CMD_GET_ID: ps2_queue(&s->common, KBD_REPLY_ACK); /* We emulate a MF2 AT keyboard here */ ps2_queue(&s->common, KBD_REPLY_ID); if (s->translate) ps2_queue(&s->common, 0x41); else ps2_queue(&s->common, 0x83); break; case KBD_CMD_ECHO: ps2_queue(&s->common, KBD_CMD_ECHO); break; case KBD_CMD_ENABLE: s->scan_enabled = 1; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_SCANCODE: case KBD_CMD_SET_LEDS: case KBD_CMD_SET_RATE: s->common.write_cmd = val; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_RESET_DISABLE: ps2_reset_keyboard(s); s->scan_enabled = 0; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_RESET_ENABLE: ps2_reset_keyboard(s); s->scan_enabled = 1; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_RESET: ps2_reset_keyboard(s); ps2_queue(&s->common, KBD_REPLY_ACK); ps2_queue(&s->common, KBD_REPLY_POR); break; default: ps2_queue(&s->common, KBD_REPLY_ACK); break; } break; case KBD_CMD_SCANCODE: if (val == 0) { if (s->scancode_set == 1) ps2_put_keycode(s, 0x43); else if (s->scancode_set == 2) ps2_put_keycode(s, 0x41); else if (s->scancode_set == 3) ps2_put_keycode(s, 0x3f); } else { if (val >= 1 && val <= 3) s->scancode_set = val; ps2_queue(&s->common, KBD_REPLY_ACK); } s->common.write_cmd = -1; break; case KBD_CMD_SET_LEDS: ps2_set_ledstate(s, val); ps2_queue(&s->common, KBD_REPLY_ACK); s->common.write_cmd = -1; break; case KBD_CMD_SET_RATE: ps2_queue(&s->common, KBD_REPLY_ACK); s->common.write_cmd = -1; 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; } }
void ps2_write_keyboard(void *opaque, int val) { PS2KbdState *s = (PS2KbdState *)opaque; switch(s->common.write_cmd) { default: case -1: switch(val) { case 0x00: ps2_queue(&s->common, KBD_REPLY_ACK); break; case 0x05: ps2_queue(&s->common, KBD_REPLY_RESEND); break; case KBD_CMD_GET_ID: ps2_queue(&s->common, KBD_REPLY_ACK); ps2_queue(&s->common, 0xab); ps2_queue(&s->common, 0x83); break; case KBD_CMD_ECHO: ps2_queue(&s->common, KBD_CMD_ECHO); break; case KBD_CMD_ENABLE: s->scan_enabled = 1; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_SET_LEDS: case KBD_CMD_SET_RATE: s->common.write_cmd = val; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_RESET_DISABLE: ps2_reset_keyboard(s); s->scan_enabled = 0; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_RESET_ENABLE: ps2_reset_keyboard(s); s->scan_enabled = 1; ps2_queue(&s->common, KBD_REPLY_ACK); break; case KBD_CMD_RESET: ps2_reset_keyboard(s); ps2_queue(&s->common, KBD_REPLY_ACK); ps2_queue(&s->common, KBD_REPLY_POR); break; default: ps2_queue(&s->common, KBD_REPLY_ACK); break; } break; case KBD_CMD_SET_LEDS: ps2_queue(&s->common, KBD_REPLY_ACK); s->common.write_cmd = -1; break; case KBD_CMD_SET_RATE: ps2_queue(&s->common, KBD_REPLY_ACK); s->common.write_cmd = -1; break; } }