static int kbd_cmd_write(int cmd, int data) { if (kbd_write(I8042_CMD_REG, cmd)) return -1; return kbd_write(I8042_DATA_REG, data); }
static int kbd_cmd_read(int cmd) { if (kbd_write(I8042_CMD_REG, cmd)) return -1; return kbd_read(I8042_DATA_REG); }
int msopen(dev_t dev, int flags, int mode, struct lwp *l) { u_char report_ms_joy[] = { 0x14, 0x08 }; struct ms_softc *ms; int unit; unit = minor(dev); ms = &ms_softc[unit]; if (unit >= NMOUSE) return(EXDEV); if (ms->ms_events.ev_io) return(EBUSY); ms->ms_events.ev_io = l->l_proc; ms->ms_dx = ms->ms_dy = 0; ms->ms_buttons = 0; ms->ms_bq[0].id = ms->ms_bq[1].id = 0; ms->ms_bq_idx = 0; ev_init(&ms->ms_events); /* may cause sleep */ /* * Enable mouse reporting. */ kbd_write(report_ms_joy, sizeof(report_ms_joy)); return(0); }
static int kbd_reset(int quirk) { int config; /* controller self test */ if (kbd_cmd_read(CMD_SELF_TEST) != KBC_TEST_OK) goto err; /* keyboard reset */ if (kbd_write(I8042_DATA_REG, CMD_RESET_KBD) || kbd_read(I8042_DATA_REG) != KBD_ACK || kbd_read(I8042_DATA_REG) != KBD_POR) goto err; if (kbd_write(I8042_DATA_REG, CMD_DRAIN_OUTPUT) || kbd_read(I8042_DATA_REG) != KBD_ACK) goto err; /* set AT translation and disable irq */ config = kbd_cmd_read(CMD_RD_CONFIG); if (config == -1) goto err; /* Sometimes get a second byte */ else if ((quirk & QUIRK_DUP_POR) && config == KBD_POR) config = kbd_cmd_read(CMD_RD_CONFIG); config |= CONFIG_AT_TRANS; config &= ~(CONFIG_KIRQ_EN | CONFIG_MIRQ_EN); if (kbd_cmd_write(CMD_WR_CONFIG, config)) goto err; /* enable keyboard */ if (kbd_write(I8042_CMD_REG, CMD_KBD_EN) || !kbd_input_empty()) goto err; return 0; err: debug("%s: Keyboard failure\n", __func__); return -1; }
int msclose(dev_t dev, int flags, int mode, struct lwp *l) { u_char disable_ms_joy[] = { 0x12, 0x1a }; int unit; struct ms_softc *ms; unit = minor (dev); ms = &ms_softc[unit]; /* * Turn off mouse interrogation. */ kbd_write(disable_ms_joy, sizeof(disable_ms_joy)); ev_fini(&ms->ms_events); ms->ms_events.ev_io = NULL; return(0); }
int32_t kbd_process_keys(bthid_session_p s) { bitstr_t diff[bitstr_size(xsize)]; int32_t f1, f2, i; assert(s != NULL); assert(s->srv != NULL); /* Check if the new keys have been pressed */ bit_ffs(s->keys1, xsize, &f1); /* Check if old keys still pressed */ bit_ffs(s->keys2, xsize, &f2); if (f1 == -1) { /* no new key pressed */ if (f2 != -1) { /* release old keys */ kbd_write(s->keys2, f2, 0, s->vkbd); memset(s->keys2, 0, bitstr_size(xsize)); } return (0); } if (f2 == -1) { /* no old keys, but new keys pressed */ assert(f1 != -1); memcpy(s->keys2, s->keys1, bitstr_size(xsize)); kbd_write(s->keys1, f1, 1, s->vkbd); memset(s->keys1, 0, bitstr_size(xsize)); return (0); } /* new keys got pressed, old keys got released */ memset(diff, 0, bitstr_size(xsize)); for (i = f2; i < xsize; i ++) { if (bit_test(s->keys2, i)) { if (!bit_test(s->keys1, i)) { bit_clear(s->keys2, i); bit_set(diff, i); } } } for (i = f1; i < xsize; i++) { if (bit_test(s->keys1, i)) { if (!bit_test(s->keys2, i)) bit_set(s->keys2, i); else bit_clear(s->keys1, i); } } bit_ffs(diff, xsize, &f2); if (f2 > 0) kbd_write(diff, f2, 0, s->vkbd); bit_ffs(s->keys1, xsize, &f1); if (f1 > 0) { kbd_write(s->keys1, f1, 1, s->vkbd); memset(s->keys1, 0, bitstr_size(xsize)); } return (0); }