Lines Matching +full:pulse +full:- +full:code

26 #include "qemu/error-report.h"
36 #include "hw/qdev-properties.h"
79 /* Pulse bits 3-0 of the output port P2. */
81 /* Pulse bit 0 of the output port P2 = CPU reset. */
83 /* Pulse no bits of the output port P2. */
119 /* Scan code conversion to PC format */
161 if (s->status & KBD_STAT_OBF) { in kbd_update_irq_lines()
162 if (s->status & KBD_STAT_MOUSE_OBF) { in kbd_update_irq_lines()
163 if (s->mode & KBD_MODE_MOUSE_INT) { in kbd_update_irq_lines()
167 if ((s->mode & KBD_MODE_KBD_INT) && in kbd_update_irq_lines()
168 !(s->mode & KBD_MODE_DISABLE_KBD)) { in kbd_update_irq_lines()
173 qemu_set_irq(s->irqs[I8042_KBD_IRQ], irq_kbd_level); in kbd_update_irq_lines()
174 qemu_set_irq(s->irqs[I8042_MOUSE_IRQ], irq_mouse_level); in kbd_update_irq_lines()
179 s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF); in kbd_deassert_irq()
180 s->outport &= ~(KBD_OUT_OBF | KBD_OUT_MOUSE_OBF); in kbd_deassert_irq()
186 if (s->extended_state) { in kbd_pending()
187 return s->pending & (~s->mode | ~(KBD_PENDING_KBD | KBD_PENDING_AUX)); in kbd_pending()
189 return s->pending; in kbd_pending()
198 s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF); in kbd_update_irq()
199 s->outport &= ~(KBD_OUT_OBF | KBD_OUT_MOUSE_OBF); in kbd_update_irq()
201 s->status |= KBD_STAT_OBF; in kbd_update_irq()
202 s->outport |= KBD_OUT_OBF; in kbd_update_irq()
204 s->obsrc = KBD_OBSRC_CTRL; in kbd_update_irq()
206 s->status |= KBD_STAT_MOUSE_OBF; in kbd_update_irq()
207 s->outport |= KBD_OUT_MOUSE_OBF; in kbd_update_irq()
208 s->obsrc = KBD_OBSRC_CTRL; in kbd_update_irq()
210 s->obsrc = KBD_OBSRC_KBD; in kbd_update_irq()
212 s->status |= KBD_STAT_MOUSE_OBF; in kbd_update_irq()
213 s->outport |= KBD_OUT_MOUSE_OBF; in kbd_update_irq()
214 s->obsrc = KBD_OBSRC_MOUSE; in kbd_update_irq()
226 if (s->status & KBD_STAT_OBF) { in kbd_safe_update_irq()
230 if (s->throttle_timer && timer_pending(s->throttle_timer)) { in kbd_safe_update_irq()
243 s->pending |= KBD_PENDING_KBD; in kbd_update_kbd_irq()
245 s->pending &= ~KBD_PENDING_KBD; in kbd_update_kbd_irq()
255 s->pending |= KBD_PENDING_AUX; in kbd_update_aux_irq()
257 s->pending &= ~KBD_PENDING_AUX; in kbd_update_aux_irq()
276 val = s->status; in kbd_read_status()
283 if (s->extended_state) { in kbd_queue()
284 s->cbdata = b; in kbd_queue()
285 s->pending &= ~KBD_PENDING_CTRL_KBD & ~KBD_PENDING_CTRL_AUX; in kbd_queue()
286 s->pending |= aux ? KBD_PENDING_CTRL_AUX : KBD_PENDING_CTRL_KBD; in kbd_queue()
289 ps2_queue(aux ? PS2_DEVICE(&s->ps2mouse) : PS2_DEVICE(&s->ps2kbd), b); in kbd_queue()
295 uint8_t b = s->cbdata; in kbd_dequeue()
297 s->pending &= ~KBD_PENDING_CTRL_KBD & ~KBD_PENDING_CTRL_AUX; in kbd_dequeue()
307 s->outport = val; in outport_write()
308 qemu_set_irq(s->a20_out, (val >> 1) & 1); in outport_write()
322 * Bits 3-0 of the output port P2 of the keyboard controller may be pulsed in kbd_write_command()
323 * low for approximately 6 micro seconds. Bits 3-0 of the KBD_CCMD_PULSE in kbd_write_command()
339 kbd_queue(s, s->mode, 0); in kbd_write_command()
346 s->write_cmd = val; in kbd_write_command()
349 s->mode |= KBD_MODE_DISABLE_MOUSE; in kbd_write_command()
352 s->mode &= ~KBD_MODE_DISABLE_MOUSE; in kbd_write_command()
359 s->status |= KBD_STAT_SELFTEST; in kbd_write_command()
366 s->mode |= KBD_MODE_DISABLE_KBD; in kbd_write_command()
369 s->mode &= ~KBD_MODE_DISABLE_KBD; in kbd_write_command()
376 kbd_queue(s, s->outport, 0); in kbd_write_command()
379 qemu_irq_raise(s->a20_out); in kbd_write_command()
380 s->outport |= KBD_OUT_A20; in kbd_write_command()
383 qemu_irq_lower(s->a20_out); in kbd_write_command()
384 s->outport &= ~KBD_OUT_A20; in kbd_write_command()
404 if (s->status & KBD_STAT_OBF) { in kbd_read_data()
406 if (s->obsrc & KBD_OBSRC_KBD) { in kbd_read_data()
407 if (s->throttle_timer) { in kbd_read_data()
408 timer_mod(s->throttle_timer, in kbd_read_data()
411 s->obdata = ps2_read_data(PS2_DEVICE(&s->ps2kbd)); in kbd_read_data()
412 } else if (s->obsrc & KBD_OBSRC_MOUSE) { in kbd_read_data()
413 s->obdata = ps2_read_data(PS2_DEVICE(&s->ps2mouse)); in kbd_read_data()
414 } else if (s->obsrc & KBD_OBSRC_CTRL) { in kbd_read_data()
415 s->obdata = kbd_dequeue(s); in kbd_read_data()
419 trace_pckbd_kbd_read_data(s->obdata); in kbd_read_data()
420 return s->obdata; in kbd_read_data()
430 switch (s->write_cmd) { in kbd_write_data()
432 ps2_write_keyboard(&s->ps2kbd, val); in kbd_write_data()
434 s->mode &= ~KBD_MODE_DISABLE_KBD; in kbd_write_data()
438 s->mode = val; in kbd_write_data()
439 ps2_keyboard_set_translation(&s->ps2kbd, in kbd_write_data()
440 (s->mode & KBD_MODE_KCC) != 0); in kbd_write_data()
462 ps2_write_mouse(&s->ps2mouse, val); in kbd_write_data()
464 s->mode &= ~KBD_MODE_DISABLE_MOUSE; in kbd_write_data()
470 s->write_cmd = 0; in kbd_write_data()
477 s->mode = KBD_MODE_KBD_INT | KBD_MODE_MOUSE_INT; in kbd_reset()
478 s->status = KBD_STAT_CMD | KBD_STAT_UNLOCKED; in kbd_reset()
479 s->outport = KBD_OUT_RESET | KBD_OUT_A20 | KBD_OUT_ONES; in kbd_reset()
480 s->pending = 0; in kbd_reset()
482 if (s->throttle_timer) { in kbd_reset()
483 timer_del(s->throttle_timer); in kbd_reset()
490 | (s->status & KBD_STAT_OBF ? KBD_OUT_OBF : 0) in kbd_outport_default()
491 | (s->status & KBD_STAT_MOUSE_OBF ? KBD_OUT_MOUSE_OBF : 0); in kbd_outport_default()
497 s->outport_present = true; in kbd_outport_post_load()
504 return s->outport != kbd_outport_default(s); in kbd_outport_needed()
523 s->migration_flags = 0; in kbd_extended_state_pre_save()
524 if (s->throttle_timer && timer_pending(s->throttle_timer)) { in kbd_extended_state_pre_save()
525 s->migration_flags |= KBD_MIGR_TIMER_PENDING; in kbd_extended_state_pre_save()
535 if (s->migration_flags & KBD_MIGR_TIMER_PENDING) { in kbd_extended_state_post_load()
538 s->extended_state_loaded = true; in kbd_extended_state_post_load()
547 return s->extended_state; in kbd_extended_state_needed()
568 if (s->extended_state) { in kbd_pre_save()
569 s->pending_tmp = s->pending; in kbd_pre_save()
571 s->pending_tmp = 0; in kbd_pre_save()
572 if (s->pending & KBD_PENDING_KBD) { in kbd_pre_save()
573 s->pending_tmp |= KBD_PENDING_KBD_COMPAT; in kbd_pre_save()
575 if (s->pending & KBD_PENDING_AUX) { in kbd_pre_save()
576 s->pending_tmp |= KBD_PENDING_AUX_COMPAT; in kbd_pre_save()
586 s->outport_present = false; in kbd_pre_load()
587 s->extended_state_loaded = false; in kbd_pre_load()
594 if (!s->outport_present) { in kbd_post_load()
595 s->outport = kbd_outport_default(s); in kbd_post_load()
597 s->pending = s->pending_tmp; in kbd_post_load()
598 if (!s->extended_state_loaded) { in kbd_post_load()
599 s->obsrc = s->status & KBD_STAT_OBF ? in kbd_post_load()
600 (s->status & KBD_STAT_MOUSE_OBF ? KBD_OBSRC_MOUSE : KBD_OBSRC_KBD) : in kbd_post_load()
602 if (s->pending & KBD_PENDING_KBD_COMPAT) { in kbd_post_load()
603 s->pending |= KBD_PENDING_KBD; in kbd_post_load()
605 if (s->pending & KBD_PENDING_AUX_COMPAT) { in kbd_post_load()
606 s->pending |= KBD_PENDING_AUX; in kbd_post_load()
610 s->pending &= KBD_PENDING_CTRL_KBD | KBD_PENDING_CTRL_AUX | in kbd_post_load()
641 if (addr & s->mask) { in kbd_mm_readfn()
653 if (addr & s->mask) { in kbd_mm_writefn()
672 KBDState *ks = &s->kbd; in i8042_mmio_set_kbd_irq()
680 KBDState *ks = &s->kbd; in i8042_mmio_set_mouse_irq()
688 KBDState *ks = &s->kbd; in i8042_mmio_reset()
696 KBDState *ks = &s->kbd; in i8042_mmio_realize()
698 memory_region_init_io(&s->region, OBJECT(dev), &i8042_mmio_ops, ks, in i8042_mmio_realize()
699 "i8042", s->size); in i8042_mmio_realize()
701 sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->region); in i8042_mmio_realize()
703 if (!sysbus_realize(SYS_BUS_DEVICE(&ks->ps2kbd), errp)) { in i8042_mmio_realize()
707 if (!sysbus_realize(SYS_BUS_DEVICE(&ks->ps2mouse), errp)) { in i8042_mmio_realize()
711 qdev_connect_gpio_out(DEVICE(&ks->ps2kbd), PS2_DEVICE_IRQ, in i8042_mmio_realize()
712 qdev_get_gpio_in_named(dev, "ps2-kbd-input-irq", in i8042_mmio_realize()
715 qdev_connect_gpio_out(DEVICE(&ks->ps2mouse), PS2_DEVICE_IRQ, in i8042_mmio_realize()
716 qdev_get_gpio_in_named(dev, "ps2-mouse-input-irq", in i8042_mmio_realize()
723 KBDState *ks = &s->kbd; in i8042_mmio_init()
725 ks->extended_state = true; in i8042_mmio_init()
727 object_initialize_child(obj, "ps2kbd", &ks->ps2kbd, TYPE_PS2_KBD_DEVICE); in i8042_mmio_init()
728 object_initialize_child(obj, "ps2mouse", &ks->ps2mouse, in i8042_mmio_init()
731 qdev_init_gpio_out(DEVICE(obj), ks->irqs, 2); in i8042_mmio_init()
733 "ps2-kbd-input-irq", 1); in i8042_mmio_init()
735 "ps2-mouse-input-irq", 1); in i8042_mmio_init()
740 DEFINE_PROP_UINT32("size", MMIOKBDState, size, -1),
744 .name = "pckbd-mmio",
757 dc->realize = i8042_mmio_realize; in i8042_mmio_class_init()
759 dc->vmsd = &vmstate_kbd_mmio; in i8042_mmio_class_init()
761 set_bit(DEVICE_CATEGORY_INPUT, dc->categories); in i8042_mmio_class_init()
774 KBDState *s = &isa->kbd; in i8042_isa_mouse_fake_event()
776 ps2_mouse_fake_event(&s->ps2mouse); in i8042_isa_mouse_fake_event()
812 KBDState *ks = &s->kbd; in i8042_set_kbd_irq()
820 KBDState *ks = &s->kbd; in i8042_set_mouse_irq()
829 KBDState *ks = &s->kbd; in i8042_reset()
837 KBDState *s = &isa_s->kbd; in i8042_initfn()
839 memory_region_init_io(isa_s->io + 0, obj, &i8042_data_ops, s, in i8042_initfn()
840 "i8042-data", 1); in i8042_initfn()
841 memory_region_init_io(isa_s->io + 1, obj, &i8042_cmd_ops, s, in i8042_initfn()
842 "i8042-cmd", 1); in i8042_initfn()
844 object_initialize_child(obj, "ps2kbd", &s->ps2kbd, TYPE_PS2_KBD_DEVICE); in i8042_initfn()
845 object_initialize_child(obj, "ps2mouse", &s->ps2mouse, in i8042_initfn()
848 qdev_init_gpio_out_named(DEVICE(obj), &s->a20_out, I8042_A20_LINE, 1); in i8042_initfn()
850 qdev_init_gpio_out(DEVICE(obj), s->irqs, 2); in i8042_initfn()
852 "ps2-kbd-input-irq", 1); in i8042_initfn()
854 "ps2-mouse-input-irq", 1); in i8042_initfn()
861 KBDState *s = &isa_s->kbd; in i8042_realizefn()
863 if (isa_s->kbd_irq >= ISA_NUM_IRQS) { in i8042_realizefn()
864 error_setg(errp, "Maximum value for \"kbd-irq\" is: %u", in i8042_realizefn()
865 ISA_NUM_IRQS - 1); in i8042_realizefn()
869 if (isa_s->mouse_irq >= ISA_NUM_IRQS) { in i8042_realizefn()
870 error_setg(errp, "Maximum value for \"mouse-irq\" is: %u", in i8042_realizefn()
871 ISA_NUM_IRQS - 1); in i8042_realizefn()
875 isa_connect_gpio_out(isadev, I8042_KBD_IRQ, isa_s->kbd_irq); in i8042_realizefn()
876 isa_connect_gpio_out(isadev, I8042_MOUSE_IRQ, isa_s->mouse_irq); in i8042_realizefn()
878 isa_register_ioport(isadev, isa_s->io + 0, 0x60); in i8042_realizefn()
879 isa_register_ioport(isadev, isa_s->io + 1, 0x64); in i8042_realizefn()
881 if (!sysbus_realize(SYS_BUS_DEVICE(&s->ps2kbd), errp)) { in i8042_realizefn()
885 qdev_connect_gpio_out(DEVICE(&s->ps2kbd), PS2_DEVICE_IRQ, in i8042_realizefn()
886 qdev_get_gpio_in_named(dev, "ps2-kbd-input-irq", in i8042_realizefn()
889 if (!sysbus_realize(SYS_BUS_DEVICE(&s->ps2mouse), errp)) { in i8042_realizefn()
893 qdev_connect_gpio_out(DEVICE(&s->ps2mouse), PS2_DEVICE_IRQ, in i8042_realizefn()
894 qdev_get_gpio_in_named(dev, "ps2-mouse-input-irq", in i8042_realizefn()
897 if (isa_s->kbd_throttle && !isa_s->kbd.extended_state) { in i8042_realizefn()
898 warn_report(TYPE_I8042 ": can't enable kbd-throttle without" in i8042_realizefn()
899 " extended-state, disabling kbd-throttle"); in i8042_realizefn()
900 } else if (isa_s->kbd_throttle) { in i8042_realizefn()
901 s->throttle_timer = timer_new_us(QEMU_CLOCK_VIRTUAL, in i8042_realizefn()
916 aml_append(crs, aml_irq_no_flags(isa_s->kbd_irq)); in i8042_build_aml()
924 aml_append(crs, aml_irq_no_flags(isa_s->mouse_irq)); in i8042_build_aml()
936 DEFINE_PROP_BOOL("extended-state", ISAKBDState, kbd.extended_state, true),
937 DEFINE_PROP_BOOL("kbd-throttle", ISAKBDState, kbd_throttle, false),
938 DEFINE_PROP_UINT8("kbd-irq", ISAKBDState, kbd_irq, 1),
939 DEFINE_PROP_UINT8("mouse-irq", ISAKBDState, mouse_irq, 12),
949 dc->realize = i8042_realizefn; in i8042_class_initfn()
950 dc->vmsd = &vmstate_kbd_isa; in i8042_class_initfn()
951 adevc->build_dev_aml = i8042_build_aml; in i8042_class_initfn()
952 set_bit(DEVICE_CATEGORY_INPUT, dc->categories); in i8042_class_initfn()