2 * drivers/input/keyboard/98kbd.c
4 * PC-9801 keyboard driver for Linux
6 * Based on atkbd.c and xtkbd.c written by Vojtech Pavlik
8 * Copyright (c) 2002 Osamu Tomita
9 * Copyright (c) 1999-2001 Vojtech Pavlik
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include <linux/delay.h>
30 #include <linux/slab.h>
31 #include <linux/module.h>
32 #include <linux/input.h>
33 #include <linux/init.h>
34 #include <linux/serio.h>
37 #include <asm/pc9800.h>
39 MODULE_AUTHOR("Osamu Tomita <tomita@cinet.co.jp>");
40 MODULE_DESCRIPTION("PC-9801 keyboard driver");
41 MODULE_LICENSE("GPL");
43 #define KBD98_KEY 0x7f
44 #define KBD98_RELEASE 0x80
46 static unsigned char kbd98_keycode[256] = {
47 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 43, 14, 15,
48 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 41, 26, 28, 30, 31, 32,
49 33, 34, 35, 36, 37, 38, 39, 40, 27, 44, 45, 46, 47, 48, 49, 50,
50 51, 52, 53, 12, 57, 92,109,104,110,111,103,105,106,108,102,107,
51 74, 98, 71, 72, 73, 55, 75, 76, 77, 78, 79, 80, 81,117, 82,121,
52 83, 94, 87, 88,183,184,185, 0, 0, 0, 0, 0, 0, 0,102, 0,
53 99,133, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 0, 0, 0, 0,
58 unsigned char scancode;
61 unsigned char keycode;
65 static struct jis_kbd_conv kbd98_jis[] = {
66 {0x02, {{0, 3}, {1, 40}}},
67 {0x06, {{0, 7}, {1, 8}}},
68 {0x07, {{0, 8}, {0, 40}}},
69 {0x08, {{0, 9}, {1, 10}}},
70 {0x09, {{0, 10}, {1, 11}}},
71 {0x0a, {{0, 11}, {1, 255}}},
72 {0x0b, {{0, 12}, {0, 13}}},
73 {0x0c, {{1, 7}, {0, 41}}},
74 {0x1a, {{1, 3}, {1, 41}}},
75 {0x26, {{0, 39}, {1, 13}}},
76 {0x27, {{1, 39}, {1, 9}}},
77 {0x33, {{0, 255}, {1, 12}}},
78 {0xff, {{0, 255}, {1, 255}}} /* terminater */
81 #define KBD98_CMD_SETEXKEY 0x1095 /* Enable/Disable Windows, Appli key */
82 #define KBD98_CMD_SETRATE 0x109c /* Set typematic rate */
83 #define KBD98_CMD_SETLEDS 0x109d /* Set keyboard leds */
84 #define KBD98_CMD_GETLEDS 0x119d /* Get keyboard leds */
85 #define KBD98_CMD_GETID 0x019f
87 #define KBD98_RET_ACK 0xfa
88 #define KBD98_RET_NAK 0xfc /* Command NACK, send the cmd again */
90 #define KBD98_KEY_JIS_EMUL 253
91 #define KBD98_KEY_UNKNOWN 254
92 #define KBD98_KEY_NULL 255
94 static char *kbd98_name = "PC-9801 Keyboard";
97 unsigned char keycode[256];
101 unsigned char cmdbuf[4];
102 unsigned char cmdcnt;
106 unsigned char scancode;
107 unsigned char keycode;
109 struct jis_kbd_conv jis[16];
112 irqreturn_t kbd98_interrupt(struct serio *serio, unsigned char data,
113 unsigned int flags, struct pt_regs *regs)
115 struct kbd98 *kbd98 = serio->private;
116 unsigned char scancode, keycode;
129 kbd98->cmdbuf[--kbd98->cmdcnt] = data;
133 scancode = data & KBD98_KEY;
134 keycode = kbd98->keycode[scancode];
135 press = !(data & KBD98_RELEASE);
136 if (kbd98->emul.scancode != KBD98_KEY_UNKNOWN
137 && scancode != kbd98->emul.scancode) {
138 input_report_key(&kbd98->dev, kbd98->emul.keycode, 0);
139 kbd98->emul.scancode = KBD98_KEY_UNKNOWN;
142 if (keycode == KEY_RIGHTSHIFT)
143 kbd98->shift = press;
157 /* emulation: JIS keyboard to US101 keyboard */
159 while (kbd98->jis[i].scancode != 0xff) {
160 if (scancode == kbd98->jis[i].scancode)
165 keycode = kbd98->jis[i].emul[kbd98->shift].keycode;
166 if (keycode == KBD98_KEY_NULL)
170 kbd98->emul.scancode = scancode;
171 kbd98->emul.keycode = keycode;
172 if (kbd98->jis[i].emul[kbd98->shift].shift
174 input_report_key(&kbd98->dev,
179 input_report_key(&kbd98->dev, keycode, press);
181 if (kbd98->jis[i].emul[kbd98->shift].shift
183 input_report_key(&kbd98->dev,
186 kbd98->emul.scancode = KBD98_KEY_UNKNOWN;
189 input_sync(&kbd98->dev);
193 input_report_key(&kbd98->dev, keycode, 1);
194 input_sync(&kbd98->dev);
195 input_report_key(&kbd98->dev, keycode, 0);
196 input_sync(&kbd98->dev);
203 printk(KERN_WARNING "kbd98.c: Unknown key (scancode %#x) %s.\n",
204 data & KBD98_KEY, data & KBD98_RELEASE ? "released" : "pressed");
208 input_report_key(&kbd98->dev, keycode, press);
209 input_sync(&kbd98->dev);
218 * kbd98_sendbyte() sends a byte to the keyboard, and waits for
219 * acknowledge. It doesn't handle resends according to the keyboard
220 * protocol specs, because if these are needed, the keyboard needs
221 * replacement anyway, and they only make a mess in the protocol.
224 static int kbd98_sendbyte(struct kbd98 *kbd98, unsigned char byte)
226 int timeout = 10000; /* 100 msec */
229 if (serio_write(kbd98->serio, byte))
232 while (!kbd98->ack && timeout--) udelay(10);
234 return -(kbd98->ack <= 0);
238 * kbd98_command() sends a command, and its parameters to the keyboard,
239 * then waits for the response and puts it in the param array.
242 static int kbd98_command(struct kbd98 *kbd98, unsigned char *param, int command)
244 int timeout = 50000; /* 500 msec */
245 int send = (command >> 12) & 0xf;
246 int receive = (command >> 8) & 0xf;
249 kbd98->cmdcnt = receive;
252 if (kbd98_sendbyte(kbd98, command & 0xff))
253 return (kbd98->cmdcnt = 0) - 1;
255 for (i = 0; i < send; i++)
256 if (kbd98_sendbyte(kbd98, param[i]))
257 return (kbd98->cmdcnt = 0) - 1;
259 while (kbd98->cmdcnt && timeout--) udelay(10);
262 for (i = 0; i < receive; i++)
263 param[i] = kbd98->cmdbuf[(receive - 1) - i];
266 return (kbd98->cmdcnt = 0) - 1;
272 * Event callback from the input module. Events that change the state of
273 * the hardware are processed here.
276 static int kbd98_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
278 struct kbd98 *kbd98 = dev->private;
285 if (__PC9800SCA_TEST_BIT(0x481, 3)) {
286 /* 98note with Num Lock key */
287 /* keep Num Lock status */
289 if (kbd98_command(kbd98, param,
292 "kbd98: Get keyboard LED"
297 /* desktop PC-9801 */
298 *param = 1; /* Always set Num Lock */
302 | (test_bit(LED_CAPSL, dev->led) ? 4 : 0)
303 | (test_bit(LED_KANA, dev->led) ? 8 : 0);
304 kbd98_command(kbd98, param, KBD98_CMD_SETLEDS);
312 void kbd98_connect(struct serio *serio, struct serio_dev *dev)
317 if ((serio->type & SERIO_TYPE) != SERIO_PC9800)
320 if (!(kbd98 = kmalloc(sizeof(struct kbd98), GFP_KERNEL)))
323 memset(kbd98, 0, sizeof(struct kbd98));
324 kbd98->emul.scancode = KBD98_KEY_UNKNOWN;
326 kbd98->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
327 kbd98->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_KANA);
329 kbd98->serio = serio;
331 init_input_dev(&kbd98->dev);
332 kbd98->dev.keycode = kbd98->keycode;
333 kbd98->dev.keycodesize = sizeof(unsigned char);
334 kbd98->dev.keycodemax = ARRAY_SIZE(kbd98_keycode);
335 kbd98->dev.event = kbd98_event;
336 kbd98->dev.private = kbd98;
338 serio->private = kbd98;
340 if (serio_open(serio, dev)) {
345 memcpy(kbd98->jis, kbd98_jis, sizeof(kbd98_jis));
346 memcpy(kbd98->keycode, kbd98_keycode, sizeof(kbd98->keycode));
347 for (i = 0; i < 255; i++)
348 set_bit(kbd98->keycode[i], kbd98->dev.keybit);
349 clear_bit(0, kbd98->dev.keybit);
351 sprintf(kbd98->phys, "%s/input0", serio->phys);
353 kbd98->dev.name = kbd98_name;
354 kbd98->dev.phys = kbd98->phys;
355 kbd98->dev.id.bustype = BUS_XTKBD;
356 kbd98->dev.id.vendor = 0x0002;
357 kbd98->dev.id.product = 0x0001;
358 kbd98->dev.id.version = 0x0100;
360 input_register_device(&kbd98->dev);
362 printk(KERN_INFO "input: %s on %s\n", kbd98_name, serio->phys);
365 void kbd98_disconnect(struct serio *serio)
367 struct kbd98 *kbd98 = serio->private;
368 input_unregister_device(&kbd98->dev);
373 struct serio_dev kbd98_dev = {
374 .interrupt = kbd98_interrupt,
375 .connect = kbd98_connect,
376 .disconnect = kbd98_disconnect
379 int __init kbd98_init(void)
381 serio_register_device(&kbd98_dev);
385 void __exit kbd98_exit(void)
387 serio_unregister_device(&kbd98_dev);
390 module_init(kbd98_init);
391 module_exit(kbd98_exit);