/*
 *	Commands to the keyboard processor
 */

#define LK_PARAM		0x80	/* start/end parameter list */

#define LK_CMD_RESUME		0x8b	/* resume transmission to the host */
#define LK_CMD_INHIBIT		0x89	/* stop transmission to the host */
#define LK_CMD_LEDS_ON		0x13	/* light LEDs */
					/* 1st param: led bitmask */
#define LK_CMD_LEDS_OFF		0x11	/* turn off LEDs */
					/* 1st param: led bitmask */
#define LK_CMD_DIS_KEYCLK	0x99	/* disable the keyclick */
#define LK_CMD_ENB_KEYCLK	0x1b	/* enable the keyclick */
					/* 1st param: volume */
#define LK_CMD_DIS_CTLCLK	0xb9	/* disable the Ctrl keyclick */
#define LK_CMD_ENB_CTLCLK	0xbb	/* enable the Ctrl keyclick */
#define LK_CMD_SOUND_CLK	0x9f	/* emit a keyclick */
#define LK_CMD_DIS_BELL		0xa1	/* disable the bell */
#define LK_CMD_ENB_BELL		0x23	/* enable the bell */
					/* 1st param: volume */
#define LK_CMD_BELL		0xa7	/* emit a bell */
#define LK_CMD_TMP_NORPT	0xc1	/* disable typematic */
					/* for the currently pressed key */
#define LK_CMD_ENB_RPT		0xe3	/* enable typematic */
					/* for RPT_DOWN groups */
#define LK_CMD_DIS_RPT		0xe1	/* disable typematic */
					/* for RPT_DOWN groups */
#define LK_CMD_RPT_TO_DOWN	0xd9	/* set RPT_DOWN groups to DOWN */
#define LK_CMD_REQ_ID		0xab	/* request the keyboard ID */
#define LK_CMD_POWER_UP		0xfd	/* init power-up sequence */
#define LK_CMD_TEST_MODE	0xcb	/* enter the factory test mode */
#define LK_CMD_TEST_EXIT	0x80	/* exit the factory test mode */
#define LK_CMD_SET_DEFAULTS	0xd3	/* set power-up defaults */

#define LK_CMD_MODE(m,div)	(LK_PARAM|(((div)&0xf)<<3)|m)
					/* select the repeat mode */
					/* for the selected key group */
#define LK_CMD_MODE_AR(m,div)	((((div)&0xf)<<3)|m)
					/* select the repeat mode */
					/* and the repeat register */
					/* for the selected key group */
					/* 1st param: register number */
#define LK_CMD_RPT_RATE(r)	(0x04|((((r)&0x3)<<1)))
					/* set the delay and repeat rate */
					/* for the selected repeat register */
					/* 1st param: initial delay */
					/* 2nd param: repeat rate */

/* there are 4 leds, represent them in the low 4 bits of a byte */
#define LK_PARAM_LED_MASK(ledbmap)	(LK_PARAM|((ledbmap)&0xf))
#define LK_LED_WAIT		0x1	/* Wait LED */
#define LK_LED_COMP		0x2	/* Compose LED */
#define LK_LED_LOCK		0x4	/* Lock LED */
#define LK_LED_HOLD		0x8	/* Hold Screen LED */

/* max volume is 0, lowest is 0x7 */
#define LK_PARAM_VOLUME(v)		(LK_PARAM|((v)&0x7))

/* mode set command details, div is a key group number */
#define LK_MODE_DOWN		0x0	/* make only */
#define LK_MODE_RPT_DOWN	0x2	/* make and typematic */
#define LK_MODE_DOWN_UP		0x6	/* make and release */

/* there are 4 repeat registers */
#define LK_PARAM_AR(r)		(LK_PARAM|((v)&0x3))

/*
 * Mappings between key groups and keycodes are as follows:
 *
 *  1: 0xbf - 0xfb -- alphanumeric,
 *  2: 0x92 - 0xa4 -- numeric keypad,
 *  3: 0xbc        -- Backspace,
 *  4: 0xbd - 0xbe -- Tab, Return,
 *  5: 0xb0 - 0xb1 -- Lock, Compose Character,
 *  6: 0xae - 0xaf -- Ctrl, Shift,
 *  7: 0xa7 - 0xa8 -- Left Arrow, Right Arrow,
 *  8: 0xa9 - 0xab -- Up Arrow, Down Arrow, Right Shift,
 *  9: 0x8a - 0x8f -- editor keypad,
 * 10: 0x56 - 0x5a -- F1 - F5,
 * 11: 0x64 - 0x68 -- F6 - F10,
 * 12: 0x71 - 0x74 -- F11 - F14,
 * 13: 0x7c - 0x7d -- Help, Do,
 * 14: 0x80 - 0x83 -- F17 - F20.
 *
 * Others, i.e. 0x55, 0xac, 0xad, 0xb2, are undiscovered.
 */

/* delay is 5 - 630 ms; 0x00 and 0x7f are reserved */
#define LK_PARAM_DELAY(t)	((t)&0x7f)

/* rate is 12 - 127 Hz; 0x00 - 0x0b and 0x7d (power-up!) are reserved */
#define LK_PARAM_RATE(r)	(LK_PARAM|((r)&0x7f))

#define LK_SHIFT 1<<0
#define LK_CTRL 1<<1
#define LK_LOCK 1<<2
#define LK_COMP 1<<3

#define LK_KEY_SHIFT		0xae
#define LK_KEY_CTRL		0xaf
#define LK_KEY_LOCK		0xb0
#define LK_KEY_COMP		0xb1

#define LK_KEY_RELEASE		0xb3	/* all keys released */
#define LK_KEY_REPEAT		0xb4	/* repeat the last key */

/* status responses */
#define LK_STAT_RESUME_ERR	0xb5	/* keystrokes lost while inhibited */
#define LK_STAT_ERROR		0xb6	/* an invalid command received */
#define LK_STAT_INHIBIT_ACK	0xb7	/* transmission inhibited */
#define LK_STAT_TEST_ACK	0xb8	/* the factory test mode entered */
#define LK_STAT_MODE_KEYDOWN	0xb9	/* a key is down on a change */
					/* to the DOWN_UP mode; */
					/* the keycode follows */
#define LK_STAT_MODE_ACK	0xba	/* the mode command succeeded */

#define LK_STAT_PWRUP_OK	0x00	/* the power-up self test OK */
#define LK_STAT_PWRUP_KDOWN	0x3d	/* a key was down during the test */
#define LK_STAT_PWRUP_ERROR	0x3e	/* keyboard self test failure */

extern unsigned char scancodeRemap[256];
