/*
 * (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.c - Intel 8042 keyboard driver routines */

/* includes */

#include <common.h>

#ifdef CONFIG_I8042_KBD

#ifdef CONFIG_USE_CPCIDVI
extern u8  gt_cpcidvi_in8(u32 offset);
extern void gt_cpcidvi_out8(u32 offset, u8 data);

#define in8(a)     gt_cpcidvi_in8(a)
#define out8(a, b) gt_cpcidvi_out8(a,b)
#endif

#include <i8042.h>

/* defines */

#ifdef CONFIG_CONSOLE_CURSOR
extern void console_cursor (int state);
static int blinkCount = CFG_CONSOLE_BLINK_COUNT;
static int cursor_state = 0;
#endif

/* 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    = 0;           /* unshift code */

static void kbd_conv_char (unsigned char scan_code);
static void kbd_led_set (void);
static void kbd_normal (unsigned char scan_code);
static void kbd_shift (unsigned char scan_code);
static void kbd_ctrl (unsigned char scan_code);
static void kbd_num (unsigned char scan_code);
static void kbd_caps (unsigned char scan_code);
static void kbd_scroll (unsigned char scan_code);
static void kbd_alt (unsigned char scan_code);
static int  kbd_input_empty (void);
static int  kbd_reset (void);

static unsigned char kbd_fct_map [144] =
    { /* kbd_fct_map table for scan code */
    0,   AS,   AS,   AS,   AS,   AS,   AS,   AS, /* scan  0- 7 */
   AS,   AS,   AS,   AS,   AS,   AS,   AS,   AS, /* scan  8- F */
   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  0- 7 */
  '7',   '8',   '9',   '0',   '-',   '=',  0x08,  '\t',    /* scan  8- F */
  '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  0- 7 */
  '&',   '*',   '(',   ')',   '_',   '+',  0x08,  '\t',    /* scan  8- F */
  '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  0- 7 */
 0x1e,  0xff,  0xff,  0xff,  0x1f,  0xff,  0xff,  '\t',    /* scan  8- F */
 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  0- 7 */
  '7',   '8',   '9',   '0',   '-',   '=',  0x08,  '\t',    /* scan  8- F */
  '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  0 - 7 */
 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, /* scan  8 - F */
 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  0- 7 */
  '7',   '8',   '9',   '0',  0xe1,  '\'',  0x08,  '\t', /* scan  8- F */
  '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  0- 7 */
  '/',   '(',   ')',   '=',   '?',   '`',  0x08,  '\t', /* scan  8- F */
  '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  0- 7 */
 0x1e,  0xff,  0xff,  0xff,  0x1f,  0xff,  0xff,  '\t', /* scan  8- F */
 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  0- 7 */
  '7',   '8',   '9',   '0',  0xe1,  '\'',  0x08,  '\t', /* scan  8- F */
  '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  0 - 7 */
  '{',   '[',   ']',   '}',  '\\',  0xff,  0xff,  0xff, /* scan  8 - F */
  '@',  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 unsigned char ext_key_map [] =
    {
    0x1c,   /* keypad enter */
    0x1d,   /* right control */
    0x35,   /* keypad slash */
    0x37,   /* print screen */
    0x38,   /* right alt */
    0x46,   /* break */
    0x47,   /* editpad home */
    0x48,   /* editpad up */
    0x49,   /* editpad pgup */
    0x4b,   /* editpad left */
    0x4d,   /* editpad right */
    0x4f,   /* editpad end */
    0x50,   /* editpad dn */
    0x51,   /* editpad pgdn */
    0x52,   /* editpad ins */
    0x53,   /* editpad del */
    0x00    /* map end */
    };

/*******************************************************************************
 *
 * i8042_kbd_init - reset keyboard and init state flags
 */
int i8042_kbd_init (void)
{
    int keymap, try;
    char *penv;

#ifdef CONFIG_USE_CPCIDVI
    if ((penv = getenv ("console")) != NULL) {
            if (strncmp (penv, "serial", 7) == 0) {
	            return -1;
	    }
    }
#endif
    /* Init keyboard device (default US layout) */
    keymap = KBD_US;
    if ((penv = getenv ("keymap")) != NULL)
    {
	if (strncmp (penv, "de", 3) == 0)
	keymap = KBD_GER;
    }

    for (try = 0; try < KBD_RESET_TRIES; try++)
    {
	if (kbd_reset() == 0)
	{
	    kbd_mapping   = keymap;
	    kbd_flags     = NORMAL;
	    kbd_state     = 0;
	    kbd_led_set();
	    return 0;
	    }
    }
    return -1;
}


/*******************************************************************************
 *
 * i8042_tstc - test if keyboard input is available
 *              option: cursor blinking if called in a loop
 */
int i8042_tstc (void)
{
    unsigned char scan_code = 0;

#ifdef CONFIG_CONSOLE_CURSOR
    if (--blinkCount == 0)
    {
	cursor_state ^= 1;
	console_cursor (cursor_state);
	blinkCount = CFG_CONSOLE_BLINK_COUNT;
	udelay (10);
    }
#endif

    if ((in8 (I8042_STATUS_REG) & 0x01) == 0)
	return 0;
    else
    {
	scan_code = in8 (I8042_DATA_REG);
	if (scan_code == 0xfa)
	    return 0;

	kbd_conv_char(scan_code);

	if (kbd_input != -1)
	    return 1;
    }
    return 0;
}


/*******************************************************************************
 *
 * i8042_getc - wait till keyboard input is available
 *              option: turn on/off cursor while waiting
 */
int i8042_getc (void)
{
    int ret_chr;
    unsigned char scan_code;

    while (kbd_input == -1)
    {
	while ((in8 (I8042_STATUS_REG) & 0x01) == 0)
	{
#ifdef CONFIG_CONSOLE_CURSOR
	    if (--blinkCount==0)
	    {
		cursor_state ^= 1;
		console_cursor (cursor_state);
		blinkCount = CFG_CONSOLE_BLINK_COUNT;
	    }
	    udelay (10);
#endif
	}

	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;
}


/******************************************************************************/

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 CP:  kbd_caps (scan_code);
	break;
    case ST:  kbd_scroll (scan_code);
	break;
    case AK:  kbd_alt (scan_code);
	break;
    }
    return;
}


/******************************************************************************/

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_caps (unsigned char scan_code)
{
    if ((kbd_flags & BRK) == NORMAL)
    {
       kbd_flags ^= CAPS;
       kbd_led_set ();            /* update keyboard LED */
    }
}


/******************************************************************************/

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 ();            /* update keyboard LED */
    }
}


/******************************************************************************/

static void kbd_scroll (unsigned char scan_code)
{
    if ((kbd_flags & BRK) == NORMAL)
    {
	kbd_flags ^= STP;
	kbd_led_set ();            /* update keyboard LED */
	if (kbd_flags & STP)
	    kbd_input = 0x13;
	else
	    kbd_input = 0x11;
    }
}

/******************************************************************************/

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_led_set (void)
{
    kbd_input_empty();
    out8 (I8042_DATA_REG, 0xed);        /* SET LED command */
    kbd_input_empty();
    out8 (I8042_DATA_REG, (kbd_flags & 0x7));    /* LED bits only */
}


/******************************************************************************/

static int kbd_input_empty (void)
{
    int kbdTimeout = KBD_TIMEOUT;

    /* wait for input buf empty */
    while ((in8 (I8042_STATUS_REG) & 0x02) && kbdTimeout--)
	udelay(1000);

    return kbdTimeout;
}

/******************************************************************************/

static int kbd_reset (void)
{
    if (kbd_input_empty() == 0)
	return -1;

    out8 (I8042_DATA_REG, 0xff);

    udelay(250000);

    if (kbd_input_empty() == 0)
	return -1;

#ifdef CONFIG_USE_CPCIDVI
    out8 (I8042_COMMAND_REG, 0x60);
#else
    out8 (I8042_DATA_REG, 0x60);
#endif

    if (kbd_input_empty() == 0)
	return -1;

    out8 (I8042_DATA_REG, 0x45);


    if (kbd_input_empty() == 0)
	return -1;

    out8 (I8042_COMMAND_REG, 0xae);

    if (kbd_input_empty() == 0)
	return -1;

    return 0;
}

#endif /* CONFIG_I8042_KBD */
