--- linux98-2.5.45-ac1/drivers/input/keyboard/98kbd.c Sun Oct 27 07:45:43 2002 +++ linux98-2.5.45-ac1/drivers/input/keyboard/98kbd.c Thu Nov 7 13:52:11 2002 @@ -87,7 +87,8 @@ #define KBD98_RET_ACK 0xfa #define KBD98_RET_NAK 0xfc /* Command NACK, send the cmd again */ -#define KBD98_KEY_JIS_EMUL 254 +#define KBD98_KEY_JIS_EMUL 253 +#define KBD98_KEY_UNKNOWN 254 #define KBD98_KEY_NULL 255 static char *kbd98_name = "PC-9801 Keyboard"; @@ -101,6 +102,10 @@ unsigned char cmdcnt; signed char ack; unsigned char shift; + struct { + unsigned char scancode; + unsigned char keycode; + } emul; struct jis_kbd_conv jis[16]; }; @@ -127,6 +132,12 @@ scancode = data & KBD98_KEY; keycode = kbd98->keycode[scancode]; press = !(data & KBD98_RELEASE); + if (kbd98->emul.scancode != KBD98_KEY_UNKNOWN + && scancode != kbd98->emul.scancode) { + input_report_key(&kbd98->dev, kbd98->emul.keycode, 0); + kbd98->emul.scancode = KBD98_KEY_UNKNOWN; + } + if (keycode == KEY_RIGHTSHIFT) kbd98->shift = press; @@ -154,13 +165,24 @@ if (keycode == KBD98_KEY_NULL) return; - if (kbd98->jis[i].emul[kbd98->shift].shift != kbd98->shift && press) { - input_report_key(&kbd98->dev, KEY_RIGHTSHIFT, !(kbd98->shift)); + if (press) { + kbd98->emul.scancode = scancode; + kbd98->emul.keycode = keycode; + if (kbd98->jis[i].emul[kbd98->shift].shift + != kbd98->shift) + input_report_key(&kbd98->dev, + KEY_RIGHTSHIFT, + !(kbd98->shift)); } input_report_key(&kbd98->dev, keycode, press); - if (kbd98->jis[i].emul[kbd98->shift].shift != kbd98->shift && !press) { - input_report_key(&kbd98->dev, KEY_RIGHTSHIFT, kbd98->shift); + if (!press) { + if (kbd98->jis[i].emul[kbd98->shift].shift + != kbd98->shift) + input_report_key(&kbd98->dev, + KEY_RIGHTSHIFT, + kbd98->shift); + kbd98->emul.scancode = KBD98_KEY_UNKNOWN; } input_sync(&kbd98->dev); @@ -287,6 +309,7 @@ return; memset(kbd98, 0, sizeof(struct kbd98)); + kbd98->emul.scancode = KBD98_KEY_UNKNOWN; kbd98->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP); kbd98->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_KANA);