* SUCH DAMAGE.
*/
+#include <libpayload-config.h>
#include <libpayload.h>
-#include <config.h>
#include <curses.h>
#define I8042_CMD_READ_MODE 0x20
#define I8042_MODE_XLATE 0x40
-static void (*reset_handler)(void) = NULL;
-
struct layout_maps {
- char *country;
- unsigned short map[4][0x57];
+ const char *country;
+ const unsigned short map[4][0x57];
};
-struct layout_maps *map;
+static struct layout_maps *map;
-struct layout_maps keyboard_layouts[] = {
+static struct layout_maps keyboard_layouts[] = {
#ifdef CONFIG_PC_KEYBOARD_LAYOUT_US
{ .country = "us", .map = {
{ /* No modifier */
while (inb(0x64) & 2);
}
-
int keyboard_havechar(void)
{
unsigned char c = inb(0x64);
- return c & 1;
+ return (c == 0xFF) ? 0 : c & 1;
}
unsigned char keyboard_get_scancode(void)
static int keyboard_wait_read(void)
{
- int timeout = 10000;
+ int retries = 10000;
- while(timeout-- && !(inb(0x64) & 0x01))
+ while(retries-- && !(inb(0x64) & 0x01))
udelay(50);
- return (timeout <= 0) ? -1 : 0;
+ return (retries <= 0) ? -1 : 0;
}
static int keyboard_wait_write(void)
{
- int timeout = 10000;
+ int retries = 10000;
- while(timeout-- && (inb(0x64) & 0x02))
+ while(retries-- && (inb(0x64) & 0x02))
udelay(50);
- return (timeout <= 0) ? -1 : 0;
+ return (retries <= 0) ? -1 : 0;
}
static unsigned char keyboard_get_mode(void)
/**
* Set keyboard layout
- * @param country string describing the keyboard layout language.
+ * @param country string describing the keyboard layout language.
* Valid values are "us", "de".
*/
return -1;
}
-int keyboard_add_reset_handler(void (*new_handler)(void))
-{
- reset_handler = new_handler;
-
- return 0;
-}
+static struct console_input_driver cons = {
+ .havekey = keyboard_havechar,
+ .getchar = keyboard_getchar
+};
void keyboard_init(void)
{
u8 mode;
map = &keyboard_layouts[0];
+ /* If 0x64 returns 0xff, then we have no keyboard
+ * controller */
+
+ if (inb(0x64) == 0xFF)
+ return;
+
/* Empty keyboard buffer */
while (keyboard_havechar()) keyboard_getchar();
/* Write the new mode */
keyboard_set_mode(mode);
+
+ console_add_input_driver(&cons);
}