[U-Boot] [PATCH 22/28] input: i8042: Convert to use the input library

Bin Meng bmeng.cn at gmail.com
Tue Sep 15 08:12:34 CEST 2015


Hi Simon,

On Wed, Sep 9, 2015 at 12:32 PM, Simon Glass <sjg at chromium.org> wrote:
> At present the i8042 driver has its own logic and keymaps. In an effort to
> unify the code, move it over to use the input library. This changes most of
> the keycode-processing logic since it is now in that library. The main
> responsibilities of the driver are now to handle the LEDs, deal with the
> PS/2 extended keycodes and initialise the the keyboard.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>  drivers/input/i8042.c | 491 +++++++-------------------------------------------
>  1 file changed, 70 insertions(+), 421 deletions(-)
>
> diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c
> index 1c6a31e..5ebb571 100644
> --- a/drivers/input/i8042.c
> +++ b/drivers/input/i8042.c
> @@ -7,251 +7,18 @@
>
>  /* i8042.c - Intel 8042 keyboard driver routines */
>
> -/* includes */
> -
>  #include <common.h>
> -#include <asm/io.h>
>  #include <i8042.h>
> +#include <input.h>
> +#include <asm/io.h>
>
>  /* defines */
>  #define in8(p)         inb(p)
>  #define out8(p, v)     outb(v, p)
>
>  /* locals */
> -
> -static int kbd_input = -1;             /* no input yet */
> -static int kbd_mapping = KBD_US;       /* default US keyboard */
> -static int kbd_flags = NORMAL;         /* after reset */
> -static int kbd_state;                  /* unshift code */
> -
> -static unsigned char kbd_fct_map[144] = {
> -       /* kbd_fct_map table for scan code */
> -        0,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan 00-07 */
> -       AS,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan 08-0F */
> -       AS,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan 10-17 */
> -       AS,  AS,  AS,  AS,  AS,  CN,  AS,  AS, /* scan 18-1F */
> -       AS,  AS,  AS,  AS,  AS,  AS,  AS,  AS, /* scan 20-27 */
> -       AS,  AS,  SH,  AS,  AS,  AS,  AS,  AS, /* scan 28-2F */
> -       AS,  AS,  AS,  AS,  AS,  AS,  SH,  AS, /* scan 30-37 */
> -       AS,  AS,  CP,   0,   0,   0,   0,   0, /* scan 38-3F */
> -        0,   0,   0,   0,   0,  NM,  ST,  ES, /* scan 40-47 */
> -       ES,  ES,  ES,  ES,  ES,  ES,  ES,  ES, /* scan 48-4F */
> -       ES,  ES,  ES,  ES,   0,   0,  AS,   0, /* scan 50-57 */
> -        0,   0,   0,   0,   0,   0,   0,   0, /* scan 58-5F */
> -        0,   0,   0,   0,   0,   0,   0,   0, /* scan 60-67 */
> -        0,   0,   0,   0,   0,   0,   0,   0, /* scan 68-6F */
> -       AS,   0,   0,  AS,   0,   0,  AS,   0, /* scan 70-77 */
> -        0,  AS,   0,   0,   0,  AS,   0,   0, /* scan 78-7F */
> -       AS,  CN,  AS,  AS,  AK,  ST,  EX,  EX, /* enhanced */
> -       AS,  EX,  EX,  AS,  EX,  AS,  EX,  EX  /* enhanced */
> -       };
> -
> -static unsigned char kbd_key_map[2][5][144] = {
> -       { /* US keyboard */
> -       { /* unshift code */
> -          0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan 00-07 */
> -        '7',  '8',  '9',  '0',  '-',  '=', 0x08, '\t', /* scan 08-0F */
> -        'q',  'w',  'e',  'r',  't',  'y',  'u',  'i', /* scan 10-17 */
> -        'o',  'p',  '[',  ']', '\r',   CN,  'a',  's', /* scan 18-1F */
> -        'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';', /* scan 20-27 */
> -       '\'',  '`',   SH, '\\',  'z',  'x',  'c',  'v', /* scan 28-2F */
> -        'b',  'n',  'm',  ',',  '.',  '/',   SH,  '*', /* scan 30-37 */
> -        ' ',  ' ',   CP,    0,    0,    0,    0,    0, /* scan 38-3F */
> -          0,    0,    0,    0,    0,   NM,   ST,  '7', /* scan 40-47 */
> -        '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1', /* scan 48-4F */
> -        '2',  '3',  '0',  '.',    0,    0,    0,    0, /* scan 50-57 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 58-5F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 60-67 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 68-6F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 70-77 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 78-7F */
> -       '\r',   CN,  '/',  '*',  ' ',   ST,  'F',  'A', /* extended */
> -          0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
> -       },
> -       { /* shift code */
> -          0, 0x1b,  '!',  '@',  '#',  '$',  '%',  '^', /* scan 00-07 */
> -        '&',  '*',  '(',  ')',  '_',  '+', 0x08, '\t', /* scan 08-0F */
> -        'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I', /* scan 10-17 */
> -        'O',  'P',  '{',  '}', '\r',   CN,  'A',  'S', /* scan 18-1F */
> -        'D',  'F',  'G',  'H',  'J',  'K',  'L',  ':', /* scan 20-27 */
> -        '"',  '~',   SH,  '|',  'Z',  'X',  'C',  'V', /* scan 28-2F */
> -        'B',  'N',  'M',  '<',  '>',  '?',   SH,  '*', /* scan 30-37 */
> -        ' ',  ' ',   CP,    0,    0,    0,    0,    0, /* scan 38-3F */
> -          0,    0,    0,    0,    0,   NM,   ST,  '7', /* scan 40-47 */
> -        '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1', /* scan 48-4F */
> -        '2',  '3',  '0',  '.',    0,    0,    0,    0, /* scan 50-57 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 58-5F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 60-67 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 68-6F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 70-77 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 78-7F */
> -       '\r',   CN,  '/',  '*',  ' ',   ST,  'F',  'A', /* extended */
> -          0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
> -       },
> -       { /* control code */
> -       0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */
> -       0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan 08-0F */
> -       0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* scan 10-17 */
> -       0x0f, 0x10, 0x1b, 0x1d, '\r',   CN, 0x01, 0x13, /* scan 18-1F */
> -       0x04, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0xff, /* scan 20-27 */
> -       0xff, 0x1c,   SH, 0xff, 0x1a, 0x18, 0x03, 0x16, /* scan 28-2F */
> -       0x02, 0x0e, 0x0d, 0xff, 0xff, 0xff,   SH, 0xff, /* scan 30-37 */
> -       0xff, 0xff,   CP, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */
> -       0xff, 0xff, 0xff, 0xff, 0xff,   NM,   ST, 0xff, /* scan 40-47 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 50-57 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */
> -       '\r',   CN,  '/',  '*',  ' ',   ST, 0xff, 0xff, /* extended */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff  /* extended */
> -       },
> -       { /* non numeric code */
> -          0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan 00-07 */
> -        '7',  '8',  '9',  '0',  '-',  '=', 0x08, '\t', /* scan 08-0F */
> -        'q',  'w',  'e',  'r',  't',  'y',  'u',  'i', /* scan 10-17 */
> -        'o',  'p',  '[',  ']', '\r',   CN,  'a',  's', /* scan 18-1F */
> -        'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';', /* scan 20-27 */
> -       '\'',  '`',   SH, '\\',  'z',  'x',  'c',  'v', /* scan 28-2F */
> -        'b',  'n',  'm',  ',',  '.',  '/',   SH,  '*', /* scan 30-37 */
> -        ' ',  ' ',   CP,    0,    0,    0,    0,    0, /* scan 38-3F */
> -          0,    0,    0,    0,    0,   NM,   ST,  'w', /* scan 40-47 */
> -        'x',  'y',  'l',  't',  'u',  'v',  'm',  'q', /* scan 48-4F */
> -        'r',  's',  'p',  'n',    0,    0,    0,    0, /* scan 50-57 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 58-5F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 60-67 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 68-6F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 70-77 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 78-7F */
> -       '\r',   CN,  '/',  '*',  ' ',   ST,  'F',  'A', /* extended */
> -          0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
> -       },
> -       { /* right alt mode - not used in US keyboard */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 08-0F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10-17 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 18-1F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20-27 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28-2F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30-37 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40-47 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 50-57 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* extended */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff  /* extended */
> -       }
> -       },
> -       { /* German keyboard */
> -       { /* unshift code */
> -          0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan 00-07 */
> -        '7',  '8',  '9',  '0', 0xe1, '\'', 0x08, '\t', /* scan 08-0F */
> -        'q',  'w',  'e',  'r',  't',  'z',  'u',  'i', /* scan 10-17 */
> -        'o',  'p', 0x81,  '+', '\r',   CN,  'a',  's', /* scan 18-1F */
> -        'd',  'f',  'g',  'h',  'j',  'k',  'l', 0x94, /* scan 20-27 */
> -       0x84,  '^',   SH,  '#',  'y',  'x',  'c',  'v', /* scan 28-2F */
> -        'b',  'n',  'm',  ',',  '.',  '-',   SH,  '*', /* scan 30-37 */
> -        ' ',  ' ',   CP,    0,    0,    0,    0,    0, /* scan 38-3F */
> -          0,    0,    0,    0,    0,   NM,   ST,  '7', /* scan 40-47 */
> -        '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1', /* scan 48-4F */
> -        '2',  '3',  '0',  ',',    0,    0,  '<',    0, /* scan 50-57 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 58-5F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 60-67 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 68-6F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 70-77 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 78-7F */
> -       '\r',   CN,  '/',  '*',  ' ',   ST,  'F',  'A', /* extended */
> -          0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
> -       },
> -       { /* shift code */
> -          0, 0x1b,  '!',  '"', 0x15,  '$',  '%',  '&', /* scan 00-07 */
> -        '/',  '(',  ')',  '=',  '?',  '`', 0x08, '\t', /* scan 08-0F */
> -        'Q',  'W',  'E',  'R',  'T',  'Z',  'U',  'I', /* scan 10-17 */
> -        'O',  'P', 0x9a,  '*', '\r',   CN,  'A',  'S', /* scan 18-1F */
> -        'D',  'F',  'G',  'H',  'J',  'K',  'L', 0x99, /* scan 20-27 */
> -       0x8e, 0xf8,   SH, '\'',  'Y',  'X',  'C',  'V', /* scan 28-2F */
> -        'B',  'N',  'M',  ';',  ':',  '_',   SH,  '*', /* scan 30-37 */
> -        ' ',  ' ',   CP,    0,    0,    0,    0,    0, /* scan 38-3F */
> -          0,    0,    0,    0,    0,   NM,   ST,  '7', /* scan 40-47 */
> -        '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1', /* scan 48-4F */
> -        '2',  '3',  '0',  ',',    0,    0,  '>',    0, /* scan 50-57 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 58-5F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 60-67 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 68-6F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 70-77 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 78-7F */
> -       '\r',   CN,  '/',  '*',  ' ',   ST,  'F',  'A', /* extended */
> -          0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
> -       },
> -       { /* control code */
> -       0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */
> -       0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan 08-0F */
> -       0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* scan 10-17 */
> -       0x0f, 0x10, 0x1b, 0x1d, '\r',   CN, 0x01, 0x13, /* scan 18-1F */
> -       0x04, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0xff, /* scan 20-27 */
> -       0xff, 0x1c,   SH, 0xff, 0x1a, 0x18, 0x03, 0x16, /* scan 28-2F */
> -       0x02, 0x0e, 0x0d, 0xff, 0xff, 0xff,   SH, 0xff, /* scan 30-37 */
> -       0xff, 0xff,   CP, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */
> -       0xff, 0xff, 0xff, 0xff, 0xff,   NM,   ST, 0xff, /* scan 40-47 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 50-57 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */
> -       '\r',   CN,  '/',  '*',  ' ',   ST, 0xff, 0xff, /* extended */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff  /* extended */
> -       },
> -       { /* non numeric code */
> -          0, 0x1b,  '1',  '2',  '3',  '4',  '5',  '6', /* scan 00-07 */
> -        '7',  '8',  '9',  '0', 0xe1, '\'', 0x08, '\t', /* scan 08-0F */
> -        'q',  'w',  'e',  'r',  't',  'z',  'u',  'i', /* scan 10-17 */
> -        'o',  'p', 0x81,  '+', '\r',   CN,  'a',  's', /* scan 18-1F */
> -        'd',  'f',  'g',  'h',  'j',  'k',  'l', 0x94, /* scan 20-27 */
> -       0x84,  '^',   SH,    0,  'y',  'x',  'c',  'v', /* scan 28-2F */
> -        'b',  'n',  'm',  ',',  '.',  '-',   SH,  '*', /* scan 30-37 */
> -        ' ',  ' ',   CP,    0,    0,    0,    0,    0, /* scan 38-3F */
> -          0,    0,    0,    0,    0,   NM,   ST,  'w', /* scan 40-47 */
> -        'x',  'y',  'l',  't',  'u',  'v',  'm',  'q', /* scan 48-4F */
> -        'r',  's',  'p',  'n',    0,    0,  '<',    0, /* scan 50-57 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 58-5F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 60-67 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 68-6F */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 70-77 */
> -          0,    0,    0,    0,    0,    0,    0,    0, /* scan 78-7F */
> -       '\r',   CN,  '/',  '*',  ' ',   ST,  'F',  'A', /* extended */
> -          0,  'D',  'C',    0,  'B',    0,  '@',  'P'  /* extended */
> -       },
> -       { /* right alt mode - is used in German keyboard */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */
> -        '{',  '[',  ']',  '}', '\\', 0xff, 0xff, 0xff, /* scan 08-0F */
> -        '@', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10-17 */
> -       0xff, 0xff, 0xff,  '~', 0xff, 0xff, 0xff, 0xff, /* scan 18-1F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20-27 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28-2F */
> -       0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30-37 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40-47 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  '|', 0xff, /* scan 50-57 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* extended */
> -       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff  /* extended */
> -       }
> -       }
> -       };
> +static struct input_config config;
> +static bool extended;
>
>  static unsigned char ext_key_map[] = {
>         0x1c, /* keypad enter */
> @@ -293,157 +60,12 @@ static int kbd_output_full(void)
>         return kbd_timeout != -1;
>  }
>
> -static void kbd_led_set(void)
> +static void kbd_led_set(int flags)
>  {
>         kbd_input_empty();
>         out8(I8042_DATA_REG, CMD_SET_KBD_LED);
>         kbd_input_empty();
> -       out8(I8042_DATA_REG, (kbd_flags & 0x7));
> -}
> -
> -static void kbd_normal(unsigned char scan_code)
> -{
> -       unsigned char chr;
> -
> -       if ((kbd_flags & BRK) == NORMAL) {
> -               chr = kbd_key_map[kbd_mapping][kbd_state][scan_code];
> -               if ((chr == 0xff) || (chr == 0x00))
> -                       return;
> -
> -               /* if caps lock convert upper to lower */
> -               if (((kbd_flags & CAPS) == CAPS) &&
> -                   (chr >= 'a' && chr <= 'z')) {
> -                       chr -= 'a' - 'A';
> -               }
> -               kbd_input = chr;
> -       }
> -}
> -
> -static void kbd_shift(unsigned char scan_code)
> -{
> -       if ((kbd_flags & BRK) == BRK) {
> -               kbd_state = AS;
> -               kbd_flags &= (~SHIFT);
> -       } else {
> -               kbd_state = SH;
> -               kbd_flags |= SHIFT;
> -       }
> -}
> -
> -static void kbd_ctrl(unsigned char scan_code)
> -{
> -       if ((kbd_flags & BRK) == BRK) {
> -               kbd_state = AS;
> -               kbd_flags &= (~CTRL);
> -       } else {
> -               kbd_state = CN;
> -               kbd_flags |= CTRL;
> -       }
> -}
> -
> -static void kbd_num(unsigned char scan_code)
> -{
> -       if ((kbd_flags & BRK) == NORMAL) {
> -               kbd_flags ^= NUM;
> -               kbd_state = (kbd_flags & NUM) ? AS : NM;
> -               kbd_led_set();
> -       }
> -}
> -
> -static void kbd_alt(unsigned char scan_code)
> -{
> -       if ((kbd_flags & BRK) == BRK) {
> -               kbd_state = AS;
> -               kbd_flags &= (~ALT);
> -       } else {
> -               kbd_state = AK;
> -               kbd_flags &= ALT;
> -       }
> -}
> -
> -static void kbd_caps(unsigned char scan_code)
> -{
> -       if ((kbd_flags & BRK) == NORMAL) {
> -               kbd_flags ^= CAPS;
> -               kbd_led_set();
> -       }
> -}
> -
> -static void kbd_scroll(unsigned char scan_code)
> -{
> -       if ((kbd_flags & BRK) == NORMAL) {
> -               kbd_flags ^= STP;
> -               kbd_led_set();
> -               if (kbd_flags & STP)
> -                       kbd_input = 0x13;
> -               else
> -                       kbd_input = 0x11;
> -       }
> -}
> -
> -static void kbd_conv_char(unsigned char scan_code)
> -{
> -       if (scan_code == 0xe0) {
> -               kbd_flags |= EXT;
> -               return;
> -       }
> -
> -       /* if high bit of scan_code, set break flag */
> -       if (scan_code & 0x80)
> -               kbd_flags |=  BRK;
> -       else
> -               kbd_flags &= ~BRK;
> -
> -       if ((scan_code == 0xe1) || (kbd_flags & E1)) {
> -               if (scan_code == 0xe1) {
> -                       kbd_flags ^= BRK;       /* reset the break flag */
> -                       kbd_flags ^= E1;        /* bitwise EXOR with E1 flag */
> -               }
> -               return;
> -       }
> -
> -       scan_code &= 0x7f;
> -
> -       if (kbd_flags & EXT) {
> -               int i;
> -
> -               kbd_flags ^= EXT;
> -               for (i = 0; ext_key_map[i]; i++) {
> -                       if (ext_key_map[i] == scan_code) {
> -                               scan_code = 0x80 + i;
> -                               break;
> -                       }
> -               }
> -               /* not found ? */
> -               if (!ext_key_map[i])
> -                       return;
> -       }
> -
> -       switch (kbd_fct_map[scan_code]) {
> -       case AS:
> -               kbd_normal(scan_code);
> -               break;
> -       case SH:
> -               kbd_shift(scan_code);
> -               break;
> -       case CN:
> -               kbd_ctrl(scan_code);
> -               break;
> -       case NM:
> -               kbd_num(scan_code);
> -               break;
> -       case AK:
> -               kbd_alt(scan_code);
> -               break;
> -       case CP:
> -               kbd_caps(scan_code);
> -               break;
> -       case ST:
> -               kbd_scroll(scan_code);
> -               break;
> -       }
> -
> -       return;
> +       out8(I8042_DATA_REG, flags & 0x7);
>  }
>
>  static int kbd_write(int reg, int value)
> @@ -568,11 +190,50 @@ int i8042_disable(void)
>         return 0;
>  }
>
> +static int i8042_kbd_check(struct input_config *input)
> +{
> +       if ((in8(I8042_STS_REG) & STATUS_OBF) == 0) {
> +               return 0;
> +       } else {
> +               bool release = false;
> +               int scan_code;
> +               int i;
> +
> +               scan_code = in8(I8042_DATA_REG);
> +               if (scan_code == 0xfa) {
> +                       return 0;
> +               } else if (scan_code == 0xe0) {
> +                       extended = true;
> +                       return 0;
> +               }
> +               if (scan_code & 0x80) {
> +                       scan_code &= 0x7f;
> +                       release = true;
> +               }
> +               if (extended) {
> +                       extended = false;
> +                       for (i = 0; ext_key_map[i]; i++) {
> +                               if (ext_key_map[i] == scan_code) {
> +                                       scan_code = 0x60 + i;
> +                                       break;
> +                               }
> +                       }
> +                       /* not found ? */
> +                       if (!ext_key_map[i])
> +                               return 0;
> +               }
> +
> +               input_add_keycode(&config, scan_code, release);
> +               return 1;
> +       }
> +}
> +
>  /* i8042_kbd_init - reset keyboard and init state flags */
>  int i8042_kbd_init(void)
>  {
>         int keymap, try;
>         char *penv;
> +       int ret;
>
>         if (!kbd_controller_present() || board_i8042_skip()) {
>                 debug("i8042 keyboard controller is not present\n");
> @@ -592,58 +253,46 @@ int i8042_kbd_init(void)
>                         return -1;
>         }
>
> -       kbd_mapping = keymap;
> -       kbd_flags   = NORMAL;
> -       kbd_state   = 0;
> -       kbd_led_set();
> +       ret = input_init(&config, 0, keymap == KBD_GER);

I think this should be: input_add_tables(&config, keymap == KBD_GER).

> +       if (ret)
> +               return ret;
> +       config.read_keys = i8042_kbd_check;
> +       input_allow_repeats(&config, true);
> +
> +       kbd_led_set(NORMAL);
>
>         return 0;
>  }
>
> -/*
> - * i8042_tstc - test if keyboard input is available
> +/**
> + * check_leds() - Check the keyboard LEDs and update them it needed
>   *
> - * option: cursor blinking if called in a loop
> + * @ret:       Value to return
> + * @return value of @ret
>   */
> -int i8042_tstc(struct stdio_dev *dev)
> +static int check_leds(int ret)
>  {
> -       unsigned char scan_code = 0;
> +       int leds;
>
> -       if ((in8(I8042_STS_REG) & STATUS_OBF) == 0) {
> -               return 0;
> -       } else {
> -               scan_code = in8(I8042_DATA_REG);
> -               if (scan_code == 0xfa)
> -                       return 0;
> -
> -               kbd_conv_char(scan_code);
> +       leds = input_leds_changed(&config);
> +       if (leds >= 0)
> +               kbd_led_set(leds);
>
> -               if (kbd_input != -1)
> -                       return 1;
> -       }
> +       return ret;
> +}
>
> -       return 0;
> +/*
> + * i8042_tstc - test if keyboard input is available
> + */

Please use single line comment instead.

> +int i8042_tstc(struct stdio_dev *dev)
> +{
> +       return check_leds(input_tstc(&config));
>  }
>
>  /*
>   * i8042_getc - wait till keyboard input is available
> - *
> - * option: turn on/off cursor while waiting
>   */

Please use single line comment instead.

>  int i8042_getc(struct stdio_dev *dev)
>  {
> -       int ret_chr;
> -       unsigned char scan_code;
> -
> -       while (kbd_input == -1) {
> -               while ((in8(I8042_STS_REG) & STATUS_OBF) == 0) {
> -               }
> -               scan_code = in8(I8042_DATA_REG);
> -               if (scan_code != 0xfa)
> -                       kbd_conv_char(scan_code);
> -       }
> -       ret_chr = kbd_input;
> -       kbd_input = -1;
> -
> -       return ret_chr;
> +       return check_leds(input_getc(&config));
>  }
> --

With this commit (plus the input_add_tables fix above), i8042 LED does
not work any more on Intel Crown Bay. When pressing 'Caps Lock' or
'Num Lock', U-Boot just hangs.

Regards,
Bin


More information about the U-Boot mailing list