u-boot/include/input.h
Simon Glass c9cac4cdce input: Add a device pointer to the input config
The read_keys() method in input is passed a struct input_config. Add a
device pointer there so that we can find out the device that is referred
to with driver model.

Once all drivers are converted we can update the input structure to use
driver model instead.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
2015-11-19 20:13:40 -07:00

141 lines
3.9 KiB
C

/*
* Keyboard input helper functions (too small to be called a layer)
*
* Copyright (c) 2011 The Chromium OS Authors.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _INPUT_H
#define _INPUT_H
enum {
INPUT_MAX_MODIFIERS = 4,
INPUT_BUFFER_LEN = 16,
};
enum {
/* Keyboard LEDs */
INPUT_LED_SCROLL = 1 << 0,
INPUT_LED_CAPS = 1 << 1,
INPUT_LED_NUM = 1 << 2,
};
/*
* This table translates key codes to ASCII. Most of the entries are ASCII
* codes, but entries after KEY_FIRST_MOD indicate that this key is a
* modifier key, like shift, ctrl. KEY_FIRST_MOD + MOD_SHIFT is the shift
* key, for example.
*/
struct input_key_xlate {
/* keycode of the modifiers which select this table, -1 if none */
int left_keycode;
int right_keycode;
const uchar *xlate; /* keycode to ASCII table */
int num_entries; /* number of entries in this table */
};
struct input_config {
struct udevice *dev;
uchar fifo[INPUT_BUFFER_LEN];
int fifo_in, fifo_out;
/* Which modifiers are active (1 bit for each MOD_... value) */
uchar modifiers;
uchar flags; /* active state keys (FLAGS_...) */
uchar leds; /* active LEDS (INPUT_LED_...) */
uchar num_tables; /* number of modifier tables */
int prev_keycodes[INPUT_BUFFER_LEN]; /* keys held last time */
int num_prev_keycodes; /* number of prev keys */
struct input_key_xlate table[INPUT_MAX_MODIFIERS];
/**
* Function the input helper calls to scan the keyboard
*
* @param config Input state
* @return 0 if no keys read, otherwise number of keys read, or 1 if
* unknown
*/
int (*read_keys)(struct input_config *config);
unsigned int next_repeat_ms; /* Next time we repeat a key */
unsigned int repeat_delay_ms; /* Time before autorepeat starts */
unsigned int repeat_rate_ms; /* Autorepeat rate in ms */
};
struct stdio_dev;
/**
* Convert a list of key codes into ASCII and send them
*
* @param config Input state
* @param keycode List of key codes to examine
* @param num_keycodes Number of key codes
* @return number of ascii characters sent, or 0 if none, or -1 for an
* internal error
*/
int input_send_keycodes(struct input_config *config, int keycode[], int count);
/**
* Add a new key translation table to the input
*
* @param config Input state
* @param left_keycode Key to hold to get into this table
* @param right_keycode Another key to hold to get into this table
* @param xlate Conversion table from key codes to ASCII
* @param num_entries Number of entries in xlate table
*/
int input_add_table(struct input_config *config, int left_keycode,
int right_keycode, const uchar *xlate, int num_entries);
/**
* Test if keys are available to be read
*
* @param config Input state
* @return 0 if no keys available, 1 if keys are available
*/
int input_tstc(struct input_config *config);
/**
* Read a key
*
* TODO: U-Boot wants 0 for no key, but Ctrl-@ is a valid key...
*
* @param config Input state
* @return key, or 0 if no key, or -1 if error
*/
int input_getc(struct input_config *config);
/**
* Register a new device with stdio and switch to it if wanted
*
* @param dev Pointer to device
* @return 0 if ok, -1 on error
*/
int input_stdio_register(struct stdio_dev *dev);
/**
* Set up the keyboard autorepeat delays
*
* @param repeat_delay_ms Delay before key auto-repeat starts (in ms)
* @param repeat_rate_ms Delay between successive key repeats (in ms)
*/
void input_set_delays(struct input_config *config, int repeat_delay_ms,
int repeat_rate_ms);
/**
* Set up the input handler with basic key maps.
*
* @param config Input state
* @param leds Initial LED value (INPUT_LED_ mask), 0 suggested
* @return 0 if ok, -1 on error
*/
int input_init(struct input_config *config, int leds);
#ifdef CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
extern int overwrite_console(void);
#define OVERWRITE_CONSOLE overwrite_console()
#else
#define OVERWRITE_CONSOLE 0
#endif /* CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE */
#endif