int pckbd_set_xtscancode(pckbport_tag_t kbctag, pckbport_slot_t kbcslot, struct pckbd_internal *id) { int xt, res = 0; u_char cmd[2]; /* * Some keyboard/8042 combinations do not seem to work if the keyboard * is set to table 1; in fact, it would appear that some keyboards just * ignore the command altogether. So by default, we use the AT scan * codes and have the 8042 translate them. Unfortunately, this is * known to not work on some PS/2 machines. We try desperately to deal * with this by checking the (lack of a) translate bit in the 8042 and * attempting to set the keyboard to XT mode. If this all fails, well, * tough luck. If the PCKBC_CANT_TRANSLATE pckbc flag was set, we * enable software translation. * * XXX It would perhaps be a better choice to just use AT scan codes * and not bother with this. */ xt = pckbport_xt_translation(kbctag, kbcslot, 1); if (xt == 1) { /* The 8042 is translating for us; use AT codes. */ cmd[0] = KBC_SETTABLE; cmd[1] = 2; res = pckbport_poll_cmd(kbctag, kbcslot, cmd, 2, 0, 0, 0); if (res) { u_char cmdb[1]; aprint_debug("pckbd: error setting scanset 2\n"); /* * XXX at least one keyboard is reported to lock up * if a "set table" is attempted, thus the "reset". * XXX ignore errors, scanset 2 should be * default anyway. */ cmdb[0] = KBC_RESET; (void)pckbport_poll_cmd(kbctag, kbcslot, cmdb, 1, 1, 0, 1); pckbport_flush(kbctag, kbcslot); res = 0; } if (id != NULL) id->t_translating = 1; } else if (xt == -1) { /* Software translation required */ if (id != NULL) id->t_translating = 0; } else { /* Stupid 8042; set keyboard to XT codes. */ cmd[0] = KBC_SETTABLE; cmd[1] = 1; res = pckbport_poll_cmd(kbctag, kbcslot, cmd, 2, 0, 0, 0); if (res) aprint_debug("pckbd: error setting scanset 1\n"); if (id != NULL) id->t_translating = 1; } return res; }
int pckbd_set_xtscancode(pckbport_tag_t kbctag, pckbport_slot_t kbcslot) { int res; u_char cmd[2]; /* * Some keyboard/8042 combinations do not seem to work if the keyboard * is set to table 1; in fact, it would appear that some keyboards just * ignore the command altogether. So by default, we use the AT scan * codes and have the 8042 translate them. Unfortunately, this is * known to not work on some PS/2 machines. We try desperately to deal * with this by checking the (lack of a) translate bit in the 8042 and * attempting to set the keyboard to XT mode. If this all fails, well, * tough luck. * * XXX It would perhaps be a better choice to just use AT scan codes * and not bother with this. */ if (pckbport_xt_translation(kbctag, kbcslot, 1)) { /* The 8042 is translating for us; use AT codes. */ cmd[0] = KBC_SETTABLE; cmd[1] = 2; res = pckbport_poll_cmd(kbctag, kbcslot, cmd, 2, 0, 0, 0); if (res) { u_char cmd[1]; #ifdef DEBUG printf("pckbd: error setting scanset 2\n"); #endif /* * XXX at least one keyboard is reported to lock up * if a "set table" is attempted, thus the "reset". * XXX ignore errors, scanset 2 should be * default anyway. */ cmd[0] = KBC_RESET; (void)pckbport_poll_cmd(kbctag, kbcslot, cmd, 1, 1, 0, 1); pckbport_flush(kbctag, kbcslot); res = 0; } } else { /* Stupid 8042; set keyboard to XT codes. */ cmd[0] = KBC_SETTABLE; cmd[1] = 1; res = pckbport_poll_cmd(kbctag, kbcslot, cmd, 2, 0, 0, 0); #ifdef DEBUG if (res) printf("pckbd: error setting scanset 1\n"); #endif } return res; }