/*
 * (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 */
