1*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* 2*16b195c8SJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2002 ELTEC Elektronik AG 3*16b195c8SJean-Christophe PLAGNIOL-VILLARD * Frank Gottschling <fgottschling@eltec.de> 4*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 5*16b195c8SJean-Christophe PLAGNIOL-VILLARD * See file CREDITS for list of people who contributed to this 6*16b195c8SJean-Christophe PLAGNIOL-VILLARD * project. 7*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 8*16b195c8SJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or 9*16b195c8SJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as 10*16b195c8SJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of 11*16b195c8SJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version. 12*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 13*16b195c8SJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 14*16b195c8SJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 15*16b195c8SJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*16b195c8SJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 17*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 18*16b195c8SJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 19*16b195c8SJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 20*16b195c8SJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21*16b195c8SJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA 22*16b195c8SJean-Christophe PLAGNIOL-VILLARD */ 23*16b195c8SJean-Christophe PLAGNIOL-VILLARD 24*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* i8042.c - Intel 8042 keyboard driver routines */ 25*16b195c8SJean-Christophe PLAGNIOL-VILLARD 26*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* includes */ 27*16b195c8SJean-Christophe PLAGNIOL-VILLARD 28*16b195c8SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 29*16b195c8SJean-Christophe PLAGNIOL-VILLARD 30*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_I8042_KBD 31*16b195c8SJean-Christophe PLAGNIOL-VILLARD 32*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_USE_CPCIDVI 33*16b195c8SJean-Christophe PLAGNIOL-VILLARD extern u8 gt_cpcidvi_in8(u32 offset); 34*16b195c8SJean-Christophe PLAGNIOL-VILLARD extern void gt_cpcidvi_out8(u32 offset, u8 data); 35*16b195c8SJean-Christophe PLAGNIOL-VILLARD 36*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define in8(a) gt_cpcidvi_in8(a) 37*16b195c8SJean-Christophe PLAGNIOL-VILLARD #define out8(a, b) gt_cpcidvi_out8(a,b) 38*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 39*16b195c8SJean-Christophe PLAGNIOL-VILLARD 40*16b195c8SJean-Christophe PLAGNIOL-VILLARD #include <i8042.h> 41*16b195c8SJean-Christophe PLAGNIOL-VILLARD 42*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* defines */ 43*16b195c8SJean-Christophe PLAGNIOL-VILLARD 44*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 45*16b195c8SJean-Christophe PLAGNIOL-VILLARD extern void console_cursor (int state); 46*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int blinkCount = CFG_CONSOLE_BLINK_COUNT; 47*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int cursor_state = 0; 48*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 49*16b195c8SJean-Christophe PLAGNIOL-VILLARD 50*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* locals */ 51*16b195c8SJean-Christophe PLAGNIOL-VILLARD 52*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_input = -1; /* no input yet */ 53*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_mapping = KBD_US; /* default US keyboard */ 54*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_flags = NORMAL; /* after reset */ 55*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_state = 0; /* unshift code */ 56*16b195c8SJean-Christophe PLAGNIOL-VILLARD 57*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_conv_char (unsigned char scan_code); 58*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_led_set (void); 59*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_normal (unsigned char scan_code); 60*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_shift (unsigned char scan_code); 61*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_ctrl (unsigned char scan_code); 62*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_num (unsigned char scan_code); 63*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_caps (unsigned char scan_code); 64*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_scroll (unsigned char scan_code); 65*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_alt (unsigned char scan_code); 66*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_input_empty (void); 67*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_reset (void); 68*16b195c8SJean-Christophe PLAGNIOL-VILLARD 69*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char kbd_fct_map [144] = 70*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* kbd_fct_map table for scan code */ 71*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, AS, AS, AS, AS, AS, AS, AS, /* scan 0- 7 */ 72*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, AS, AS, AS, AS, AS, AS, AS, /* scan 8- F */ 73*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, AS, AS, AS, AS, AS, AS, AS, /* scan 10-17 */ 74*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, AS, AS, AS, AS, CN, AS, AS, /* scan 18-1F */ 75*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, AS, AS, AS, AS, AS, AS, AS, /* scan 20-27 */ 76*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, AS, SH, AS, AS, AS, AS, AS, /* scan 28-2F */ 77*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, AS, AS, AS, AS, AS, SH, AS, /* scan 30-37 */ 78*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, AS, CP, 0, 0, 0, 0, 0, /* scan 38-3F */ 79*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, NM, ST, ES, /* scan 40-47 */ 80*16b195c8SJean-Christophe PLAGNIOL-VILLARD ES, ES, ES, ES, ES, ES, ES, ES, /* scan 48-4F */ 81*16b195c8SJean-Christophe PLAGNIOL-VILLARD ES, ES, ES, ES, 0, 0, AS, 0, /* scan 50-57 */ 82*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 58-5F */ 83*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 60-67 */ 84*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 68-6F */ 85*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, 0, 0, AS, 0, 0, AS, 0, /* scan 70-77 */ 86*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, AS, 0, 0, 0, AS, 0, 0, /* scan 78-7F */ 87*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, CN, AS, AS, AK, ST, EX, EX, /* enhanced */ 88*16b195c8SJean-Christophe PLAGNIOL-VILLARD AS, EX, EX, AS, EX, AS, EX, EX /* enhanced */ 89*16b195c8SJean-Christophe PLAGNIOL-VILLARD }; 90*16b195c8SJean-Christophe PLAGNIOL-VILLARD 91*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char kbd_key_map [2][5][144] = 92*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 93*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* US keyboard */ 94*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* unshift code */ 95*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0x1b, '1', '2', '3', '4', '5', '6', /* scan 0- 7 */ 96*16b195c8SJean-Christophe PLAGNIOL-VILLARD '7', '8', '9', '0', '-', '=', 0x08, '\t', /* scan 8- F */ 97*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', /* scan 10-17 */ 98*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'o', 'p', '[', ']', '\r', CN, 'a', 's', /* scan 18-1F */ 99*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* scan 20-27 */ 100*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\'', '`', SH, '\\', 'z', 'x', 'c', 'v', /* scan 28-2F */ 101*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'b', 'n', 'm', ',', '.', '/', SH, '*', /* scan 30-37 */ 102*16b195c8SJean-Christophe PLAGNIOL-VILLARD ' ', ' ', CP, 0, 0, 0, 0, 0, /* scan 38-3F */ 103*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, NM, ST, '7', /* scan 40-47 */ 104*16b195c8SJean-Christophe PLAGNIOL-VILLARD '8', '9', '-', '4', '5', '6', '+', '1', /* scan 48-4F */ 105*16b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', '.', 0, 0, 0, 0, /* scan 50-57 */ 106*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 58-5F */ 107*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 60-67 */ 108*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 68-6F */ 109*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 70-77 */ 110*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 78-7F */ 111*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r', CN, '/', '*', ' ', ST, 'F', 'A', /* extended */ 112*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 'D', 'C', 0, 'B', 0, '@', 'P' /* extended */ 113*16b195c8SJean-Christophe PLAGNIOL-VILLARD }, 114*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* shift code */ 115*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0x1b, '!', '@', '#', '$', '%', '^', /* scan 0- 7 */ 116*16b195c8SJean-Christophe PLAGNIOL-VILLARD '&', '*', '(', ')', '_', '+', 0x08, '\t', /* scan 8- F */ 117*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', /* scan 10-17 */ 118*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'O', 'P', '{', '}', '\r', CN, 'A', 'S', /* scan 18-1F */ 119*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', /* scan 20-27 */ 120*16b195c8SJean-Christophe PLAGNIOL-VILLARD '"', '~', SH, '|', 'Z', 'X', 'C', 'V', /* scan 28-2F */ 121*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'B', 'N', 'M', '<', '>', '?', SH, '*', /* scan 30-37 */ 122*16b195c8SJean-Christophe PLAGNIOL-VILLARD ' ', ' ', CP, 0, 0, 0, 0, 0, /* scan 38-3F */ 123*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, NM, ST, '7', /* scan 40-47 */ 124*16b195c8SJean-Christophe PLAGNIOL-VILLARD '8', '9', '-', '4', '5', '6', '+', '1', /* scan 48-4F */ 125*16b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', '.', 0, 0, 0, 0, /* scan 50-57 */ 126*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 58-5F */ 127*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 60-67 */ 128*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 68-6F */ 129*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 70-77 */ 130*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 78-7F */ 131*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r', CN, '/', '*', ' ', ST, 'F', 'A', /* extended */ 132*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 'D', 'C', 0, 'B', 0, '@', 'P' /* extended */ 133*16b195c8SJean-Christophe PLAGNIOL-VILLARD }, 134*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* control code */ 135*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan 0- 7 */ 136*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan 8- F */ 137*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* scan 10-17 */ 138*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x0f, 0x10, 0x1b, 0x1d, '\r', CN, 0x01, 0x13, /* scan 18-1F */ 139*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x04, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0xff, /* scan 20-27 */ 140*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0x1c, SH, 0xff, 0x1a, 0x18, 0x03, 0x16, /* scan 28-2F */ 141*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x02, 0x0e, 0x0d, 0xff, 0xff, 0xff, SH, 0xff, /* scan 30-37 */ 142*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, CP, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */ 143*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, NM, ST, 0xff, /* scan 40-47 */ 144*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */ 145*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 50-57 */ 146*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */ 147*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */ 148*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */ 149*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */ 150*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */ 151*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r', CN, '/', '*', ' ', ST, 0xff, 0xff, /* extended */ 152*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff /* extended */ 153*16b195c8SJean-Christophe PLAGNIOL-VILLARD }, 154*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* non numeric code */ 155*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0x1b, '1', '2', '3', '4', '5', '6', /* scan 0- 7 */ 156*16b195c8SJean-Christophe PLAGNIOL-VILLARD '7', '8', '9', '0', '-', '=', 0x08, '\t', /* scan 8- F */ 157*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', /* scan 10-17 */ 158*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'o', 'p', '[', ']', '\r', CN, 'a', 's', /* scan 18-1F */ 159*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* scan 20-27 */ 160*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\'', '`', SH, '\\', 'z', 'x', 'c', 'v', /* scan 28-2F */ 161*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'b', 'n', 'm', ',', '.', '/', SH, '*', /* scan 30-37 */ 162*16b195c8SJean-Christophe PLAGNIOL-VILLARD ' ', ' ', CP, 0, 0, 0, 0, 0, /* scan 38-3F */ 163*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, NM, ST, 'w', /* scan 40-47 */ 164*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'x', 'y', 'l', 't', 'u', 'v', 'm', 'q', /* scan 48-4F */ 165*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'r', 's', 'p', 'n', 0, 0, 0, 0, /* scan 50-57 */ 166*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 58-5F */ 167*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 60-67 */ 168*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 68-6F */ 169*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 70-77 */ 170*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 78-7F */ 171*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r', CN, '/', '*', ' ', ST, 'F', 'A', /* extended */ 172*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 'D', 'C', 0, 'B', 0, '@', 'P' /* extended */ 173*16b195c8SJean-Christophe PLAGNIOL-VILLARD }, 174*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* right alt mode - not used in US keyboard */ 175*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 0 - 7 */ 176*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 8 - F */ 177*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10 -17 */ 178*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 18 -1F */ 179*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20 -27 */ 180*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28 -2F */ 181*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30 -37 */ 182*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38 -3F */ 183*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40 -47 */ 184*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48 -4F */ 185*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 50 -57 */ 186*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58 -5F */ 187*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60 -67 */ 188*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68 -6F */ 189*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70 -77 */ 190*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78 -7F */ 191*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* extended */ 192*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff /* extended */ 193*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 194*16b195c8SJean-Christophe PLAGNIOL-VILLARD }, 195*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* german keyboard */ 196*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* unshift code */ 197*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0x1b, '1', '2', '3', '4', '5', '6', /* scan 0- 7 */ 198*16b195c8SJean-Christophe PLAGNIOL-VILLARD '7', '8', '9', '0', 0xe1, '\'', 0x08, '\t', /* scan 8- F */ 199*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', /* scan 10-17 */ 200*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'o', 'p', 0x81, '+', '\r', CN, 'a', 's', /* scan 18-1F */ 201*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0x94, /* scan 20-27 */ 202*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x84, '^', SH, '#', 'y', 'x', 'c', 'v', /* scan 28-2F */ 203*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'b', 'n', 'm', ',', '.', '-', SH, '*', /* scan 30-37 */ 204*16b195c8SJean-Christophe PLAGNIOL-VILLARD ' ', ' ', CP, 0, 0, 0, 0, 0, /* scan 38-3F */ 205*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, NM, ST, '7', /* scan 40-47 */ 206*16b195c8SJean-Christophe PLAGNIOL-VILLARD '8', '9', '-', '4', '5', '6', '+', '1', /* scan 48-4F */ 207*16b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', ',', 0, 0, '<', 0, /* scan 50-57 */ 208*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 58-5F */ 209*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 60-67 */ 210*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 68-6F */ 211*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 70-77 */ 212*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 78-7F */ 213*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r', CN, '/', '*', ' ', ST, 'F', 'A', /* extended */ 214*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 'D', 'C', 0, 'B', 0, '@', 'P' /* extended */ 215*16b195c8SJean-Christophe PLAGNIOL-VILLARD }, 216*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* shift code */ 217*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0x1b, '!', '"', 0x15, '$', '%', '&', /* scan 0- 7 */ 218*16b195c8SJean-Christophe PLAGNIOL-VILLARD '/', '(', ')', '=', '?', '`', 0x08, '\t', /* scan 8- F */ 219*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', /* scan 10-17 */ 220*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'O', 'P', 0x9a, '*', '\r', CN, 'A', 'S', /* scan 18-1F */ 221*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'D', 'F', 'G', 'H', 'J', 'K', 'L', 0x99, /* scan 20-27 */ 222*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x8e, 0xf8, SH, '\'', 'Y', 'X', 'C', 'V', /* scan 28-2F */ 223*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'B', 'N', 'M', ';', ':', '_', SH, '*', /* scan 30-37 */ 224*16b195c8SJean-Christophe PLAGNIOL-VILLARD ' ', ' ', CP, 0, 0, 0, 0, 0, /* scan 38-3F */ 225*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, NM, ST, '7', /* scan 40-47 */ 226*16b195c8SJean-Christophe PLAGNIOL-VILLARD '8', '9', '-', '4', '5', '6', '+', '1', /* scan 48-4F */ 227*16b195c8SJean-Christophe PLAGNIOL-VILLARD '2', '3', '0', ',', 0, 0, '>', 0, /* scan 50-57 */ 228*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 58-5F */ 229*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 60-67 */ 230*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 68-6F */ 231*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 70-77 */ 232*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 78-7F */ 233*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r', CN, '/', '*', ' ', ST, 'F', 'A', /* extended */ 234*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 'D', 'C', 0, 'B', 0, '@', 'P' /* extended */ 235*16b195c8SJean-Christophe PLAGNIOL-VILLARD }, 236*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* control code */ 237*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan 0- 7 */ 238*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan 8- F */ 239*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* scan 10-17 */ 240*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x0f, 0x10, 0x1b, 0x1d, '\r', CN, 0x01, 0x13, /* scan 18-1F */ 241*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x04, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0xff, /* scan 20-27 */ 242*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0x1c, SH, 0xff, 0x1a, 0x18, 0x03, 0x16, /* scan 28-2F */ 243*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x02, 0x0e, 0x0d, 0xff, 0xff, 0xff, SH, 0xff, /* scan 30-37 */ 244*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, CP, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */ 245*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, NM, ST, 0xff, /* scan 40-47 */ 246*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */ 247*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 50-57 */ 248*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */ 249*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */ 250*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */ 251*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */ 252*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */ 253*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r', CN, '/', '*', ' ', ST, 0xff, 0xff, /* extended */ 254*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff /* extended */ 255*16b195c8SJean-Christophe PLAGNIOL-VILLARD }, 256*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* non numeric code */ 257*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0x1b, '1', '2', '3', '4', '5', '6', /* scan 0- 7 */ 258*16b195c8SJean-Christophe PLAGNIOL-VILLARD '7', '8', '9', '0', 0xe1, '\'', 0x08, '\t', /* scan 8- F */ 259*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', /* scan 10-17 */ 260*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'o', 'p', 0x81, '+', '\r', CN, 'a', 's', /* scan 18-1F */ 261*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0x94, /* scan 20-27 */ 262*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x84, '^', SH, 0, 'y', 'x', 'c', 'v', /* scan 28-2F */ 263*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'b', 'n', 'm', ',', '.', '-', SH, '*', /* scan 30-37 */ 264*16b195c8SJean-Christophe PLAGNIOL-VILLARD ' ', ' ', CP, 0, 0, 0, 0, 0, /* scan 38-3F */ 265*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, NM, ST, 'w', /* scan 40-47 */ 266*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'x', 'y', 'l', 't', 'u', 'v', 'm', 'q', /* scan 48-4F */ 267*16b195c8SJean-Christophe PLAGNIOL-VILLARD 'r', 's', 'p', 'n', 0, 0, '<', 0, /* scan 50-57 */ 268*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 58-5F */ 269*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 60-67 */ 270*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 68-6F */ 271*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 70-77 */ 272*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 0, 0, 0, 0, 0, 0, 0, /* scan 78-7F */ 273*16b195c8SJean-Christophe PLAGNIOL-VILLARD '\r', CN, '/', '*', ' ', ST, 'F', 'A', /* extended */ 274*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0, 'D', 'C', 0, 'B', 0, '@', 'P' /* extended */ 275*16b195c8SJean-Christophe PLAGNIOL-VILLARD }, 276*16b195c8SJean-Christophe PLAGNIOL-VILLARD { /* Right alt mode - is used in German keyboard */ 277*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 0 - 7 */ 278*16b195c8SJean-Christophe PLAGNIOL-VILLARD '{', '[', ']', '}', '\\', 0xff, 0xff, 0xff, /* scan 8 - F */ 279*16b195c8SJean-Christophe PLAGNIOL-VILLARD '@', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10 -17 */ 280*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, '~', 0xff, 0xff, 0xff, 0xff, /* scan 18 -1F */ 281*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20 -27 */ 282*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28 -2F */ 283*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30 -37 */ 284*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38 -3F */ 285*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40 -47 */ 286*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48 -4F */ 287*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, '|', 0xff, /* scan 50 -57 */ 288*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58 -5F */ 289*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60 -67 */ 290*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68 -6F */ 291*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70 -77 */ 292*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78 -7F */ 293*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* extended */ 294*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff /* extended */ 295*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 296*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 297*16b195c8SJean-Christophe PLAGNIOL-VILLARD }; 298*16b195c8SJean-Christophe PLAGNIOL-VILLARD 299*16b195c8SJean-Christophe PLAGNIOL-VILLARD static unsigned char ext_key_map [] = 300*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 301*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x1c, /* keypad enter */ 302*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x1d, /* right control */ 303*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x35, /* keypad slash */ 304*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x37, /* print screen */ 305*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x38, /* right alt */ 306*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x46, /* break */ 307*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x47, /* editpad home */ 308*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x48, /* editpad up */ 309*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x49, /* editpad pgup */ 310*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x4b, /* editpad left */ 311*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x4d, /* editpad right */ 312*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x4f, /* editpad end */ 313*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x50, /* editpad dn */ 314*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x51, /* editpad pgdn */ 315*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x52, /* editpad ins */ 316*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x53, /* editpad del */ 317*16b195c8SJean-Christophe PLAGNIOL-VILLARD 0x00 /* map end */ 318*16b195c8SJean-Christophe PLAGNIOL-VILLARD }; 319*16b195c8SJean-Christophe PLAGNIOL-VILLARD 320*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************* 321*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 322*16b195c8SJean-Christophe PLAGNIOL-VILLARD * i8042_kbd_init - reset keyboard and init state flags 323*16b195c8SJean-Christophe PLAGNIOL-VILLARD */ 324*16b195c8SJean-Christophe PLAGNIOL-VILLARD int i8042_kbd_init (void) 325*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 326*16b195c8SJean-Christophe PLAGNIOL-VILLARD int keymap, try; 327*16b195c8SJean-Christophe PLAGNIOL-VILLARD char *penv; 328*16b195c8SJean-Christophe PLAGNIOL-VILLARD 329*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_USE_CPCIDVI 330*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((penv = getenv ("console")) != NULL) { 331*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (strncmp (penv, "serial", 7) == 0) { 332*16b195c8SJean-Christophe PLAGNIOL-VILLARD return -1; 333*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 334*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 335*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 336*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* Init keyboard device (default US layout) */ 337*16b195c8SJean-Christophe PLAGNIOL-VILLARD keymap = KBD_US; 338*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((penv = getenv ("keymap")) != NULL) 339*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 340*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (strncmp (penv, "de", 3) == 0) 341*16b195c8SJean-Christophe PLAGNIOL-VILLARD keymap = KBD_GER; 342*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 343*16b195c8SJean-Christophe PLAGNIOL-VILLARD 344*16b195c8SJean-Christophe PLAGNIOL-VILLARD for (try = 0; try < KBD_RESET_TRIES; try++) 345*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 346*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (kbd_reset() == 0) 347*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 348*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_mapping = keymap; 349*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags = NORMAL; 350*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_state = 0; 351*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_led_set(); 352*16b195c8SJean-Christophe PLAGNIOL-VILLARD return 0; 353*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 354*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 355*16b195c8SJean-Christophe PLAGNIOL-VILLARD return -1; 356*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 357*16b195c8SJean-Christophe PLAGNIOL-VILLARD 358*16b195c8SJean-Christophe PLAGNIOL-VILLARD 359*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************* 360*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 361*16b195c8SJean-Christophe PLAGNIOL-VILLARD * i8042_tstc - test if keyboard input is available 362*16b195c8SJean-Christophe PLAGNIOL-VILLARD * option: cursor blinking if called in a loop 363*16b195c8SJean-Christophe PLAGNIOL-VILLARD */ 364*16b195c8SJean-Christophe PLAGNIOL-VILLARD int i8042_tstc (void) 365*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 366*16b195c8SJean-Christophe PLAGNIOL-VILLARD unsigned char scan_code = 0; 367*16b195c8SJean-Christophe PLAGNIOL-VILLARD 368*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 369*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (--blinkCount == 0) 370*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 371*16b195c8SJean-Christophe PLAGNIOL-VILLARD cursor_state ^= 1; 372*16b195c8SJean-Christophe PLAGNIOL-VILLARD console_cursor (cursor_state); 373*16b195c8SJean-Christophe PLAGNIOL-VILLARD blinkCount = CFG_CONSOLE_BLINK_COUNT; 374*16b195c8SJean-Christophe PLAGNIOL-VILLARD udelay (10); 375*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 376*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 377*16b195c8SJean-Christophe PLAGNIOL-VILLARD 378*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((in8 (I8042_STATUS_REG) & 0x01) == 0) 379*16b195c8SJean-Christophe PLAGNIOL-VILLARD return 0; 380*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 381*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 382*16b195c8SJean-Christophe PLAGNIOL-VILLARD scan_code = in8 (I8042_DATA_REG); 383*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (scan_code == 0xfa) 384*16b195c8SJean-Christophe PLAGNIOL-VILLARD return 0; 385*16b195c8SJean-Christophe PLAGNIOL-VILLARD 386*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_conv_char(scan_code); 387*16b195c8SJean-Christophe PLAGNIOL-VILLARD 388*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (kbd_input != -1) 389*16b195c8SJean-Christophe PLAGNIOL-VILLARD return 1; 390*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 391*16b195c8SJean-Christophe PLAGNIOL-VILLARD return 0; 392*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 393*16b195c8SJean-Christophe PLAGNIOL-VILLARD 394*16b195c8SJean-Christophe PLAGNIOL-VILLARD 395*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************* 396*16b195c8SJean-Christophe PLAGNIOL-VILLARD * 397*16b195c8SJean-Christophe PLAGNIOL-VILLARD * i8042_getc - wait till keyboard input is available 398*16b195c8SJean-Christophe PLAGNIOL-VILLARD * option: turn on/off cursor while waiting 399*16b195c8SJean-Christophe PLAGNIOL-VILLARD */ 400*16b195c8SJean-Christophe PLAGNIOL-VILLARD int i8042_getc (void) 401*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 402*16b195c8SJean-Christophe PLAGNIOL-VILLARD int ret_chr; 403*16b195c8SJean-Christophe PLAGNIOL-VILLARD unsigned char scan_code; 404*16b195c8SJean-Christophe PLAGNIOL-VILLARD 405*16b195c8SJean-Christophe PLAGNIOL-VILLARD while (kbd_input == -1) 406*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 407*16b195c8SJean-Christophe PLAGNIOL-VILLARD while ((in8 (I8042_STATUS_REG) & 0x01) == 0) 408*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 409*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 410*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (--blinkCount==0) 411*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 412*16b195c8SJean-Christophe PLAGNIOL-VILLARD cursor_state ^= 1; 413*16b195c8SJean-Christophe PLAGNIOL-VILLARD console_cursor (cursor_state); 414*16b195c8SJean-Christophe PLAGNIOL-VILLARD blinkCount = CFG_CONSOLE_BLINK_COUNT; 415*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 416*16b195c8SJean-Christophe PLAGNIOL-VILLARD udelay (10); 417*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 418*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 419*16b195c8SJean-Christophe PLAGNIOL-VILLARD 420*16b195c8SJean-Christophe PLAGNIOL-VILLARD scan_code = in8 (I8042_DATA_REG); 421*16b195c8SJean-Christophe PLAGNIOL-VILLARD 422*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (scan_code != 0xfa) 423*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_conv_char (scan_code); 424*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 425*16b195c8SJean-Christophe PLAGNIOL-VILLARD ret_chr = kbd_input; 426*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_input = -1; 427*16b195c8SJean-Christophe PLAGNIOL-VILLARD return ret_chr; 428*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 429*16b195c8SJean-Christophe PLAGNIOL-VILLARD 430*16b195c8SJean-Christophe PLAGNIOL-VILLARD 431*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 432*16b195c8SJean-Christophe PLAGNIOL-VILLARD 433*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_conv_char (unsigned char scan_code) 434*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 435*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (scan_code == 0xe0) 436*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 437*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags |= EXT; 438*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 439*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 440*16b195c8SJean-Christophe PLAGNIOL-VILLARD 441*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* if high bit of scan_code, set break flag */ 442*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (scan_code & 0x80) 443*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags |= BRK; 444*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 445*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags &= ~BRK; 446*16b195c8SJean-Christophe PLAGNIOL-VILLARD 447*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((scan_code == 0xe1) || (kbd_flags & E1)) 448*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 449*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (scan_code == 0xe1) 450*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 451*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags ^= BRK; /* reset the break flag */ 452*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags ^= E1; /* bitwise EXOR with E1 flag */ 453*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 454*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 455*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 456*16b195c8SJean-Christophe PLAGNIOL-VILLARD 457*16b195c8SJean-Christophe PLAGNIOL-VILLARD scan_code &= 0x7f; 458*16b195c8SJean-Christophe PLAGNIOL-VILLARD 459*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (kbd_flags & EXT) 460*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 461*16b195c8SJean-Christophe PLAGNIOL-VILLARD int i; 462*16b195c8SJean-Christophe PLAGNIOL-VILLARD 463*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags ^= EXT; 464*16b195c8SJean-Christophe PLAGNIOL-VILLARD for (i=0; ext_key_map[i]; i++) 465*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 466*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (ext_key_map[i] == scan_code) 467*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 468*16b195c8SJean-Christophe PLAGNIOL-VILLARD scan_code = 0x80 + i; 469*16b195c8SJean-Christophe PLAGNIOL-VILLARD break; 470*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 471*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 472*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* not found ? */ 473*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (!ext_key_map[i]) 474*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 475*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 476*16b195c8SJean-Christophe PLAGNIOL-VILLARD 477*16b195c8SJean-Christophe PLAGNIOL-VILLARD switch (kbd_fct_map [scan_code]) 478*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 479*16b195c8SJean-Christophe PLAGNIOL-VILLARD case AS: kbd_normal (scan_code); 480*16b195c8SJean-Christophe PLAGNIOL-VILLARD break; 481*16b195c8SJean-Christophe PLAGNIOL-VILLARD case SH: kbd_shift (scan_code); 482*16b195c8SJean-Christophe PLAGNIOL-VILLARD break; 483*16b195c8SJean-Christophe PLAGNIOL-VILLARD case CN: kbd_ctrl (scan_code); 484*16b195c8SJean-Christophe PLAGNIOL-VILLARD break; 485*16b195c8SJean-Christophe PLAGNIOL-VILLARD case NM: kbd_num (scan_code); 486*16b195c8SJean-Christophe PLAGNIOL-VILLARD break; 487*16b195c8SJean-Christophe PLAGNIOL-VILLARD case CP: kbd_caps (scan_code); 488*16b195c8SJean-Christophe PLAGNIOL-VILLARD break; 489*16b195c8SJean-Christophe PLAGNIOL-VILLARD case ST: kbd_scroll (scan_code); 490*16b195c8SJean-Christophe PLAGNIOL-VILLARD break; 491*16b195c8SJean-Christophe PLAGNIOL-VILLARD case AK: kbd_alt (scan_code); 492*16b195c8SJean-Christophe PLAGNIOL-VILLARD break; 493*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 494*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 495*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 496*16b195c8SJean-Christophe PLAGNIOL-VILLARD 497*16b195c8SJean-Christophe PLAGNIOL-VILLARD 498*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 499*16b195c8SJean-Christophe PLAGNIOL-VILLARD 500*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_normal (unsigned char scan_code) 501*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 502*16b195c8SJean-Christophe PLAGNIOL-VILLARD unsigned char chr; 503*16b195c8SJean-Christophe PLAGNIOL-VILLARD 504*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((kbd_flags & BRK) == NORMAL) 505*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 506*16b195c8SJean-Christophe PLAGNIOL-VILLARD chr = kbd_key_map [kbd_mapping][kbd_state][scan_code]; 507*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((chr == 0xff) || (chr == 0x00)) 508*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 509*16b195c8SJean-Christophe PLAGNIOL-VILLARD return; 510*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 511*16b195c8SJean-Christophe PLAGNIOL-VILLARD 512*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* if caps lock convert upper to lower */ 513*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (((kbd_flags & CAPS) == CAPS) && (chr >= 'a' && chr <= 'z')) 514*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 515*16b195c8SJean-Christophe PLAGNIOL-VILLARD chr -= 'a' - 'A'; 516*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 517*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_input = chr; 518*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 519*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 520*16b195c8SJean-Christophe PLAGNIOL-VILLARD 521*16b195c8SJean-Christophe PLAGNIOL-VILLARD 522*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 523*16b195c8SJean-Christophe PLAGNIOL-VILLARD 524*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_shift (unsigned char scan_code) 525*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 526*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((kbd_flags & BRK) == BRK) 527*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 528*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_state = AS; 529*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags &= (~SHIFT); 530*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 531*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 532*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 533*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_state = SH; 534*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags |= SHIFT; 535*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 536*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 537*16b195c8SJean-Christophe PLAGNIOL-VILLARD 538*16b195c8SJean-Christophe PLAGNIOL-VILLARD 539*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 540*16b195c8SJean-Christophe PLAGNIOL-VILLARD 541*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_ctrl (unsigned char scan_code) 542*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 543*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((kbd_flags & BRK) == BRK) 544*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 545*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_state = AS; 546*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags &= (~CTRL); 547*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 548*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 549*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 550*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_state = CN; 551*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags |= CTRL; 552*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 553*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 554*16b195c8SJean-Christophe PLAGNIOL-VILLARD 555*16b195c8SJean-Christophe PLAGNIOL-VILLARD 556*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 557*16b195c8SJean-Christophe PLAGNIOL-VILLARD 558*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_caps (unsigned char scan_code) 559*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 560*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((kbd_flags & BRK) == NORMAL) 561*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 562*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags ^= CAPS; 563*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_led_set (); /* update keyboard LED */ 564*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 565*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 566*16b195c8SJean-Christophe PLAGNIOL-VILLARD 567*16b195c8SJean-Christophe PLAGNIOL-VILLARD 568*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 569*16b195c8SJean-Christophe PLAGNIOL-VILLARD 570*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_num (unsigned char scan_code) 571*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 572*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((kbd_flags & BRK) == NORMAL) 573*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 574*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags ^= NUM; 575*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_state = (kbd_flags & NUM) ? AS : NM; 576*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_led_set (); /* update keyboard LED */ 577*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 578*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 579*16b195c8SJean-Christophe PLAGNIOL-VILLARD 580*16b195c8SJean-Christophe PLAGNIOL-VILLARD 581*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 582*16b195c8SJean-Christophe PLAGNIOL-VILLARD 583*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_scroll (unsigned char scan_code) 584*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 585*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((kbd_flags & BRK) == NORMAL) 586*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 587*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags ^= STP; 588*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_led_set (); /* update keyboard LED */ 589*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (kbd_flags & STP) 590*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_input = 0x13; 591*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 592*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_input = 0x11; 593*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 594*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 595*16b195c8SJean-Christophe PLAGNIOL-VILLARD 596*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 597*16b195c8SJean-Christophe PLAGNIOL-VILLARD 598*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_alt (unsigned char scan_code) 599*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 600*16b195c8SJean-Christophe PLAGNIOL-VILLARD if ((kbd_flags & BRK) == BRK) 601*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 602*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_state = AS; 603*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags &= (~ALT); 604*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 605*16b195c8SJean-Christophe PLAGNIOL-VILLARD else 606*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 607*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_state = AK; 608*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_flags &= ALT; 609*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 610*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 611*16b195c8SJean-Christophe PLAGNIOL-VILLARD 612*16b195c8SJean-Christophe PLAGNIOL-VILLARD 613*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 614*16b195c8SJean-Christophe PLAGNIOL-VILLARD 615*16b195c8SJean-Christophe PLAGNIOL-VILLARD static void kbd_led_set (void) 616*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 617*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_input_empty(); 618*16b195c8SJean-Christophe PLAGNIOL-VILLARD out8 (I8042_DATA_REG, 0xed); /* SET LED command */ 619*16b195c8SJean-Christophe PLAGNIOL-VILLARD kbd_input_empty(); 620*16b195c8SJean-Christophe PLAGNIOL-VILLARD out8 (I8042_DATA_REG, (kbd_flags & 0x7)); /* LED bits only */ 621*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 622*16b195c8SJean-Christophe PLAGNIOL-VILLARD 623*16b195c8SJean-Christophe PLAGNIOL-VILLARD 624*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 625*16b195c8SJean-Christophe PLAGNIOL-VILLARD 626*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_input_empty (void) 627*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 628*16b195c8SJean-Christophe PLAGNIOL-VILLARD int kbdTimeout = KBD_TIMEOUT; 629*16b195c8SJean-Christophe PLAGNIOL-VILLARD 630*16b195c8SJean-Christophe PLAGNIOL-VILLARD /* wait for input buf empty */ 631*16b195c8SJean-Christophe PLAGNIOL-VILLARD while ((in8 (I8042_STATUS_REG) & 0x02) && kbdTimeout--) 632*16b195c8SJean-Christophe PLAGNIOL-VILLARD udelay(1000); 633*16b195c8SJean-Christophe PLAGNIOL-VILLARD 634*16b195c8SJean-Christophe PLAGNIOL-VILLARD return kbdTimeout; 635*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 636*16b195c8SJean-Christophe PLAGNIOL-VILLARD 637*16b195c8SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 638*16b195c8SJean-Christophe PLAGNIOL-VILLARD 639*16b195c8SJean-Christophe PLAGNIOL-VILLARD static int kbd_reset (void) 640*16b195c8SJean-Christophe PLAGNIOL-VILLARD { 641*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (kbd_input_empty() == 0) 642*16b195c8SJean-Christophe PLAGNIOL-VILLARD return -1; 643*16b195c8SJean-Christophe PLAGNIOL-VILLARD 644*16b195c8SJean-Christophe PLAGNIOL-VILLARD out8 (I8042_DATA_REG, 0xff); 645*16b195c8SJean-Christophe PLAGNIOL-VILLARD 646*16b195c8SJean-Christophe PLAGNIOL-VILLARD udelay(250000); 647*16b195c8SJean-Christophe PLAGNIOL-VILLARD 648*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (kbd_input_empty() == 0) 649*16b195c8SJean-Christophe PLAGNIOL-VILLARD return -1; 650*16b195c8SJean-Christophe PLAGNIOL-VILLARD 651*16b195c8SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_USE_CPCIDVI 652*16b195c8SJean-Christophe PLAGNIOL-VILLARD out8 (I8042_COMMAND_REG, 0x60); 653*16b195c8SJean-Christophe PLAGNIOL-VILLARD #else 654*16b195c8SJean-Christophe PLAGNIOL-VILLARD out8 (I8042_DATA_REG, 0x60); 655*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif 656*16b195c8SJean-Christophe PLAGNIOL-VILLARD 657*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (kbd_input_empty() == 0) 658*16b195c8SJean-Christophe PLAGNIOL-VILLARD return -1; 659*16b195c8SJean-Christophe PLAGNIOL-VILLARD 660*16b195c8SJean-Christophe PLAGNIOL-VILLARD out8 (I8042_DATA_REG, 0x45); 661*16b195c8SJean-Christophe PLAGNIOL-VILLARD 662*16b195c8SJean-Christophe PLAGNIOL-VILLARD 663*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (kbd_input_empty() == 0) 664*16b195c8SJean-Christophe PLAGNIOL-VILLARD return -1; 665*16b195c8SJean-Christophe PLAGNIOL-VILLARD 666*16b195c8SJean-Christophe PLAGNIOL-VILLARD out8 (I8042_COMMAND_REG, 0xae); 667*16b195c8SJean-Christophe PLAGNIOL-VILLARD 668*16b195c8SJean-Christophe PLAGNIOL-VILLARD if (kbd_input_empty() == 0) 669*16b195c8SJean-Christophe PLAGNIOL-VILLARD return -1; 670*16b195c8SJean-Christophe PLAGNIOL-VILLARD 671*16b195c8SJean-Christophe PLAGNIOL-VILLARD return 0; 672*16b195c8SJean-Christophe PLAGNIOL-VILLARD } 673*16b195c8SJean-Christophe PLAGNIOL-VILLARD 674*16b195c8SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_I8042_KBD */ 675