static void handle_kbd_command(ChannelState *s, int val) { KBD_DPRINTF("Command %d\n", val); if (s->led_mode) { // Ignore led byte s->led_mode = 0; return; } switch (val) { case 1: // Reset, return type code clear_queue(s); put_queue(s, 0xff); put_queue(s, 4); // Type 4 put_queue(s, 0x7f); break; case 0xe: // Set leds s->led_mode = 1; break; case 7: // Query layout case 0xf: clear_queue(s); put_queue(s, 0xfe); put_queue(s, 0); // XXX, layout? break; default: break; } }
static void sunkbd_event(void *opaque, int ch) { ChannelState *s = opaque; int release = ch & 0x80; ch = keycodes[ch & 0x7f]; KBD_DPRINTF("Keycode %d (%s)\n", ch, release? "release" : "press"); put_queue(s, ch | release); }
static void sunkbd_event(void *opaque, int ch) { ChannelState *s = opaque; int release = ch & 0x80; KBD_DPRINTF("Untranslated keycode %2.2x (%s)\n", ch, release? "release" : "press"); switch (ch) { case 58: // Caps lock press s->caps_lock_mode ^= 1; if (s->caps_lock_mode == 2) return; // Drop second press break; case 69: // Num lock press s->num_lock_mode ^= 1; if (s->num_lock_mode == 2) return; // Drop second press break; case 186: // Caps lock release s->caps_lock_mode ^= 2; if (s->caps_lock_mode == 3) return; // Drop first release break; case 197: // Num lock release s->num_lock_mode ^= 2; if (s->num_lock_mode == 3) return; // Drop first release break; case 0xe0: s->e0_mode = 1; return; default: break; } if (s->e0_mode) { s->e0_mode = 0; ch = e0_keycodes[ch & 0x7f]; } else { ch = keycodes[ch & 0x7f]; } KBD_DPRINTF("Translated keycode %2.2x\n", ch); put_queue(s, ch | release); }
static void handle_kbd_command(ChannelState *s, int val) { KBD_DPRINTF("Command %d\n", val); switch (val) { case 1: // Reset, return type code put_queue(s, 0xff); put_queue(s, 5); // Type 5 break; case 7: // Query layout put_queue(s, 0xfe); put_queue(s, 0x20); // XXX, layout? break; default: break; } }
static uint32_t get_queue(void *opaque) { ChannelState *s = opaque; SERIOQueue *q = &s->queue; int val; if (q->count == 0) { return 0; } else { val = q->data[q->rptr]; if (++q->rptr == SERIO_QUEUE_SIZE) q->rptr = 0; q->count--; } KBD_DPRINTF("channel %c get 0x%02x\n", CHN_C(s), val); if (q->count > 0) serial_receive_byte(s, 0); return val; }