All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bin Meng <bmeng.cn@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 05/12] input: i8042: Convert to use the input library
Date: Thu, 12 Nov 2015 21:50:50 +0800	[thread overview]
Message-ID: <CAEUhbmXL=Zu+F9rb0Y6R-0E3bfRsF9P8GzAnO52sxf=JMjgX5w@mail.gmail.com> (raw)
In-Reply-To: <1447261548-14304-6-git-send-email-sjg@chromium.org>

On Thu, Nov 12, 2015 at 1:05 AM, Simon Glass <sjg@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@chromium.org>
> ---
>

Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>

> Changes in v3: None
> Changes in v2:
> - Convert two multi-line comments to single-line comments
> - Correct call to input_init()
>
>  drivers/input/i8042.c | 493 +++++++-------------------------------------------
>  1 file changed, 69 insertions(+), 424 deletions(-)
>
> diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c
> index b1ada86..270805b 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)
> @@ -566,11 +188,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");
> @@ -590,58 +251,42 @@ int i8042_kbd_init(void)
>                         return -1;
>         }
>
> -       kbd_mapping = keymap;
> -       kbd_flags   = NORMAL;
> -       kbd_state   = 0;
> -       kbd_led_set();
> +       ret = input_init(&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 */
> +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
> - */
> +/* i8042_getc - wait till keyboard input is available */
>  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));
>  }
> --
> 2.6.0.rc2.230.g3dd15c0
>

  reply	other threads:[~2015-11-12 13:50 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-11 17:05 [U-Boot] [PATCH v3 00/12] dm: input: Move keyboard drivers to driver model Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 01/12] input: Support the German keymap Simon Glass
2015-11-12  3:51   ` Bin Meng
2015-11-14  2:04     ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 02/12] input: Adjust structure of code in process_modifier() Simon Glass
2015-11-12 13:39   ` Bin Meng
2015-11-14  2:04     ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 03/12] input: Handle caps lock Simon Glass
2015-11-12 13:50   ` Bin Meng
2015-11-14  2:04     ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 04/12] input: Allow updating of keyboard LEDs Simon Glass
2015-11-12 13:50   ` Bin Meng
2015-11-14  2:04     ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 05/12] input: i8042: Convert to use the input library Simon Glass
2015-11-12 13:50   ` Bin Meng [this message]
2015-11-14  2:04     ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 06/12] input: Add a Kconfig option for the i8042 keyboard Simon Glass
2015-11-14  2:04   ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 07/12] x86: Add an i8042 device for boards that have it Simon Glass
2015-11-14  2:04   ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 08/12] Drop CONFIG_ISA_KEYBOARD Simon Glass
2015-11-14  2:04   ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 09/12] input: Convert i8042 to driver model Simon Glass
2015-11-12 13:50   ` Bin Meng
2015-11-14  2:04     ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 10/12] i8042: Handle a duplicate power-on-reset response Simon Glass
2015-11-14  2:04   ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 11/12] video: input: Clean up after i8042 conversion Simon Glass
2015-11-14  2:04   ` Simon Glass
2015-11-11 17:05 ` [U-Boot] [PATCH v3 12/12] input: Convert 'keyboard' driver to use input library Simon Glass
2015-11-14  2:04   ` Simon Glass
2015-11-11 21:56 ` [U-Boot] [PATCH v3 00/12] dm: input: Move keyboard drivers to driver model Simon Glass
2015-11-12  3:56   ` Bin Meng
2015-11-12 13:33     ` Bin Meng
2015-11-12 19:57       ` Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAEUhbmXL=Zu+F9rb0Y6R-0E3bfRsF9P8GzAnO52sxf=JMjgX5w@mail.gmail.com' \
    --to=bmeng.cn@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.