void lk201_init(struct lk201_state *lks) { int i; lks->waitack = 0; send(lks, LK_LED_ENABLE); send(lks, LK_LED_ALL); /* * set all keys to updown mode; autorepeat is * done by wskbd software */ for (i = 1; i <= 14; i++) send(lks, LK_CMD_MODE(LK_UPDOWN, i)); send(lks, LK_CL_DISABLE); lks->kcvol = 0; lks->bellvol = -1; /* not yet set */ for (i = 0; i < LK_KLL; i++) lks->down_keys_list[i] = -1; send(lks, LK_KBD_ENABLE); send(lks, LK_LED_DISABLE); send(lks, LK_LED_ALL); lks->leds_state = 0; /* * Note that, when attaching lkkbd initially, this timeout will * be scheduled but will not run until interrupts are enabled. * This is not a problem, since lk201_identify() relies upon * interrupts being enabled. */ timeout_set(&lks->probetmo, lk201_identify, lks); timeout_add(&lks->probetmo, 0); }
static struct dec_serial_hook lk201_hook = { .init_channel = lk201_init, .init_info = lk201_info, .rx_char = NULL, .poll_rx_char = NULL, .poll_tx_char = NULL, .cflags = B4800 | CS8 | CSTOPB | CLOCAL, }; /* * This is used during keyboard initialisation */ static unsigned char lk201_reset_string[] = { LK_CMD_SET_DEFAULTS, LK_CMD_MODE(LK_MODE_RPT_DOWN, 1), LK_CMD_MODE(LK_MODE_RPT_DOWN, 2), LK_CMD_MODE(LK_MODE_RPT_DOWN, 3), LK_CMD_MODE(LK_MODE_RPT_DOWN, 4), LK_CMD_MODE(LK_MODE_DOWN_UP, 5), LK_CMD_MODE(LK_MODE_DOWN_UP, 6), LK_CMD_MODE(LK_MODE_RPT_DOWN, 7), LK_CMD_MODE(LK_MODE_RPT_DOWN, 8), LK_CMD_MODE(LK_MODE_RPT_DOWN, 9), LK_CMD_MODE(LK_MODE_RPT_DOWN, 10), LK_CMD_MODE(LK_MODE_RPT_DOWN, 11), LK_CMD_MODE(LK_MODE_RPT_DOWN, 12), LK_CMD_MODE(LK_MODE_DOWN, 13), LK_CMD_MODE(LK_MODE_RPT_DOWN, 14), LK_CMD_DIS_KEYCLK, LK_CMD_ENB_BELL, LK_PARAM_VOLUME(4),
/* e4 */ KBD_NOKEY, '*', 'i', 'k', /* e8 */ '<', KBD_NOKEY, '(', 'o', /* ec */ 'l', '>', KBD_NOKEY, ')', /* f0 */ 'p', KBD_NOKEY, ':', '?', /* f4 */ KBD_NOKEY, '+', '}', '|', /* f8 */ KBD_NOKEY, '_', '{', '"', /* fc */ KBD_NOKEY, KBD_NOKEY, KBD_NOKEY, KBD_NOKEY, }; /* * Keyboard initialization string. */ static u_char kbdInitString[] = { LK_LED_ENABLE, LED_ALL, /* show we are resetting keyboard */ LK_DEFAULTS, LK_CMD_MODE(LK_AUTODOWN, 1), LK_CMD_MODE(LK_AUTODOWN, 2), LK_CMD_MODE(LK_AUTODOWN, 3), LK_CMD_MODE(LK_DOWN, 4), /* could also be LK_AUTODOWN */ LK_CMD_MODE(LK_UPDOWN, 5), LK_CMD_MODE(LK_UPDOWN, 6), LK_CMD_MODE(LK_AUTODOWN, 7), LK_CMD_MODE(LK_AUTODOWN, 8), LK_CMD_MODE(LK_AUTODOWN, 9), LK_CMD_MODE(LK_AUTODOWN, 10), LK_CMD_MODE(LK_AUTODOWN, 11), LK_CMD_MODE(LK_AUTODOWN, 12), LK_CMD_MODE(LK_DOWN, 13), LK_CMD_MODE(LK_AUTODOWN, 14), LK_AR_ENABLE, /* we want autorepeat by default */ LK_CL_ENABLE, 0x83, /* keyclick, volume */
int lk201_init(struct lk201_state *lks) { int i; lks->waitack = 0; send(lks, LK_LED_ENABLE); send(lks, LK_LED_ALL); /* * set all keys to updown mode; autorepeat is * done by wskbd software */ for (i = 1; i <= 14; i++) send(lks, LK_CMD_MODE(LK_UPDOWN, i)); send(lks, LK_CL_ENABLE); send(lks, LK_PARAM_VOLUME(3)); lks->kcvol = (8 - 3) * 100 / 8; lks->bellvol = -1; /* not yet set */ for (i = 0; i < LK_KLL; i++) lks->down_keys_list[i] = -1; send(lks, LK_KBD_ENABLE); send(lks, LK_LED_DISABLE); send(lks, LK_LED_ALL); lks->leds_state = 0; /* * Swallow all the keyboard acknowledges from lk201_init(). * There should be 14 of them - one per LK_CMD_MODE command. */ for(;;) { lks->waitack = 1; for (i = 100; i != 0; i--) { DELAY(1000); if (lks->waitack == 0) break; } if (i == 0) break; } /* * Try to set the keyboard in LK-401 mode. * If we receive an error, this is an LK-201 keyboard. */ lks->waitack = 1; send(lks, LK_ENABLE_401); for (i = 100; i != 0; i--) { DELAY(1000); if (lks->waitack == 0) break; } if (lks->waitack != 0) lks->kbdtype = KBD_NONE; else { if (lks->ackdata == LK_INPUT_ERROR) lks->kbdtype = KBD_LK201; else lks->kbdtype = KBD_LK401; } lks->waitack = 0; printf("lkkbd0: %s\n", lkkbd_descr[lks->kbdtype]); return 0; }