1*4882a593Smuzhiyun /*********************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * (C) Copyright 2004 4*4882a593Smuzhiyun * DENX Software Engineering 5*4882a593Smuzhiyun * Wolfgang Denk, wd@denx.de 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Keyboard driver 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun ***********************************************************************/ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <common.h> 12*4882a593Smuzhiyun #include <console.h> 13*4882a593Smuzhiyun #include <input.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <stdio_dev.h> 16*4882a593Smuzhiyun #include <keyboard.h> 17*4882a593Smuzhiyun #include <stdio_dev.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun static struct input_config config; 20*4882a593Smuzhiyun kbd_read_keys(struct input_config * config)21*4882a593Smuzhiyunstatic int kbd_read_keys(struct input_config *config) 22*4882a593Smuzhiyun { 23*4882a593Smuzhiyun #if defined(CONFIG_ARCH_MPC8540) || \ 24*4882a593Smuzhiyun defined(CONFIG_ARCH_MPC8541) || defined(CONFIG_ARCH_MPC8555) 25*4882a593Smuzhiyun /* no ISR is used, so received chars must be polled */ 26*4882a593Smuzhiyun ps2ser_check(); 27*4882a593Smuzhiyun #endif 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun return 1; 30*4882a593Smuzhiyun } 31*4882a593Smuzhiyun check_leds(int ret)32*4882a593Smuzhiyunstatic int check_leds(int ret) 33*4882a593Smuzhiyun { 34*4882a593Smuzhiyun int leds; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun leds = input_leds_changed(&config); 37*4882a593Smuzhiyun if (leds >= 0) 38*4882a593Smuzhiyun pckbd_leds(leds); 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun return ret; 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* test if a character is in the queue */ kbd_testc(struct stdio_dev * dev)44*4882a593Smuzhiyunstatic int kbd_testc(struct stdio_dev *dev) 45*4882a593Smuzhiyun { 46*4882a593Smuzhiyun return check_leds(input_tstc(&config)); 47*4882a593Smuzhiyun } 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* gets the character from the queue */ kbd_getc(struct stdio_dev * dev)50*4882a593Smuzhiyunstatic int kbd_getc(struct stdio_dev *dev) 51*4882a593Smuzhiyun { 52*4882a593Smuzhiyun return check_leds(input_getc(&config)); 53*4882a593Smuzhiyun } 54*4882a593Smuzhiyun handle_scancode(unsigned char scan_code)55*4882a593Smuzhiyunvoid handle_scancode(unsigned char scan_code) 56*4882a593Smuzhiyun { 57*4882a593Smuzhiyun bool release = false; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* Compare with i8042_kbd_check() in i8042.c if some logic is missing */ 60*4882a593Smuzhiyun if (scan_code & 0x80) { 61*4882a593Smuzhiyun scan_code &= 0x7f; 62*4882a593Smuzhiyun release = true; 63*4882a593Smuzhiyun } 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun input_add_keycode(&config, scan_code, release); 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* TODO: convert to driver model */ kbd_init(void)69*4882a593Smuzhiyunint kbd_init (void) 70*4882a593Smuzhiyun { 71*4882a593Smuzhiyun struct stdio_dev kbddev; 72*4882a593Smuzhiyun struct input_config *input = &config; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun if(kbd_init_hw()==-1) 75*4882a593Smuzhiyun return -1; 76*4882a593Smuzhiyun memset (&kbddev, 0, sizeof(kbddev)); 77*4882a593Smuzhiyun strcpy(kbddev.name, "kbd"); 78*4882a593Smuzhiyun kbddev.flags = DEV_FLAGS_INPUT; 79*4882a593Smuzhiyun kbddev.getc = kbd_getc; 80*4882a593Smuzhiyun kbddev.tstc = kbd_testc; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun input_init(input, 0); 83*4882a593Smuzhiyun input->read_keys = kbd_read_keys; 84*4882a593Smuzhiyun input_add_tables(input, true); 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun return input_stdio_register(&kbddev); 87*4882a593Smuzhiyun } 88