nuclear@0: #include nuclear@1: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "serial.h" nuclear@1: #include "scantbl.h" nuclear@2: #include "ps2kbd.h" nuclear@2: #include "amigakb.h" nuclear@2: #include "defs.h" nuclear@2: #include "timer.h" nuclear@1: nuclear@1: enum { nuclear@1: KF_BRK = 1, nuclear@1: KF_EXT = 2, nuclear@1: KF_EXT1 = 4, nuclear@2: nuclear@2: KF_CTRL = 16, nuclear@2: KF_LAMIGA = 32, nuclear@2: KF_RAMIGA = 64 nuclear@1: }; nuclear@2: #define KF_TRANSIENT 0x0f nuclear@2: #define KF_STICKY 0xf0 nuclear@0: nuclear@3: static unsigned char led_state; nuclear@3: nuclear@0: int main(void) nuclear@0: { nuclear@1: unsigned int keyflags = 0; nuclear@3: unsigned char c, keycode, prev_drvled = 0; nuclear@2: int press; nuclear@0: nuclear@2: /* disable all pullups globally */ nuclear@2: MCUCR |= 1 << PUD; nuclear@2: nuclear@1: DDRD = 0; nuclear@1: PORTD = 0; nuclear@1: EIMSK = 0; /* mask external interrupts */ nuclear@1: EICRA = (1 << ISC11) | (1 << ISC01); /* falling edge interrupts */ nuclear@0: nuclear@2: init_timer(); nuclear@2: nuclear@0: /* initialize the UART and enable interrupts */ nuclear@0: init_serial(9600); nuclear@0: sei(); nuclear@0: nuclear@0: printf("PS/2 keyboard controller - John Tsiombikas \r\n"); nuclear@1: nuclear@2: EIMSK = (1 << INT0) | (1 << INT1); /* enable ps/2 clock interrupt */ nuclear@0: nuclear@3: ps2setled(0); /* start with all LEDs off */ nuclear@3: nuclear@0: for(;;) { nuclear@3: while(!ps2pending()) { nuclear@3: unsigned char drvled = PIND & ADRVLED_BIT; nuclear@3: if(drvled != prev_drvled) { nuclear@3: prev_drvled = drvled; nuclear@3: if(drvled) { nuclear@3: led_state |= PS2LED_SCRLK; nuclear@3: } else { nuclear@3: led_state &= ~PS2LED_SCRLK; nuclear@3: } nuclear@3: ps2setled(led_state); nuclear@3: } nuclear@3: } nuclear@3: nuclear@3: c = ps2read(); nuclear@1: switch(c) { nuclear@1: case 0xe0: /* extended */ nuclear@1: keyflags |= KF_EXT; nuclear@1: break; nuclear@0: nuclear@1: case 0xe1: /* extended */ nuclear@1: keyflags |= KF_EXT1; nuclear@1: break; nuclear@0: nuclear@1: case 0xf0: /* break code */ nuclear@1: keyflags |= KF_BRK; nuclear@1: break; nuclear@1: nuclear@1: default: nuclear@2: press = !(keyflags & KF_BRK); nuclear@2: nuclear@2: keycode = 0xff; nuclear@1: if(keyflags & KF_EXT) { nuclear@1: if(c < KEYMAP_EXT_SIZE) { nuclear@1: keycode = keymap_ext[(int)c]; nuclear@1: } nuclear@1: } else if(keyflags & KF_EXT1) { nuclear@0: } else { nuclear@1: if(c < KEYMAP_NORMAL_SIZE) { nuclear@1: keycode = keymap_normal[(int)c]; nuclear@1: } nuclear@0: } nuclear@0: nuclear@2: switch(keycode) { nuclear@2: case AMIKEY_CTRL: nuclear@2: if(press) nuclear@2: keyflags |= KF_CTRL; nuclear@2: else nuclear@2: keyflags &= ~KF_CTRL; nuclear@2: break; nuclear@2: nuclear@2: case AMIKEY_LAMI: nuclear@2: if(press) nuclear@2: keyflags |= KF_LAMIGA; nuclear@2: else nuclear@2: keyflags &= ~KF_LAMIGA; nuclear@2: break; nuclear@2: nuclear@2: case AMIKEY_RAMI: nuclear@2: if(press) nuclear@2: keyflags |= KF_RAMIGA; nuclear@2: else nuclear@2: keyflags &= ~KF_RAMIGA; nuclear@2: break; nuclear@2: nuclear@2: default: nuclear@2: break; nuclear@2: } nuclear@2: nuclear@2: if((keyflags & (KF_CTRL | KF_RAMIGA | KF_LAMIGA)) == (KF_CTRL | KF_RAMIGA | KF_LAMIGA)) { nuclear@2: printf("CTRL - AMIGA - AMIGA!\r\n"); nuclear@2: amikb_reset(); nuclear@2: } nuclear@2: nuclear@2: if(keycode != 0xff) { nuclear@3: int press = ~keyflags & KF_BRK; nuclear@3: amikb_sendkey(keycode, press); nuclear@3: if(keycode == 0x62 && press) { nuclear@3: led_state ^= PS2LED_CAPSLK; nuclear@3: ps2setled(led_state); nuclear@3: } nuclear@3: /*printf("scancode %x -> [%s] amiga key %xh\r\n", (unsigned int)c, press ? "press" : "release", keycode);*/ nuclear@1: } else { nuclear@3: printf("PS/2 unknown command or keycode: %x\r\n", (unsigned int)c); nuclear@1: } nuclear@2: keyflags &= ~KF_TRANSIENT; nuclear@0: } nuclear@0: } nuclear@0: return 0; nuclear@0: }