Skip to content
Snippets Groups Projects
  • Gabe Black's avatar
    ef94f7fa
    input: Use finer grain udelays while waitng for the i8042 keyboard buffer to empty · ef94f7fa
    Gabe Black authored
    
    On x86, the i8042 keyboard controller driver frequently waits for the keyboard
    input buffer to be empty to make sure the controller has had a chance to
    process the data it was given. The way the delay loop was structured, if the
    controller hadn't cleared the corresponding status bit immediately, it would
    wait 1ms before checking again. If the keyboard responded quickly but not
    instantly, the driver would still wait a full 1ms when perhaps 1us would have
    been sufficient. Because udelay is a busy wait anyway, this change decreases
    the delay between checks to 1us.
    
    Also, this change gets rid of a hardcoded 250ms delay.
    
    On Stumpy, this saves 100-150ms during boot.
    
    Signed-off-by: default avatarGabe Black <gabeblack@chromium.org>
    Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
    Signed-off-by: default avatarTom Rini <trini@ti.com>
    ef94f7fa
    History
    input: Use finer grain udelays while waitng for the i8042 keyboard buffer to empty
    Gabe Black authored
    
    On x86, the i8042 keyboard controller driver frequently waits for the keyboard
    input buffer to be empty to make sure the controller has had a chance to
    process the data it was given. The way the delay loop was structured, if the
    controller hadn't cleared the corresponding status bit immediately, it would
    wait 1ms before checking again. If the keyboard responded quickly but not
    instantly, the driver would still wait a full 1ms when perhaps 1us would have
    been sufficient. Because udelay is a busy wait anyway, this change decreases
    the delay between checks to 1us.
    
    Also, this change gets rid of a hardcoded 250ms delay.
    
    On Stumpy, this saves 100-150ms during boot.
    
    Signed-off-by: default avatarGabe Black <gabeblack@chromium.org>
    Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
    Signed-off-by: default avatarTom Rini <trini@ti.com>
i8042.h 2.95 KiB
/*
 * (C) Copyright 2002 ELTEC Elektronik AG
 * Frank Gottschling <fgottschling@eltec.de>
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

/* i8042.h - Intel 8042 keyboard driver header */

#ifndef _I8042_H_
#define _I8042_H_

#ifdef __I386__
#include <common.h>
#include <asm/io.h>
#define in8(p) inb(p)
#define out8(p,v) outb(v,p)
#endif

/* defines */

#define I8042_DATA_REG      (CONFIG_SYS_ISA_IO + 0x0060)    /* keyboard i/o buffer */
#define I8042_STATUS_REG    (CONFIG_SYS_ISA_IO + 0x0064)    /* keyboard status read */
#define I8042_COMMAND_REG   (CONFIG_SYS_ISA_IO + 0x0064)    /* keyboard ctrl write */

enum {
	/* Output register (I8042_DATA_REG) has data for system */
	I8042_STATUS_OUT_DATA	= 1 << 0,
	I8042_STATUS_IN_DATA	= 1 << 1,
};

#define KBD_US              0        /* default US layout */
#define KBD_GER             1        /* german layout */

#define KBD_TIMEOUT         1000     /* 1 sec */
#define KBD_RESET_TRIES     3

#define AS                  0        /* normal character index */
#define SH                  1        /* shift index */
#define CN                  2        /* control index */
#define NM                  3        /* numeric lock index */
#define AK                  4        /* right alt key */
#define CP                  5        /* capslock index */
#define ST                  6        /* stop output index */
#define EX                  7        /* extended code index */
#define ES                  8        /* escape and extended code index */

#define NORMAL              0x0000    /* normal key */
#define STP                 0x0001    /* scroll lock stop output*/
#define NUM                 0x0002    /* numeric lock */
#define CAPS                0x0004    /* capslock */
#define SHIFT               0x0008    /* shift */
#define CTRL                0x0010    /* control*/
#define EXT                 0x0020    /* extended scan code 0xe0 */
#define ESC                 0x0040    /* escape key press */
#define E1                  0x0080    /* extended scan code 0xe1 */
#define BRK                 0x0100    /* make break flag for keyboard */
#define ALT                 0x0200    /* right alt */

/* exports */

int i8042_kbd_init(void);
int i8042_tstc(void);
int i8042_getc(void);

#endif /* _I8042_H_ */