4 #include <avr/interrupt.h>
5 #include <util/delay.h>
22 #define KF_TRANSIENT 0x0f
23 #define KF_STICKY 0xf0
25 #define RESET_WAIT 1000
27 static unsigned char led_state;
31 unsigned int keyflags = 0;
32 unsigned char c, keycode, prev_drvled = 0;
35 /* disable all pullups globally */
40 EIMSK = 0; /* mask external interrupts */
41 EICRA = (1 << ISC11) | (1 << ISC01); /* falling edge interrupts */
45 /* initialize the UART and enable interrupts */
49 printf("PS/2 keyboard controller - John Tsiombikas <nuclear@member.fsf.org>\r\n");
51 EIMSK = (1 << INT0) | (1 << INT1); /* enable ps/2 clock interrupt */
53 ps2setled(0); /* start with all LEDs off */
56 while(!ps2pending()) {
57 unsigned char drvled = PIND & ADRVLED_BIT;
58 if(drvled != prev_drvled) {
61 led_state |= PS2LED_SCRLK;
63 led_state &= ~PS2LED_SCRLK;
71 case 0xe0: /* extended */
75 case 0xe1: /* extended */
79 case 0xf0: /* break code */
84 press = !(keyflags & KF_BRK);
87 if(keyflags & KF_EXT) {
88 if(c < KEYMAP_EXT_SIZE) {
89 keycode = keymap_ext[(int)c];
91 } else if(keyflags & KF_EXT1) {
93 if(c < KEYMAP_NORMAL_SIZE) {
94 keycode = keymap_normal[(int)c];
103 keyflags &= ~KF_CTRL;
108 keyflags |= KF_LAMIGA;
110 keyflags &= ~KF_LAMIGA;
115 keyflags |= KF_RAMIGA;
117 keyflags &= ~KF_RAMIGA;
124 if((keyflags & (KF_CTRL | KF_RAMIGA | KF_LAMIGA)) == (KF_CTRL | KF_RAMIGA | KF_LAMIGA)) {
125 printf("CTRL - AMIGA - AMIGA!\r\n");
131 while(get_msec() < RESET_WAIT);
137 if(keycode != 0xff) {
138 int press = ~keyflags & KF_BRK;
139 amikb_sendkey(keycode, press);
140 if(keycode == 0x62 && press) {
141 led_state ^= PS2LED_CAPSLK;
142 ps2setled(led_state);
144 /*printf("scancode %x -> [%s] amiga key %xh\r\n", (unsigned int)c, press ? "press" : "release", keycode);*/
146 printf("PS/2 unknown command or keycode: %x\r\n", (unsigned int)c);
148 keyflags &= ~KF_TRANSIENT;