void kbd_init(void) { KBDState *s = &kbd_state; kbd_reset(s); register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); register_ioport_read(0x60, 1, 1, kbd_read_data, s); register_ioport_write(0x60, 1, 1, kbd_write_data, s); register_ioport_read(0x64, 1, 1, kbd_read_status, s); register_ioport_write(0x64, 1, 1, kbd_write_command, s); s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); qemu_register_reset(kbd_reset, s); }
/*{{{ _quit -- really quit*/ int _quit() { register WINDOW *win; static int really_quit=0; if (really_quit++) { /* we're in bad shape */ perror("PANIC!! Error during _quit()!"); setreuid(getuid(),getuid()); abort(); } MOUSE_OFF(screen,mousex,mousey); sleep(1); /* let the key (if any) un-press before resetting the kbd */ set_kbd(0); /* fix up keyboard modes */ kbd_reset(); /* reset the keyboard */ reset_tty(0); /* fix up console tty modes */ #ifdef MOVIE end_log(); /* turn off logging */ #endif /* fix pttys */ if (geteuid() < 2) for(win=active;win != (WINDOW *) 0;win=W(next)) { if (W(pid)>1) killpg(W(pid),SIGHUP); chmod(W(tty),0666); chown(W(tty),0,0); } /* fix utmp file */ #ifdef WHO close(getdtablesize()-1); /* make sure there are enough fd's left */ for(win=active;win != (WINDOW *) 0;win=W(next)) if (W(tty)) rm_utmp(W(tty)); #endif CLEAR(screen,BIT_CLR); do_cmd( 'q' ); /* do the quiting command */ bit_destroy(screen); }
void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base) { KBDState *s = &kbd_state; s->irq_kbd = kbd_irq; s->irq_mouse = mouse_irq; kbd_reset(s); register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); register_ioport_read(io_base, 1, 1, kbd_read_data, s); register_ioport_write(io_base, 1, 1, kbd_write_data, s); register_ioport_read(io_base + 4, 1, 1, kbd_read_status, s); register_ioport_write(io_base + 4, 1, 1, kbd_write_command, s); s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); #ifdef TARGET_I386 vmmouse_init(s->mouse); #endif qemu_register_reset(kbd_reset, s); }
static void sio_cmd_write(void *opaque, uint32_t addr, uint32_t value) { KeyBoardState *s = opaque; switch(s->mode) { case SIO_MODE_CLEAR: if (value & 3) { s->mode = SIO_MODE_ASYNC; } else if (value & 0x80) { s->mode = SIO_MODE_SYNC2; /* 1char */ } else { s->mode = SIO_MODE_SYNC1; /* 2chars */ } break; case SIO_MODE_SYNC1: s->mode = SIO_MODE_SYNC2; break; case SIO_MODE_SYNC2: s->mode = SIO_MODE_SYNC; break; case SIO_MODE_ASYNC: case SIO_MODE_SYNC: if (value & 0x40) { s->mode = SIO_MODE_CLEAR; break; } if (value & 0x10) { s->status &= ~(SIO_STAT_PE | SIO_STAT_OE | SIO_STAT_FE); } if (s->sbrk && !(value & 8)) { kbd_reset(s); } s->rts = value & 0x20; s->sbrk = value & 8; s->rxen = value & 4; s->txen = value & 1; break; } }
static int i8042_initfn(ISADevice *dev) { KBDState *s = &(DO_UPCAST(ISAKBDState, dev, dev)->kbd); isa_init_irq(dev, &s->irq_kbd, 1); isa_init_irq(dev, &s->irq_mouse, 12); kbd_reset(s); vmstate_register(0, &vmstate_kbd, s); register_ioport_read(0x60, 1, 1, kbd_read_data, s); register_ioport_write(0x60, 1, 1, kbd_write_data, s); register_ioport_read(0x64, 1, 1, kbd_read_status, s); register_ioport_write(0x64, 1, 1, kbd_write_command, s); s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); #ifdef TARGET_I386 vmmouse_init(s->mouse); #endif qemu_register_reset(kbd_reset, s); return 0; }
void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_phys_addr_t base, ram_addr_t size, target_phys_addr_t mask) { KBDState *s = &kbd_state; int s_io_memory; s->irq_kbd = kbd_irq; s->irq_mouse = mouse_irq; s->mask = mask; kbd_reset(s); register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); s_io_memory = cpu_register_io_memory(kbd_mm_read, kbd_mm_write, s); cpu_register_physical_memory(base, size, s_io_memory); s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); #ifdef TARGET_I386 vmmouse_init(s->mouse); #endif qemu_register_reset(kbd_reset, s); }
/******************************************************************************* * * i8042_kbd_init - reset keyboard and init state flags */ int i8042_kbd_init(void) { int keymap, try; char *penv; if (!kbd_controller_present()) return -1; #ifdef CONFIG_USE_CPCIDVI penv = getenv("console"); if (penv != NULL) { if (strncmp(penv, "serial", 7) == 0) return -1; } #endif /* Init keyboard device (default US layout) */ keymap = KBD_US; penv = getenv("keymap"); if (penv != NULL) { if (strncmp(penv, "de", 3) == 0) keymap = KBD_GER; } for (try = 0; try < KBD_RESET_TRIES; try++) { if (kbd_reset() == 0) { kbd_mapping = keymap; kbd_flags = NORMAL; kbd_state = 0; kbd_led_set(); return 0; } } return -1; } /******************************************************************************* * * i8042_tstc - test if keyboard input is available * option: cursor blinking if called in a loop */ int i8042_tstc(void) { unsigned char scan_code = 0; #ifdef CONFIG_CONSOLE_CURSOR if (--blinkCount == 0) { cursor_state ^= 1; console_cursor(cursor_state); blinkCount = CONFIG_SYS_CONSOLE_BLINK_COUNT; udelay(10); } #endif if ((in8(I8042_STATUS_REG) & 0x01) == 0) { return 0; } else { scan_code = in8(I8042_DATA_REG); if (scan_code == 0xfa) return 0; kbd_conv_char(scan_code); if (kbd_input != -1) return 1; } return 0; }
/* i8042_kbd_init - reset keyboard and init state flags */ static int i8042_start(struct udevice *dev) { struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev); struct i8042_kbd_priv *priv = dev_get_priv(dev); struct input_config *input = &uc_priv->input; int keymap, try; char *penv; int ret; if (!kbd_controller_present() || board_i8042_skip()) { debug("i8042 keyboard controller is not present\n"); return -ENOENT; } /* Init keyboard device (default US layout) */ keymap = KBD_US; penv = getenv("keymap"); if (penv != NULL) { if (strncmp(penv, "de", 3) == 0) keymap = KBD_GER; } for (try = 0; kbd_reset(priv->quirks) != 0; try++) { if (try >= KBD_RESET_TRIES) return -1; } ret = input_add_tables(input, keymap == KBD_GER); if (ret) return ret; i8042_kbd_update_leds(dev, NORMAL); debug("%s: started\n", __func__); return 0; } /** * Set up the i8042 keyboard. This is called by the stdio device handler * * We want to do this init when the keyboard is actually used rather than * at start-up, since keyboard input may not currently be selected. * * Once the keyboard starts there will be a period during which we must * wait for the keyboard to init. We do this only when a key is first * read - see kbd_wait_for_fifo_init(). * * @return 0 if ok, -ve on error */ static int i8042_kbd_probe(struct udevice *dev) { struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev); struct i8042_kbd_priv *priv = dev_get_priv(dev); struct stdio_dev *sdev = &uc_priv->sdev; struct input_config *input = &uc_priv->input; int ret; if (fdtdec_get_bool(gd->fdt_blob, dev->of_offset, "intel,duplicate-por")) priv->quirks |= QUIRK_DUP_POR; /* Register the device. i8042_start() will be called soon */ input->dev = dev; input->read_keys = i8042_kbd_check; input_allow_repeats(input, true); strcpy(sdev->name, "i8042-kbd"); ret = input_stdio_register(sdev); if (ret) { debug("%s: input_stdio_register() failed\n", __func__); return ret; } debug("%s: ready\n", __func__); return 0; } static const struct keyboard_ops i8042_kbd_ops = { .start = i8042_start, .update_leds = i8042_kbd_update_leds, }; static const struct udevice_id i8042_kbd_ids[] = { { .compatible = "intel,i8042-keyboard" }, { } };
static inline void kbd_drv_reset(void) { key_fn_down = 0; key_numl_down = 0; kbd_reset(); }