mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-04 14:00:19 +00:00 
			
		
		
		
	The console includes a global variable and several functions that are only used by a small subset of U-Boot files. Before adding more functions, move the definitions into their own header file. Signed-off-by: Simon Glass <sjg@chromium.org>
		
			
				
	
	
		
			88 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/***********************************************************************
 | 
						|
 *
 | 
						|
 * (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);
 | 
						|
}
 |