xref: /OK3568_Linux_fs/u-boot/drivers/input/keyboard.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun void 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*4882a593Smuzhiyun int 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