| /*********************************************************************** |
| * |
| * (C) Copyright 2004 |
| * DENX Software Engineering |
| * Wolfgang Denk, wd@denx.de |
| * |
| * Keyboard driver |
| * |
| ***********************************************************************/ |
| |
| #include <common.h> |
| #include <console.h> |
| #include <input.h> |
| |
| #include <stdio_dev.h> |
| #include <keyboard.h> |
| #include <stdio_dev.h> |
| |
| static struct input_config config; |
| |
| static int kbd_read_keys(struct input_config *config) |
| { |
| #if defined(CONFIG_MPC5xxx) || defined(CONFIG_MPC8540) || \ |
| defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555) |
| /* no ISR is used, so received chars must be polled */ |
| ps2ser_check(); |
| #endif |
| |
| return 1; |
| } |
| |
| static int check_leds(int ret) |
| { |
| int leds; |
| |
| leds = input_leds_changed(&config); |
| if (leds >= 0) |
| pckbd_leds(leds); |
| |
| return ret; |
| } |
| |
| /* test if a character is in the queue */ |
| static int kbd_testc(struct stdio_dev *dev) |
| { |
| return check_leds(input_tstc(&config)); |
| } |
| |
| /* gets the character from the queue */ |
| static int kbd_getc(struct stdio_dev *dev) |
| { |
| return check_leds(input_getc(&config)); |
| } |
| |
| void handle_scancode(unsigned char scan_code) |
| { |
| bool release = false; |
| |
| /* Compare with i8042_kbd_check() in i8042.c if some logic is missing */ |
| if (scan_code & 0x80) { |
| scan_code &= 0x7f; |
| release = true; |
| } |
| |
| input_add_keycode(&config, scan_code, release); |
| } |
| |
| /* TODO: convert to driver model */ |
| int kbd_init (void) |
| { |
| struct stdio_dev kbddev; |
| struct input_config *input = &config; |
| |
| if(kbd_init_hw()==-1) |
| return -1; |
| memset (&kbddev, 0, sizeof(kbddev)); |
| strcpy(kbddev.name, "kbd"); |
| kbddev.flags = DEV_FLAGS_INPUT; |
| kbddev.getc = kbd_getc; |
| kbddev.tstc = kbd_testc; |
| |
| input_init(input, 0); |
| input->read_keys = kbd_read_keys; |
| input_add_tables(input, true); |
| |
| return input_stdio_register(&kbddev); |
| } |