2 * linux/atari/atakeyb.c
4 * Atari Keyboard driver for 680x0 Linux
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file COPYING in the main directory of this archive
12 * Atari support by Robert de Vries
13 * enhanced by Bjoern Brauel and Roman Hodek
16 #include <linux/module.h>
17 #include <linux/sched.h>
18 #include <linux/kernel.h>
19 #include <linux/interrupt.h>
20 #include <linux/errno.h>
21 #include <linux/keyboard.h>
22 #include <linux/delay.h>
23 #include <linux/timer.h>
25 #include <linux/random.h>
26 #include <linux/init.h>
27 #include <linux/kbd_kern.h>
29 #include <asm/atariints.h>
30 #include <asm/atarihw.h>
31 #include <asm/atarikb.h>
32 #include <asm/atari_joystick.h>
35 static void atakeyb_rep(unsigned long ignore);
36 extern unsigned int keymap_count;
38 /* Hook for MIDI serial driver */
39 void (*atari_MIDI_interrupt_hook) (void);
40 /* Hook for mouse driver */
41 void (*atari_mouse_interrupt_hook) (char *);
42 /* Hook for keyboard inputdev driver */
43 void (*atari_input_keyboard_interrupt_hook) (unsigned char, char);
44 /* Hook for mouse inputdev driver */
45 void (*atari_input_mouse_interrupt_hook) (char *);
46 EXPORT_SYMBOL(atari_mouse_interrupt_hook);
47 EXPORT_SYMBOL(atari_input_keyboard_interrupt_hook);
48 EXPORT_SYMBOL(atari_input_mouse_interrupt_hook);
50 /* variables for IKBD self test: */
52 /* state: 0: off; >0: in progress; >1: 0xf1 received */
53 static volatile int ikbd_self_test;
54 /* timestamp when last received a char */
55 static volatile unsigned long self_test_last_rcv;
56 /* bitmap of keys reported as broken */
57 static unsigned long broken_keys[128/(sizeof(unsigned long)*8)] = { 0, };
59 #define BREAK_MASK (0x80)
62 * ++roman: The following changes were applied manually:
64 * - The Alt (= Meta) key works in combination with Shift and
65 * Control, e.g. Alt+Shift+a sends Meta-A (0xc1), Alt+Control+A sends
66 * Meta-Ctrl-A (0x81) ...
68 * - The parentheses on the keypad send '(' and ')' with all
69 * modifiers (as would do e.g. keypad '+'), but they cannot be used as
70 * application keys (i.e. sending Esc O c).
72 * - HELP and UNDO are mapped to be F21 and F24, resp, that send the
73 * codes "\E[M" and "\E[P". (This is better than the old mapping to
74 * F11 and F12, because these codes are on Shift+F1/2 anyway.) This
75 * way, applications that allow their own keyboard mappings
76 * (e.g. tcsh, X Windows) can be configured to use them in the way
77 * the label suggests (providing help or undoing).
79 * - Console switching is done with Alt+Fx (consoles 1..10) and
80 * Shift+Alt+Fx (consoles 11..20).
82 * - The misc. special function implemented in the kernel are mapped
83 * to the following key combinations:
85 * ClrHome -> Home/Find
86 * Shift + ClrHome -> End/Select
87 * Shift + Up -> Page Up
88 * Shift + Down -> Page Down
89 * Alt + Help -> show system status
90 * Shift + Help -> show memory info
91 * Ctrl + Help -> show registers
92 * Ctrl + Alt + Del -> Reboot
93 * Alt + Undo -> switch to last console
94 * Shift + Undo -> send interrupt
95 * Alt + Insert -> stop/start output (same as ^S/^Q)
96 * Alt + Up -> Scroll back console (if implemented)
97 * Alt + Down -> Scroll forward console (if implemented)
98 * Alt + CapsLock -> NumLock
102 * - Help mapped to K_HELP
103 * - Undo mapped to K_UNDO (= K_F246)
104 * - Keypad Left/Right Parenthesis mapped to new K_PPAREN[LR]
107 static u_short ataplain_map[NR_KEYS] __initdata = {
108 0xf200, 0xf01b, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036,
109 0xf037, 0xf038, 0xf039, 0xf030, 0xf02d, 0xf03d, 0xf008, 0xf009,
110 0xfb71, 0xfb77, 0xfb65, 0xfb72, 0xfb74, 0xfb79, 0xfb75, 0xfb69,
111 0xfb6f, 0xfb70, 0xf05b, 0xf05d, 0xf201, 0xf702, 0xfb61, 0xfb73,
112 0xfb64, 0xfb66, 0xfb67, 0xfb68, 0xfb6a, 0xfb6b, 0xfb6c, 0xf03b,
113 0xf027, 0xf060, 0xf700, 0xf05c, 0xfb7a, 0xfb78, 0xfb63, 0xfb76,
114 0xfb62, 0xfb6e, 0xfb6d, 0xf02c, 0xf02e, 0xf02f, 0xf700, 0xf200,
115 0xf703, 0xf020, 0xf207, 0xf100, 0xf101, 0xf102, 0xf103, 0xf104,
116 0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf200, 0xf200, 0xf114,
117 0xf603, 0xf200, 0xf30b, 0xf601, 0xf200, 0xf602, 0xf30a, 0xf200,
118 0xf600, 0xf200, 0xf115, 0xf07f, 0xf200, 0xf200, 0xf200, 0xf200,
119 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
120 0xf200, 0xf1ff, 0xf11b, 0xf312, 0xf313, 0xf30d, 0xf30c, 0xf307,
121 0xf308, 0xf309, 0xf304, 0xf305, 0xf306, 0xf301, 0xf302, 0xf303,
122 0xf300, 0xf310, 0xf30e, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,
123 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200
126 typedef enum kb_state_t {
127 KEYBOARD, AMOUSE, RMOUSE, JOYSTICK, CLOCK, RESYNC
130 #define IS_SYNC_CODE(sc) ((sc) >= 0x04 && (sc) <= 0xfb)
132 typedef struct keyboard_state {
133 unsigned char buf[6];
138 KEYBOARD_STATE kb_state;
140 #define DEFAULT_KEYB_REP_DELAY (HZ/4)
141 #define DEFAULT_KEYB_REP_RATE (HZ/25)
143 /* These could be settable by some ioctl() in future... */
144 static unsigned int key_repeat_delay = DEFAULT_KEYB_REP_DELAY;
145 static unsigned int key_repeat_rate = DEFAULT_KEYB_REP_RATE;
147 static unsigned char rep_scancode;
148 static struct timer_list atakeyb_rep_timer = {
149 .function = atakeyb_rep,
152 static void atakeyb_rep(unsigned long ignore)
154 /* Disable keyboard for the time we call handle_scancode(), else a race
155 * in the keyboard tty queue may happen */
156 atari_disable_irq(IRQ_MFP_ACIA);
157 del_timer(&atakeyb_rep_timer);
159 /* A keyboard int may have come in before we disabled the irq, so
160 * double-check whether rep_scancode is still != 0 */
162 init_timer(&atakeyb_rep_timer);
163 atakeyb_rep_timer.expires = jiffies + key_repeat_rate;
164 add_timer(&atakeyb_rep_timer);
166 //handle_scancode(rep_scancode, 1);
167 if (atari_input_keyboard_interrupt_hook)
168 atari_input_keyboard_interrupt_hook(rep_scancode, 1);
171 atari_enable_irq(IRQ_MFP_ACIA);
175 /* ++roman: If a keyboard overrun happened, we can't tell in general how much
176 * bytes have been lost and in which state of the packet structure we are now.
177 * This usually causes keyboards bytes to be interpreted as mouse movements
178 * and vice versa, which is very annoying. It seems better to throw away some
179 * bytes (that are usually mouse bytes) than to misinterpret them. Therefor I
180 * introduced the RESYNC state for IKBD data. In this state, the bytes up to
181 * one that really looks like a key event (0x04..0xf2) or the start of a mouse
182 * packet (0xf8..0xfb) are thrown away, but at most 2 bytes. This at least
183 * speeds up the resynchronization of the event structure, even if maybe a
184 * mouse movement is lost. However, nothing is perfect. For bytes 0x01..0x03,
185 * it's really hard to decide whether they're mouse or keyboard bytes. Since
186 * overruns usually occur when moving the Atari mouse rapidly, they're seen as
187 * mouse bytes here. If this is wrong, only a make code of the keyboard gets
188 * lost, which isn't too bad. Loosing a break code would be disastrous,
189 * because then the keyboard repeat strikes...
192 static irqreturn_t atari_keyboard_interrupt(int irq, void *dummy)
199 if (acia.mid_ctrl & ACIA_IRQ)
200 if (atari_MIDI_interrupt_hook)
201 atari_MIDI_interrupt_hook();
202 acia_stat = acia.key_ctrl;
203 /* check out if the interrupt came from this ACIA */
204 if (!((acia_stat | acia.mid_ctrl) & ACIA_IRQ))
207 if (acia_stat & ACIA_OVRN) {
208 /* a very fast typist or a slow system, give a warning */
209 /* ...happens often if interrupts were disabled for too long */
210 printk(KERN_DEBUG "Keyboard overrun\n");
211 scancode = acia.key_data;
212 /* Turn off autorepeating in case a break code has been lost */
213 del_timer(&atakeyb_rep_timer);
216 /* During self test, don't do resyncing, just process the code */
217 goto interpret_scancode;
218 else if (IS_SYNC_CODE(scancode)) {
219 /* This code seem already to be the start of a new packet or a
221 kb_state.state = KEYBOARD;
222 goto interpret_scancode;
224 /* Go to RESYNC state and skip this byte */
225 kb_state.state = RESYNC;
226 kb_state.len = 1; /* skip max. 1 another byte */
231 if (acia_stat & ACIA_RDRF) {
232 /* received a character */
233 scancode = acia.key_data; /* get it or reset the ACIA, I'll get it! */
234 tasklet_schedule(&keyboard_tasklet);
236 switch (kb_state.state) {
240 kb_state.state = AMOUSE;
248 kb_state.state = RMOUSE;
250 kb_state.buf[0] = scancode;
254 kb_state.state = CLOCK;
260 kb_state.state = JOYSTICK;
262 kb_state.buf[0] = scancode;
266 /* during self-test, note that 0xf1 received */
267 if (ikbd_self_test) {
269 self_test_last_rcv = jiffies;
275 break_flag = scancode & BREAK_MASK;
276 scancode &= ~BREAK_MASK;
277 if (ikbd_self_test) {
278 /* Scancodes sent during the self-test stand for broken
279 * keys (keys being down). The code *should* be a break
280 * code, but nevertheless some AT keyboard interfaces send
281 * make codes instead. Therefore, simply ignore
284 int keyval = plain_map[scancode], keytyp;
286 set_bit(scancode, broken_keys);
287 self_test_last_rcv = jiffies;
288 keyval = plain_map[scancode];
289 keytyp = KTYP(keyval) - 0xf0;
290 keyval = KVAL(keyval);
292 printk(KERN_WARNING "Key with scancode %d ", scancode);
293 if (keytyp == KT_LATIN || keytyp == KT_LETTER) {
295 printk("('^%c') ", keyval + '@');
297 printk("('%c') ", keyval);
299 printk("is broken -- will be ignored.\n");
301 } else if (test_bit(scancode, broken_keys))
304 #if 0 // FIXME; hangs at boot
306 del_timer(&atakeyb_rep_timer);
309 del_timer(&atakeyb_rep_timer);
310 rep_scancode = scancode;
311 atakeyb_rep_timer.expires = jiffies + key_repeat_delay;
312 add_timer(&atakeyb_rep_timer);
316 // handle_scancode(scancode, !break_flag);
317 if (atari_input_keyboard_interrupt_hook)
318 atari_input_keyboard_interrupt_hook((unsigned char)scancode, !break_flag);
324 kb_state.buf[kb_state.len++] = scancode;
325 if (kb_state.len == 5) {
326 kb_state.state = KEYBOARD;
328 /* wake up someone waiting for this */
333 kb_state.buf[kb_state.len++] = scancode;
334 if (kb_state.len == 3) {
335 kb_state.state = KEYBOARD;
336 if (atari_mouse_interrupt_hook)
337 atari_mouse_interrupt_hook(kb_state.buf);
342 kb_state.buf[1] = scancode;
343 kb_state.state = KEYBOARD;
344 #ifdef FIXED_ATARI_JOYSTICK
345 atari_joystick_interrupt(kb_state.buf);
350 kb_state.buf[kb_state.len++] = scancode;
351 if (kb_state.len == 6) {
352 kb_state.state = KEYBOARD;
353 /* wake up someone waiting for this.
354 But will this ever be used, as Linux keeps its own time.
355 Perhaps for synchronization purposes? */
356 /* wake_up_interruptible(&clock_wait); */
361 if (kb_state.len <= 0 || IS_SYNC_CODE(scancode)) {
362 kb_state.state = KEYBOARD;
363 goto interpret_scancode;
371 if (acia_stat & ACIA_CTS)
375 if (acia_stat & (ACIA_FE | ACIA_PE)) {
376 printk("Error in keyboard communication\n");
379 /* handle_scancode() can take a lot of time, so check again if
380 * some character arrived
386 * I write to the keyboard without using interrupts, I poll instead.
387 * This takes for the maximum length string allowed (7) at 7812.5 baud
388 * 8 data 1 start 1 stop bit: 9.0 ms
389 * If this takes too long for normal operation, interrupt driven writing
390 * is the solution. (I made a feeble attempt in that direction but I
391 * kept it simple for now.)
393 void ikbd_write(const char *str, int len)
397 if ((len < 1) || (len > 7))
398 panic("ikbd: maximum string length exceeded");
400 acia_stat = acia.key_ctrl;
401 if (acia_stat & ACIA_TDRE) {
402 acia.key_data = *str++;
408 /* Reset (without touching the clock) */
409 void ikbd_reset(void)
411 static const char cmd[2] = { 0x80, 0x01 };
416 * if all's well code 0xF1 is returned, else the break codes of
417 * all keys making contact
421 /* Set mouse button action */
422 void ikbd_mouse_button_action(int mode)
424 char cmd[2] = { 0x07, mode };
429 /* Set relative mouse position reporting */
430 void ikbd_mouse_rel_pos(void)
432 static const char cmd[1] = { 0x08 };
436 EXPORT_SYMBOL(ikbd_mouse_rel_pos);
438 /* Set absolute mouse position reporting */
439 void ikbd_mouse_abs_pos(int xmax, int ymax)
441 char cmd[5] = { 0x09, xmax>>8, xmax&0xFF, ymax>>8, ymax&0xFF };
446 /* Set mouse keycode mode */
447 void ikbd_mouse_kbd_mode(int dx, int dy)
449 char cmd[3] = { 0x0A, dx, dy };
454 /* Set mouse threshold */
455 void ikbd_mouse_thresh(int x, int y)
457 char cmd[3] = { 0x0B, x, y };
461 EXPORT_SYMBOL(ikbd_mouse_thresh);
463 /* Set mouse scale */
464 void ikbd_mouse_scale(int x, int y)
466 char cmd[3] = { 0x0C, x, y };
471 /* Interrogate mouse position */
472 void ikbd_mouse_pos_get(int *x, int *y)
474 static const char cmd[1] = { 0x0D };
478 /* wait for returning bytes */
481 /* Load mouse position */
482 void ikbd_mouse_pos_set(int x, int y)
484 char cmd[6] = { 0x0E, 0x00, x>>8, x&0xFF, y>>8, y&0xFF };
489 /* Set Y=0 at bottom */
490 void ikbd_mouse_y0_bot(void)
492 static const char cmd[1] = { 0x0F };
498 void ikbd_mouse_y0_top(void)
500 static const char cmd[1] = { 0x10 };
504 EXPORT_SYMBOL(ikbd_mouse_y0_top);
507 void ikbd_resume(void)
509 static const char cmd[1] = { 0x11 };
515 void ikbd_mouse_disable(void)
517 static const char cmd[1] = { 0x12 };
521 EXPORT_SYMBOL(ikbd_mouse_disable);
524 void ikbd_pause(void)
526 static const char cmd[1] = { 0x13 };
531 /* Set joystick event reporting */
532 void ikbd_joystick_event_on(void)
534 static const char cmd[1] = { 0x14 };
539 /* Set joystick interrogation mode */
540 void ikbd_joystick_event_off(void)
542 static const char cmd[1] = { 0x15 };
547 /* Joystick interrogation */
548 void ikbd_joystick_get_state(void)
550 static const char cmd[1] = { 0x16 };
556 /* This disables all other ikbd activities !!!! */
557 /* Set joystick monitoring */
558 void ikbd_joystick_monitor(int rate)
560 static const char cmd[2] = { 0x17, rate };
564 kb_state.state = JOYSTICK_MONITOR;
568 /* some joystick routines not in yet (0x18-0x19) */
570 /* Disable joysticks */
571 void ikbd_joystick_disable(void)
573 static const char cmd[1] = { 0x1A };
578 /* Time-of-day clock set */
579 void ikbd_clock_set(int year, int month, int day, int hour, int minute, int second)
581 char cmd[7] = { 0x1B, year, month, day, hour, minute, second };
586 /* Interrogate time-of-day clock */
587 void ikbd_clock_get(int *year, int *month, int *day, int *hour, int *minute, int second)
589 static const char cmd[1] = { 0x1C };
595 void ikbd_mem_write(int address, int size, char *data)
597 panic("Attempt to write data into keyboard memory");
601 void ikbd_mem_read(int address, char data[6])
603 char cmd[3] = { 0x21, address>>8, address&0xFF };
607 /* receive data and put it in data */
610 /* Controller execute */
611 void ikbd_exec(int address)
613 char cmd[3] = { 0x22, address>>8, address&0xFF };
618 /* Status inquiries (0x87-0x9A) not yet implemented */
620 /* Set the state of the caps lock led. */
621 void atari_kbd_leds(unsigned int leds)
623 char cmd[6] = {32, 0, 4, 1, 254 + ((leds & 4) != 0), 0};
629 * The original code sometimes left the interrupt line of
630 * the ACIAs low forever. I hope, it is fixed now.
632 * Martin Rogge, 20 Aug 1995
635 static int atari_keyb_done = 0;
637 int __init atari_keyb_init(void)
643 memcpy(key_maps[0], ataplain_map, sizeof(plain_map));
645 kb_state.state = KEYBOARD;
648 request_irq(IRQ_MFP_ACIA, atari_keyboard_interrupt, IRQ_TYPE_SLOW,
649 "keyboard/mouse/MIDI", atari_keyboard_interrupt);
651 atari_turnoff_irq(IRQ_MFP_ACIA);
653 /* reset IKBD ACIA */
654 acia.key_ctrl = ACIA_RESET |
655 (atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : 0;
659 /* reset MIDI ACIA */
660 acia.mid_ctrl = ACIA_RESET |
661 (atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0;
665 /* divide 500kHz by 64 gives 7812.5 baud */
666 /* 8 data no parity 1 start 1 stop bit */
667 /* receive interrupt enabled */
668 /* RTS low (except if switch selected), transmit interrupt disabled */
669 acia.key_ctrl = (ACIA_DIV64|ACIA_D8N1S|ACIA_RIE) |
670 ((atari_switches & ATARI_SWITCH_IKBD) ?
671 ACIA_RHTID : ACIA_RLTID);
673 acia.mid_ctrl = ACIA_DIV16 | ACIA_D8N1S |
674 (atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0;
676 /* make sure the interrupt line is up */
677 } while ((mfp.par_dt_reg & 0x10) == 0);
679 /* enable ACIA Interrupts */
680 mfp.active_edge &= ~0x10;
681 atari_turnon_irq(IRQ_MFP_ACIA);
685 /* wait for a period of inactivity (here: 0.25s), then assume the IKBD's
686 * self-test is finished */
687 self_test_last_rcv = jiffies;
688 while (time_before(jiffies, self_test_last_rcv + HZ/4))
690 /* if not incremented: no 0xf1 received */
691 if (ikbd_self_test == 1)
692 printk(KERN_ERR "WARNING: keyboard self test failed!\n");
695 ikbd_mouse_disable();
696 ikbd_joystick_disable();
698 #ifdef FIXED_ATARI_JOYSTICK
699 atari_joystick_init();
707 int atari_kbdrate(struct kbd_repeat *k)
710 /* convert from msec to jiffies */
711 key_repeat_delay = (k->delay * HZ + 500) / 1000;
712 if (key_repeat_delay < 1)
713 key_repeat_delay = 1;
716 key_repeat_rate = (k->period * HZ + 500) / 1000;
717 if (key_repeat_rate < 1)
721 k->delay = key_repeat_delay * 1000 / HZ;
722 k->period = key_repeat_rate * 1000 / HZ;
727 int atari_kbd_translate(unsigned char keycode, unsigned char *keycodep, char raw_mode)
729 #ifdef CONFIG_MAGIC_SYSRQ
730 /* ALT+HELP pressed? */
731 if ((keycode == 98) && ((shift_state & 0xff) == 8))