;------------------------------------------------------------- ; PS/2 ISR for echo to LCD ; For Luminary Micro IDM-L35 (Cortex-M3) ;------------------------------------------------------------- ; open the init-lcd-uart file (define p (open-output-file "init-lcd-ps2")) ; IDM-L35 ; FOR Keyboard on port A-E (not F+) ; PD.0 = PS2 IO pin ; PD.1 = PS2 CLK pin (write '(begin (define ps2_gpio giod) ; gpio D base address (#x04000700) (define ps2_isr 3) ; index of ps2 (gpio d) interrupt (define ps2_dat 0) ; PD.0 (define ps2_clk 1)) ; PD.1 p) ; PS/2 ISR part 1 (write '(define c1 '#(0 0 #xeb 0 #xF20F #x2EB8 #xF8DE #x3000 #xF403 #x4C70 #xF5BC #x4F20 #xBF5C #xF20F #xE6C #x46F7 #xF09C #xF00 #xBF04 #xF023 #x3FF #xF423 #x437F #xF20F #x2CA4 #xF8DC #xC000 #xA2A8 #x6812 #xF85C #x2002 #xF092 #xF00 #xBF01 #xEA4F #x3C13 #xF00C #xC0F #x2201 #xFA02 #xF20C #xBF08 #x4313 #xF503 #x5380 #xF20F #x2E68 #xF8CE #x3000 #xF20F #x2C70 #xF8DC #xC000 #xF44F #x6280 #xF042 #x21C #xF04F #x3FF #xF84C #x3002 #xF20F #xE08 #xF8DE #xF000 #x46C0 #xFFFD #xFFFF #xEA6F #x3 #xF04F #x2FF #xEA02 #x250 #xF003 #x437F #xF092 #xFF0 #xBF0C #xF043 #x6300 #xF092 #xFE0 #xBF04 #xF2AF #xE52 #x46F7 #xF092 #xFAA #xBF02 #x2300 #xF2AF #xE5E #x46F7 #xF092 #xF14 #xBF0C #xF04F #x7000 #xF04F #x6080 #xBF18 #xF092 #xF12 #xBF18 #xF092 #xF59 #xBF1C #xF20F #xE16 #x46F7 #xF013 #x6F00 #xBF14 #x4383 #x4303 #xF023 #x6300 #xF2AF #xE96 #x46F7 #xF013 #x6F00 #xBF1E #xF083 #x6300 #xF2AF #xEA6 #x46F7 #xF022 #x280 #xA04B #x5C82 #xF013 #x6FC0 #xBF04 #xF20F #x56 #x4687 #xF013 #x6F80 #xBF0C #x20E0 #x20A0 #x2A61 #xBF5E #x4382 #xF20F #x42 #x4687 #xF092 #xF27 #xBF02 #x2222 #xF20F #x32 #x4687 #xF092 #xF3D #xBF02 #x222B #xF20F #x26 #x4687 #x2A40 #xBF41 #x3A2C #xF002 #x20F #xA058 #x5C82 #xBF44 #xF20F #xE #x4687 #xF092 #xF60 #xBF0C #x227E #xF042 #x220 #xA058 #x6800 #xF092 #xF03 #xBF04 #xF20F #x28C #x4697 #xE92D #x10AC #x6801 #xF501 #x7180 #x6001 #xEA4F #x2111 #xF101 #x103 #x5442 #x4613 #xF003 #x3FF #xA54E #x682D #xF8D5 #xC004 #xF8DC #xC014 #xF10C #xC04 #xF20F)) p) ; PS/2 ISR part 2 (write '(define c2 (list->vector `(#xE04 #x46E7 #xF003 #x3FF #xF093 #xF08 #xBF1C #xF20F #xC3E #x46E7 #xF04F #x320 #xF8D5 #xC004 #xF8DC #xC014 #xF10C #xC04 #xF20F #xE02 #x46E7 #xF04F #x308 #xF8D5 #xC004 #xF8DC #xC014 #xF10C #xC04 #xF20F #xE04 #x46E7 #x6801 #xF5A1 #x7100 #x2953 #xBF48 #x2153 #x6001 #xE8BD #x10AC #xF8DC #x1000 #xF2AF #x1EA6 #x46F7 #xF04F #x253 #x6002 #xF20F #xEB8 #xF8CE #x3000 #xF20F #xCC0 #xF8DC #xC000 #xF44F #x6280 #xF042 #x21C #xF04F #x3FF #xF84C #x3002 #xF20F #xE9C #xF8DE #xE000 #x46F7 #xFFFF #xFFFF #xFFFF #xFFFF #xFFFF #xFFFF #x9FF #xFF60 #xFFFF #xFFFF #x71FF #xFF31 #xFFFF #x737A #x7761 #xFF32 #x63FF #x6478 #x3465 #xFF33 #x20FF #x6676 #x7274 #xFF35 #x6EFF #x6862 #x7967 #xFF36 #xFFFF #x6A6D #x3775 #xFF38 #x2CFF #x696B #x306F #xFF39 #x2EFF #x6C2F #x703B #xFF2D #xFFFF #xFF27 #x3D5B #xFFFF #xFFFF #x5D0D #x5CFF #xFFFF #xFFFF #xFFFF #xFFFF #xFF08 #x15FF #x11FF #xFF12 #xFFFF #x7FFF #xFF19 #x1810 #xFF1B #xFFFF #xFF14 #x13FF #xFFFF #x5F3C #x3F3E #x2129 #x2340 #x2524 #x265E #x282A #x3AFF #x0 #x0 #x0714 #x0 ,(logand #xffff (ash _RBF 2)) ,(logand #xffff (ash _RBF -14)) ,(logand #xffff (ash lcop 2)) ,(logand #xffff (ash lcop -14)) ,(logand #xffff (ash ps2_gpio 4)) ,(logand #xffff (ash ps2_gpio -12)) ,(ash 1 (+ ps2_dat 2)) #x0))) p) ; build and install ps/2 isr with echo on LCD ; uses isrbrk: at #x714 (write '(let ((c (make-vector (+ (vector-length c1) (vector-length c2)) 1))) (let loop ((n (- (vector-length c1) 1))) (if (< n 0) #t (begin (vector-set! c n (vector-ref c1 n)) (loop (- n 1))))) (let loop ((n (- (vector-length c2) 1))) (if (< n 0) #t (begin (vector-set! c (+ n (vector-length c1)) (vector-ref c2 n)) (loop (- n 1))))) (vector-set! _ISR ps2_isr (install c))) p) ; set pin functions to digital inputs, enable interrupts (write '(let ((ps2_pins (logior (ash 1 ps2_dat) (ash 1 ps2_clk)))) (LOS (ash 1 ps2_isr) sysc #x108) ; RCGC2 <- enable power for ps2_gpio (LMOS (lognot ps2_pins) 0 ps2_gpio #x420) ; GPIOAFSEL <- ps2_pins are gpio (LMOS (lognot ps2_pins) 0 ps2_gpio #x400) ; GPIODIR <- ps2_pins are input (write ps2_pins ps2_gpio #x51c) ; GPIODEN <- ps2_pins are digital enable (write (ash 1 ps2_clk) ps2_gpio #x40c) ; GPIOIEV <- CLOCK interrupts on rising edge (write #xff giod #x41c) ; GPIOICR <- clear current interrupts (write (ash 1 ps2_clk) ps2_gpio #x410) ; GPIOIM <- enable CLOCK interrupts (LOS (ash 1 ps2_isr) #xe000e10 0)) ; connect interrupt to VIC p) ; close the file (close-output-port p)