[U-Boot] [PATCH v3 1/7] x86: i8042: Remove unused codes

Remove unused CONFIG_USE_CPCIDVI wrapped codes.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
---
Changes in v3: - Keep i8042_flush(), i8042_disable() and board_i8042_skip()
Changes in v2: - Split the removing of unused codes into this patch
drivers/input/i8042.c | 17 ----------------- 1 file changed, 17 deletions(-)
diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c index 1769c5e..87220ca 100644 --- a/drivers/input/i8042.c +++ b/drivers/input/i8042.c @@ -10,16 +10,6 @@ /* includes */
#include <common.h> -#include <linux/compiler.h> - -#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 */ @@ -365,13 +355,6 @@ int i8042_kbd_init(void) if (!kbd_controller_present() || board_i8042_skip()) return -1;
-#ifdef CONFIG_USE_CPCIDVI - penv = getenv("console"); - if (penv != NULL) { - if (strncmp(penv, "serial", 7) == 0) - return -1; - } -#endif /* Init keyboard device (default US layout) */ keymap = KBD_US; penv = getenv("keymap");

Reorder those static function so that their declarations can be removed.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Acked-by: Simon Glass sjg@chromium.org
---
Changes in v3: None Changes in v2: - Split of reordering static functions into this patch
drivers/input/i8042.c | 490 +++++++++++++++++++++++--------------------------- 1 file changed, 222 insertions(+), 268 deletions(-)
diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c index 87220ca..126b222 100644 --- a/drivers/input/i8042.c +++ b/drivers/input/i8042.c @@ -27,18 +27,6 @@ static int kbd_mapping = KBD_US; /* default US keyboard */ static int kbd_flags = NORMAL; /* after reset */ static int kbd_state; /* 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 */ @@ -288,8 +276,230 @@ static unsigned char ext_key_map[] = { 0x00 /* map end */ };
+static int kbd_input_empty(void) +{ + int kbdTimeout = KBD_TIMEOUT * 1000; + + while ((in8(I8042_STATUS_REG) & I8042_STATUS_IN_DATA) && kbdTimeout--) + udelay(1); + + return kbdTimeout != -1; +} + +static int wait_until_kbd_output_full(void) +{ + int kbdTimeout = KBD_TIMEOUT * 1000; + + while (((in8(I8042_STATUS_REG) & 0x01) == 0) && kbdTimeout--) + udelay(1); + + return kbdTimeout != -1; +} + +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 void kbd_normal(unsigned char scan_code) +{ + unsigned char chr; + + if ((kbd_flags & BRK) == NORMAL) { + chr = kbd_key_map[kbd_mapping][kbd_state][scan_code]; + if ((chr == 0xff) || (chr == 0x00)) + return; + + /* if caps lock convert upper to lower */ + if (((kbd_flags & CAPS) == CAPS) && + (chr >= 'a' && chr <= 'z')) { + chr -= 'a' - 'A'; + } + kbd_input = chr; + } +} + +static void kbd_shift(unsigned char scan_code) +{ + if ((kbd_flags & BRK) == BRK) { + kbd_state = AS; + kbd_flags &= (~SHIFT); + } else { + kbd_state = SH; + kbd_flags |= SHIFT; + } +} + +static void kbd_ctrl(unsigned char scan_code) +{ + if ((kbd_flags & BRK) == BRK) { + kbd_state = AS; + kbd_flags &= (~CTRL); + } else { + kbd_state = CN; + kbd_flags |= CTRL; + } +} + +static void kbd_num(unsigned char scan_code) +{ + if ((kbd_flags & BRK) == NORMAL) { + kbd_flags ^= NUM; + kbd_state = (kbd_flags & NUM) ? AS : NM; + kbd_led_set(); /* update keyboard LED */ + } +} + +static void kbd_alt(unsigned char scan_code) +{ + if ((kbd_flags & BRK) == BRK) { + kbd_state = AS; + kbd_flags &= (~ALT); + } else { + kbd_state = AK; + kbd_flags &= ALT; + } +} + +static void kbd_caps(unsigned char scan_code) +{ + if ((kbd_flags & BRK) == NORMAL) { + kbd_flags ^= CAPS; + kbd_led_set(); /* 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_conv_char(unsigned char scan_code) +{ + if (scan_code == 0xe0) { + kbd_flags |= EXT; + return; + } + + /* if high bit of scan_code, set break flag */ + if (scan_code & 0x80) + kbd_flags |= BRK; + else + kbd_flags &= ~BRK; + + if ((scan_code == 0xe1) || (kbd_flags & E1)) { + if (scan_code == 0xe1) { + kbd_flags ^= BRK; /* reset the break flag */ + kbd_flags ^= E1; /* bitwise EXOR with E1 flag */ + } + return; + } + + scan_code &= 0x7f; + + if (kbd_flags & EXT) { + int i; + + kbd_flags ^= EXT; + for (i = 0; ext_key_map[i]; i++) { + if (ext_key_map[i] == scan_code) { + scan_code = 0x80 + i; + break; + } + } + /* not found ? */ + if (!ext_key_map[i]) + return; + } + + switch (kbd_fct_map[scan_code]) { + case AS: + kbd_normal(scan_code); + break; + case SH: + kbd_shift(scan_code); + break; + case CN: + kbd_ctrl(scan_code); + break; + case NM: + kbd_num(scan_code); + break; + case AK: + kbd_alt(scan_code); + break; + case CP: + kbd_caps(scan_code); + break; + case ST: + kbd_scroll(scan_code); + break; + } + return; +} + /******************************************************************************/
+static int kbd_reset(void) +{ + /* KB Reset */ + if (kbd_input_empty() == 0) + return -1; + + out8(I8042_DATA_REG, 0xff); + + if (wait_until_kbd_output_full() == 0) + return -1; + + if (in8(I8042_DATA_REG) != 0xfa) /* ACK */ + return -1; + + if (wait_until_kbd_output_full() == 0) + return -1; + + if (in8(I8042_DATA_REG) != 0xaa) /* Test Pass*/ + return -1; + + if (kbd_input_empty() == 0) + return -1; + + /* Set KBC mode */ + out8(I8042_COMMAND_REG, 0x60); + + if (kbd_input_empty() == 0) + return -1; + + out8(I8042_DATA_REG, 0x45); + + if (kbd_input_empty() == 0) + return -1; + + /* Enable Keyboard */ + out8(I8042_COMMAND_REG, 0xae); + if (kbd_input_empty() == 0) + return -1; + + out8(I8042_COMMAND_REG, 0x60); + if (kbd_input_empty() == 0) + return -1; + + out8(I8042_DATA_REG, 0xf4); + if (kbd_input_empty() == 0) + return -1; + + return 0; +} + static int kbd_controller_present(void) { return in8(I8042_STATUS_REG) != 0xff; @@ -342,7 +552,6 @@ int i8042_disable(void) return 0; }
- /******************************************************************************* * * i8042_kbd_init - reset keyboard and init state flags @@ -439,258 +648,3 @@ int i8042_getc(struct stdio_dev *dev) 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 * 1000; - - while ((in8(I8042_STATUS_REG) & I8042_STATUS_IN_DATA) && kbdTimeout--) - udelay(1); - - return kbdTimeout != -1; -} - -/******************************************************************************/ - -static int wait_until_kbd_output_full(void) -{ - int kbdTimeout = KBD_TIMEOUT * 1000; - - while (((in8(I8042_STATUS_REG) & 0x01) == 0) && kbdTimeout--) - udelay(1); - - return kbdTimeout != -1; -} - -/******************************************************************************/ - -static int kbd_reset(void) -{ - /* KB Reset */ - if (kbd_input_empty() == 0) - return -1; - - out8(I8042_DATA_REG, 0xff); - - if (wait_until_kbd_output_full() == 0) - return -1; - - if (in8(I8042_DATA_REG) != 0xfa) /* ACK */ - return -1; - - if (wait_until_kbd_output_full() == 0) - return -1; - - if (in8(I8042_DATA_REG) != 0xaa) /* Test Pass*/ - return -1; - - if (kbd_input_empty() == 0) - return -1; - - /* Set KBC mode */ - out8(I8042_COMMAND_REG, 0x60); - - if (kbd_input_empty() == 0) - return -1; - - out8(I8042_DATA_REG, 0x45); - - if (kbd_input_empty() == 0) - return -1; - - /* Enable Keyboard */ - out8(I8042_COMMAND_REG, 0xae); - if (kbd_input_empty() == 0) - return -1; - - out8(I8042_COMMAND_REG, 0x60); - if (kbd_input_empty() == 0) - return -1; - - out8(I8042_DATA_REG, 0xf4); - if (kbd_input_empty() == 0) - return -1; - - return 0; -}

On 24 August 2015 at 01:00, Bin Meng bmeng.cn@gmail.com wrote:
Reorder those static function so that their declarations can be removed.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Acked-by: Simon Glass sjg@chromium.org
Changes in v3: None Changes in v2:
- Split of reordering static functions into this patch
drivers/input/i8042.c | 490 +++++++++++++++++++++++--------------------------- 1 file changed, 222 insertions(+), 268 deletions(-)
Applied to u-boot-x86, thanks!

- Rename CamelCase variables to conform U-Boot coding convention - Rename wait_until_kbd_output_full() to kbd_output_full() - Change to use macros for i8042 command and control register bits
Signed-off-by: Bin Meng bmeng.cn@gmail.com Acked-by: Simon Glass sjg@chromium.org
---
Changes in v3: None Changes in v2: - Split the original single patch into 3 patches
drivers/input/i8042.c | 230 ++++++++++++++++++++++++++------------------------ include/i8042.h | 103 ++++++++++++---------- 2 files changed, 177 insertions(+), 156 deletions(-)
diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c index 126b222..e8f59df 100644 --- a/drivers/input/i8042.c +++ b/drivers/input/i8042.c @@ -10,27 +10,30 @@ /* includes */
#include <common.h> +#include <asm/io.h> #include <i8042.h>
/* defines */ +#define in8(p) inb(p) +#define out8(p, v) outb(v, p)
#ifdef CONFIG_CONSOLE_CURSOR extern void console_cursor(int state); -static int blinkCount = CONFIG_SYS_CONSOLE_BLINK_COUNT; +static int blink_count = CONFIG_SYS_CONSOLE_BLINK_COUNT; static int cursor_state; #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; /* unshift code */ +static int kbd_input = -1; /* no input yet */ +static int kbd_mapping = KBD_US; /* default US keyboard */ +static int kbd_flags = NORMAL; /* after reset */ +static int kbd_state; /* unshift code */
static unsigned char kbd_fct_map[144] = { /* kbd_fct_map table for scan code */ - 0, AS, AS, AS, AS, AS, AS, AS, /* scan 0- 7 */ - AS, AS, AS, AS, AS, AS, AS, AS, /* scan 8- F */ + 0, AS, AS, AS, AS, AS, AS, AS, /* scan 00-07 */ + AS, AS, AS, AS, AS, AS, AS, AS, /* scan 08-0F */ AS, AS, AS, AS, AS, AS, AS, AS, /* scan 10-17 */ AS, AS, AS, AS, AS, CN, AS, AS, /* scan 18-1F */ AS, AS, AS, AS, AS, AS, AS, AS, /* scan 20-27 */ @@ -52,8 +55,8 @@ static unsigned char kbd_fct_map[144] = { 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 */ + 0, 0x1b, '1', '2', '3', '4', '5', '6', /* scan 00-07 */ + '7', '8', '9', '0', '-', '=', 0x08, '\t', /* scan 08-0F */ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', /* scan 10-17 */ 'o', 'p', '[', ']', '\r', CN, 'a', 's', /* scan 18-1F */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* scan 20-27 */ @@ -72,8 +75,8 @@ static unsigned char kbd_key_map[2][5][144] = { 0, 'D', 'C', 0, 'B', 0, '@', 'P' /* extended */ }, { /* shift code */ - 0, 0x1b, '!', '@', '#', '$', '%', '^', /* scan 0- 7 */ - '&', '*', '(', ')', '_', '+', 0x08, '\t', /* scan 8- F */ + 0, 0x1b, '!', '@', '#', '$', '%', '^', /* scan 00-07 */ + '&', '*', '(', ')', '_', '+', 0x08, '\t', /* scan 08-0F */ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', /* scan 10-17 */ 'O', 'P', '{', '}', '\r', CN, 'A', 'S', /* scan 18-1F */ 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', /* scan 20-27 */ @@ -92,8 +95,8 @@ static unsigned char kbd_key_map[2][5][144] = { 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 */ + 0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */ + 0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan 08-0F */ 0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* scan 10-17 */ 0x0f, 0x10, 0x1b, 0x1d, '\r', CN, 0x01, 0x13, /* scan 18-1F */ 0x04, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0xff, /* scan 20-27 */ @@ -112,8 +115,8 @@ static unsigned char kbd_key_map[2][5][144] = { 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 */ + 0, 0x1b, '1', '2', '3', '4', '5', '6', /* scan 00-07 */ + '7', '8', '9', '0', '-', '=', 0x08, '\t', /* scan 08-0F */ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', /* scan 10-17 */ 'o', 'p', '[', ']', '\r', CN, 'a', 's', /* scan 18-1F */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* scan 20-27 */ @@ -132,30 +135,30 @@ static unsigned char kbd_key_map[2][5][144] = { 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, /* scan 00-07 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 08-0F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10-17 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 18-1F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20-27 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28-2F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30-37 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40-47 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 50-57 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* extended */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff /* extended */ } }, - { /* german keyboard */ + { /* 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 */ + 0, 0x1b, '1', '2', '3', '4', '5', '6', /* scan 00-07 */ + '7', '8', '9', '0', 0xe1, ''', 0x08, '\t', /* scan 08-0F */ 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', /* scan 10-17 */ 'o', 'p', 0x81, '+', '\r', CN, 'a', 's', /* scan 18-1F */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0x94, /* scan 20-27 */ @@ -174,8 +177,8 @@ static unsigned char kbd_key_map[2][5][144] = { 0, 'D', 'C', 0, 'B', 0, '@', 'P' /* extended */ }, { /* shift code */ - 0, 0x1b, '!', '"', 0x15, '$', '%', '&', /* scan 0- 7 */ - '/', '(', ')', '=', '?', '`', 0x08, '\t', /* scan 8- F */ + 0, 0x1b, '!', '"', 0x15, '$', '%', '&', /* scan 00-07 */ + '/', '(', ')', '=', '?', '`', 0x08, '\t', /* scan 08-0F */ 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', /* scan 10-17 */ 'O', 'P', 0x9a, '*', '\r', CN, 'A', 'S', /* scan 18-1F */ 'D', 'F', 'G', 'H', 'J', 'K', 'L', 0x99, /* scan 20-27 */ @@ -194,8 +197,8 @@ static unsigned char kbd_key_map[2][5][144] = { 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 */ + 0xff, 0x1b, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */ + 0x1e, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, '\t', /* scan 08-0F */ 0x11, 0x17, 0x05, 0x12, 0x14, 0x19, 0x15, 0x09, /* scan 10-17 */ 0x0f, 0x10, 0x1b, 0x1d, '\r', CN, 0x01, 0x13, /* scan 18-1F */ 0x04, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0xff, /* scan 20-27 */ @@ -214,8 +217,8 @@ static unsigned char kbd_key_map[2][5][144] = { 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 */ + 0, 0x1b, '1', '2', '3', '4', '5', '6', /* scan 00-07 */ + '7', '8', '9', '0', 0xe1, ''', 0x08, '\t', /* scan 08-0F */ 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', /* scan 10-17 */ 'o', 'p', 0x81, '+', '\r', CN, 'a', 's', /* scan 18-1F */ 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0x94, /* scan 20-27 */ @@ -233,23 +236,23 @@ static unsigned char kbd_key_map[2][5][144] = { '\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 */ + { /* right alt mode - is used in German keyboard */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 00-07 */ + '{', '[', ']', '}', '\', 0xff, 0xff, 0xff, /* scan 08-0F */ + '@', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 10-17 */ + 0xff, 0xff, 0xff, '~', 0xff, 0xff, 0xff, 0xff, /* scan 18-1F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 20-27 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 28-2F */ + 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 30-37 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 38-3F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 40-47 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 48-4F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, '|', 0xff, /* scan 50-57 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 58-5F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 60-67 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 68-6F */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 70-77 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* scan 78-7F */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* extended */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff /* extended */ } @@ -278,30 +281,30 @@ static unsigned char ext_key_map[] = {
static int kbd_input_empty(void) { - int kbdTimeout = KBD_TIMEOUT * 1000; + int kbd_timeout = KBD_TIMEOUT * 1000;
- while ((in8(I8042_STATUS_REG) & I8042_STATUS_IN_DATA) && kbdTimeout--) + while ((in8(I8042_STS_REG) & STATUS_IBF) && kbd_timeout--) udelay(1);
- return kbdTimeout != -1; + return kbd_timeout != -1; }
-static int wait_until_kbd_output_full(void) +static int kbd_output_full(void) { - int kbdTimeout = KBD_TIMEOUT * 1000; + int kbd_timeout = KBD_TIMEOUT * 1000;
- while (((in8(I8042_STATUS_REG) & 0x01) == 0) && kbdTimeout--) + while (((in8(I8042_STS_REG) & STATUS_OBF) == 0) && kbd_timeout--) udelay(1);
- return kbdTimeout != -1; + return kbd_timeout != -1; }
static void kbd_led_set(void) { kbd_input_empty(); - out8(I8042_DATA_REG, 0xed); /* SET LED command */ + out8(I8042_DATA_REG, CMD_SET_KBD_LED); kbd_input_empty(); - out8(I8042_DATA_REG, (kbd_flags & 0x7)); /* LED bits only */ + out8(I8042_DATA_REG, (kbd_flags & 0x7)); }
static void kbd_normal(unsigned char scan_code) @@ -315,7 +318,7 @@ static void kbd_normal(unsigned char scan_code)
/* if caps lock convert upper to lower */ if (((kbd_flags & CAPS) == CAPS) && - (chr >= 'a' && chr <= 'z')) { + (chr >= 'a' && chr <= 'z')) { chr -= 'a' - 'A'; } kbd_input = chr; @@ -349,7 +352,7 @@ 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 */ + kbd_led_set(); } }
@@ -368,7 +371,7 @@ static void kbd_caps(unsigned char scan_code) { if ((kbd_flags & BRK) == NORMAL) { kbd_flags ^= CAPS; - kbd_led_set(); /* update keyboard LED */ + kbd_led_set(); } }
@@ -376,7 +379,7 @@ static void kbd_scroll(unsigned char scan_code) { if ((kbd_flags & BRK) == NORMAL) { kbd_flags ^= STP; - kbd_led_set(); /* update keyboard LED */ + kbd_led_set(); if (kbd_flags & STP) kbd_input = 0x13; else @@ -399,8 +402,8 @@ static void kbd_conv_char(unsigned char scan_code)
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 */ + kbd_flags ^= BRK; /* reset the break flag */ + kbd_flags ^= E1; /* bitwise EXOR with E1 flag */ } return; } @@ -445,55 +448,57 @@ static void kbd_conv_char(unsigned char scan_code) kbd_scroll(scan_code); break; } + return; }
-/******************************************************************************/ - static int kbd_reset(void) { /* KB Reset */ if (kbd_input_empty() == 0) return -1;
- out8(I8042_DATA_REG, 0xff); + out8(I8042_DATA_REG, CMD_RESET_KBD);
- if (wait_until_kbd_output_full() == 0) + if (kbd_output_full() == 0) return -1;
- if (in8(I8042_DATA_REG) != 0xfa) /* ACK */ + if (in8(I8042_DATA_REG) != KBD_ACK) return -1;
- if (wait_until_kbd_output_full() == 0) + if (kbd_output_full() == 0) return -1;
- if (in8(I8042_DATA_REG) != 0xaa) /* Test Pass*/ + if (in8(I8042_DATA_REG) != KBD_POR) return -1;
if (kbd_input_empty() == 0) return -1;
/* Set KBC mode */ - out8(I8042_COMMAND_REG, 0x60); + out8(I8042_CMD_REG, CMD_WR_CONFIG);
if (kbd_input_empty() == 0) return -1;
- out8(I8042_DATA_REG, 0x45); + out8(I8042_DATA_REG, + CONFIG_AT_TRANS | CONFIG_SET_BIST | CONFIG_KIRQ_EN);
if (kbd_input_empty() == 0) return -1;
/* Enable Keyboard */ - out8(I8042_COMMAND_REG, 0xae); + out8(I8042_CMD_REG, CMD_KBD_EN); if (kbd_input_empty() == 0) return -1;
- out8(I8042_COMMAND_REG, 0x60); + out8(I8042_CMD_REG, CMD_WR_CONFIG); if (kbd_input_empty() == 0) return -1;
- out8(I8042_DATA_REG, 0xf4); + out8(I8042_DATA_REG, + CONFIG_AT_TRANS | CONFIG_MCLK_DIS | + CONFIG_KCLK_DIS | CONFIG_SET_BIST); if (kbd_input_empty() == 0) return -1;
@@ -502,7 +507,7 @@ static int kbd_reset(void)
static int kbd_controller_present(void) { - return in8(I8042_STATUS_REG) != 0xff; + return in8(I8042_STS_REG) != 0xff; }
/* @@ -520,18 +525,18 @@ void i8042_flush(void) int timeout;
/* - * The delay is to give the keyboard controller some time to fill the - * next byte. + * The delay is to give the keyboard controller some time + * to fill the next byte. */ while (1) { - timeout = 100; /* wait for no longer than 100us */ - while (timeout > 0 && !(in8(I8042_STATUS_REG) & 0x01)) { + timeout = 100; /* wait for no longer than 100us */ + while (timeout > 0 && !(in8(I8042_STS_REG) & STATUS_OBF)) { udelay(1); timeout--; }
- /* Try to pull next byte if not timeout. */ - if (in8(I8042_STATUS_REG) & 0x01) + /* Try to pull next byte if not timeout */ + if (in8(I8042_STS_REG) & STATUS_OBF) in8(I8042_DATA_REG); else break; @@ -544,7 +549,7 @@ int i8042_disable(void) return -1;
/* Disable keyboard */ - out8(I8042_COMMAND_REG, 0xad); + out8(I8042_CMD_REG, CMD_KBD_DIS);
if (kbd_input_empty() == 0) return -1; @@ -552,17 +557,16 @@ int i8042_disable(void) return 0; }
-/******************************************************************************* - * - * i8042_kbd_init - reset keyboard and init state flags - */ +/* i8042_kbd_init - reset keyboard and init state flags */ int i8042_kbd_init(void) { int keymap, try; char *penv;
- if (!kbd_controller_present() || board_i8042_skip()) + if (!kbd_controller_present() || board_i8042_skip()) { + debug("i8042 keyboard controller is not present\n"); return -1; + }
/* Init keyboard device (default US layout) */ keymap = KBD_US; @@ -578,32 +582,33 @@ int i8042_kbd_init(void) 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 + * + * option: cursor blinking if called in a loop */ int i8042_tstc(struct stdio_dev *dev) { unsigned char scan_code = 0;
#ifdef CONFIG_CONSOLE_CURSOR - if (--blinkCount == 0) { + if (--blink_count == 0) { cursor_state ^= 1; console_cursor(cursor_state); - blinkCount = CONFIG_SYS_CONSOLE_BLINK_COUNT; + blink_count = CONFIG_SYS_CONSOLE_BLINK_COUNT; udelay(10); } #endif
- if ((in8(I8042_STATUS_REG) & 0x01) == 0) { + if ((in8(I8042_STS_REG) & STATUS_OBF) == 0) { return 0; } else { scan_code = in8(I8042_DATA_REG); @@ -615,14 +620,14 @@ int i8042_tstc(struct stdio_dev *dev) if (kbd_input != -1) return 1; } + return 0; }
- -/******************************************************************************* - * +/* * i8042_getc - wait till keyboard input is available - * option: turn on/off cursor while waiting + * + * option: turn on/off cursor while waiting */ int i8042_getc(struct stdio_dev *dev) { @@ -630,21 +635,22 @@ int i8042_getc(struct stdio_dev *dev) unsigned char scan_code;
while (kbd_input == -1) { - while ((in8(I8042_STATUS_REG) & 0x01) == 0) { + while ((in8(I8042_STS_REG) & STATUS_OBF) == 0) { #ifdef CONFIG_CONSOLE_CURSOR - if (--blinkCount == 0) { + if (--blink_count == 0) { cursor_state ^= 1; console_cursor(cursor_state); - blinkCount = CONFIG_SYS_CONSOLE_BLINK_COUNT; + blink_count = CONFIG_SYS_CONSOLE_BLINK_COUNT; } udelay(10); #endif } scan_code = in8(I8042_DATA_REG); if (scan_code != 0xfa) - kbd_conv_char (scan_code); + kbd_conv_char(scan_code); } ret_chr = kbd_input; kbd_input = -1; + return ret_chr; } diff --git a/include/i8042.h b/include/i8042.h index 58c85ec..e0afce1 100644 --- a/include/i8042.h +++ b/include/i8042.h @@ -10,52 +10,67 @@ #ifndef _I8042_H_ #define _I8042_H_
-#ifdef __I386__ -#include <common.h> -#include <asm/io.h> -#define in8(p) inb(p) -#define out8(p,v) outb(v,p) -#endif - /* defines */
-#define I8042_DATA_REG (CONFIG_SYS_ISA_IO + 0x0060) /* keyboard i/o buffer */ -#define I8042_STATUS_REG (CONFIG_SYS_ISA_IO + 0x0064) /* keyboard status read */ -#define I8042_COMMAND_REG (CONFIG_SYS_ISA_IO + 0x0064) /* keyboard ctrl write */ - -enum { - /* Output register (I8042_DATA_REG) has data for system */ - I8042_STATUS_OUT_DATA = 1 << 0, - I8042_STATUS_IN_DATA = 1 << 1, -}; - -#define KBD_US 0 /* default US layout */ -#define KBD_GER 1 /* german layout */ - -#define KBD_TIMEOUT 1000 /* 1 sec */ -#define KBD_RESET_TRIES 3 - -#define AS 0 /* normal character index */ -#define SH 1 /* shift index */ -#define CN 2 /* control index */ -#define NM 3 /* numeric lock index */ -#define AK 4 /* right alt key */ -#define CP 5 /* capslock index */ -#define ST 6 /* stop output index */ -#define EX 7 /* extended code index */ -#define ES 8 /* escape and extended code index */ - -#define NORMAL 0x0000 /* normal key */ -#define STP 0x0001 /* scroll lock stop output*/ -#define NUM 0x0002 /* numeric lock */ -#define CAPS 0x0004 /* capslock */ -#define SHIFT 0x0008 /* shift */ -#define CTRL 0x0010 /* control*/ -#define EXT 0x0020 /* extended scan code 0xe0 */ -#define ESC 0x0040 /* escape key press */ -#define E1 0x0080 /* extended scan code 0xe1 */ -#define BRK 0x0100 /* make break flag for keyboard */ -#define ALT 0x0200 /* right alt */ +#define I8042_DATA_REG 0x60 /* keyboard i/o buffer */ +#define I8042_STS_REG 0x64 /* keyboard status read */ +#define I8042_CMD_REG 0x64 /* keyboard ctrl write */ + +/* Status register bit defines */ +#define STATUS_OBF (1 << 0) +#define STATUS_IBF (1 << 1) + +/* Configuration byte bit defines */ +#define CONFIG_KIRQ_EN (1 << 0) +#define CONFIG_MIRQ_EN (1 << 1) +#define CONFIG_SET_BIST (1 << 2) +#define CONFIG_KCLK_DIS (1 << 4) +#define CONFIG_MCLK_DIS (1 << 5) +#define CONFIG_AT_TRANS (1 << 6) + +/* i8042 commands */ +#define CMD_RD_CONFIG 0x20 /* read configuration byte */ +#define CMD_WR_CONFIG 0x60 /* write configuration byte */ +#define CMD_SELF_TEST 0xaa /* controller self-test */ +#define CMD_KBD_DIS 0xad /* keyboard disable */ +#define CMD_KBD_EN 0xae /* keyboard enable */ +#define CMD_SET_KBD_LED 0xed /* set keyboard led */ +#define CMD_RESET_KBD 0xff /* reset keyboard */ + +/* i8042 command result */ +#define KBC_TEST_OK 0x55 +#define KBD_ACK 0xfa +#define KBD_POR 0xaa + +/* keyboard scan codes */ + +#define KBD_US 0 /* default US layout */ +#define KBD_GER 1 /* german layout */ + +#define KBD_TIMEOUT 1000 /* 1 sec */ +#define KBD_RESET_TRIES 3 + +#define AS 0 /* normal character index */ +#define SH 1 /* shift index */ +#define CN 2 /* control index */ +#define NM 3 /* numeric lock index */ +#define AK 4 /* right alt key */ +#define CP 5 /* capslock index */ +#define ST 6 /* stop output index */ +#define EX 7 /* extended code index */ +#define ES 8 /* escape and extended code index */ + +#define NORMAL 0x0000 /* normal key */ +#define STP 0x0001 /* scroll lock stop output*/ +#define NUM 0x0002 /* numeric lock */ +#define CAPS 0x0004 /* capslock */ +#define SHIFT 0x0008 /* shift */ +#define CTRL 0x0010 /* control*/ +#define EXT 0x0020 /* extended scan code 0xe0 */ +#define ESC 0x0040 /* escape key press */ +#define E1 0x0080 /* extended scan code 0xe1 */ +#define BRK 0x0100 /* make break flag for keyboard */ +#define ALT 0x0200 /* right alt */
/* exports */

On 24 August 2015 at 01:00, Bin Meng bmeng.cn@gmail.com wrote:
- Rename CamelCase variables to conform U-Boot coding convention
- Rename wait_until_kbd_output_full() to kbd_output_full()
- Change to use macros for i8042 command and control register bits
Signed-off-by: Bin Meng bmeng.cn@gmail.com Acked-by: Simon Glass sjg@chromium.org
Changes in v3: None Changes in v2:
- Split the original single patch into 3 patches
drivers/input/i8042.c | 230 ++++++++++++++++++++++++++------------------------ include/i8042.h | 103 ++++++++++++---------- 2 files changed, 177 insertions(+), 156 deletions(-)
Applied to u-boot-x86, thanks!

The existing i8042 keyboard controller driver has some issues. First of all, it does not issue a self-test command (0xaa) to the controller at the very beginning. Without this, the controller does not respond to any command at all. Secondly, it initializes the configuration byte register to turn on the keyboard's interrupt, as U-Boot does not normally allow interrupts to be processed. Finally, at the end of the initialization routine, it wrongly sets the controller to disable all interfaces including both keyboard and mouse.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Acked-by: Simon Glass sjg@chromium.org
---
Changes in v3: - Fix commit message per Simon's comments
Changes in v2: - Reorder this patch to follow the i8042 driver clean up patches
drivers/input/i8042.c | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-)
diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c index e8f59df..9b5fa32 100644 --- a/drivers/input/i8042.c +++ b/drivers/input/i8042.c @@ -454,51 +454,50 @@ static void kbd_conv_char(unsigned char scan_code)
static int kbd_reset(void) { - /* KB Reset */ + u8 config; + + /* controller self test */ if (kbd_input_empty() == 0) return -1; + out8(I8042_CMD_REG, CMD_SELF_TEST); + if (kbd_output_full() == 0) + return -1; + if (in8(I8042_DATA_REG) != KBC_TEST_OK) + return -1;
+ /* keyboard reset */ + if (kbd_input_empty() == 0) + return -1; out8(I8042_DATA_REG, CMD_RESET_KBD); - if (kbd_output_full() == 0) return -1; - if (in8(I8042_DATA_REG) != KBD_ACK) return -1; - if (kbd_output_full() == 0) return -1; - if (in8(I8042_DATA_REG) != KBD_POR) return -1;
+ /* set AT translation and disable irq */ if (kbd_input_empty() == 0) return -1; - - /* Set KBC mode */ - out8(I8042_CMD_REG, CMD_WR_CONFIG); - - if (kbd_input_empty() == 0) + out8(I8042_CMD_REG, CMD_RD_CONFIG); + if (kbd_output_full() == 0) return -1; - - out8(I8042_DATA_REG, - CONFIG_AT_TRANS | CONFIG_SET_BIST | CONFIG_KIRQ_EN); - + config = in8(I8042_DATA_REG); + config |= CONFIG_AT_TRANS; + config &= ~(CONFIG_KIRQ_EN | CONFIG_MIRQ_EN); if (kbd_input_empty() == 0) return -1; - - /* Enable Keyboard */ - out8(I8042_CMD_REG, CMD_KBD_EN); + out8(I8042_CMD_REG, CMD_WR_CONFIG); if (kbd_input_empty() == 0) return -1; + out8(I8042_DATA_REG, config);
- out8(I8042_CMD_REG, CMD_WR_CONFIG); + /* enable keyboard */ if (kbd_input_empty() == 0) return -1; - - out8(I8042_DATA_REG, - CONFIG_AT_TRANS | CONFIG_MCLK_DIS | - CONFIG_KCLK_DIS | CONFIG_SET_BIST); + out8(I8042_CMD_REG, CMD_KBD_EN); if (kbd_input_empty() == 0) return -1;

On 24 August 2015 at 01:00, Bin Meng bmeng.cn@gmail.com wrote:
The existing i8042 keyboard controller driver has some issues. First of all, it does not issue a self-test command (0xaa) to the controller at the very beginning. Without this, the controller does not respond to any command at all. Secondly, it initializes the configuration byte register to turn on the keyboard's interrupt, as U-Boot does not normally allow interrupts to be processed. Finally, at the end of the initialization routine, it wrongly sets the controller to disable all interfaces including both keyboard and mouse.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Acked-by: Simon Glass sjg@chromium.org
Changes in v3:
- Fix commit message per Simon's comments
Changes in v2:
- Reorder this patch to follow the i8042 driver clean up patches
drivers/input/i8042.c | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-)
Applied to u-boot-x86, thanks!

So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
--- In the long term, we should remove CONFIG_VGA_AS_SINGLE_DEVICE and treat the cfb_concole an output device only. The keyboard part should be moved out of cfb_console driver and be as a input device driver separately.
Changes in v3: None Changes in v2: None
drivers/video/cfb_console.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c index 30e0317..aa7ca86 100644 --- a/drivers/video/cfb_console.c +++ b/drivers/video/cfb_console.c @@ -2247,16 +2247,17 @@ __weak int board_video_skip(void)
int drv_video_init(void) { - int skip_dev_init; struct stdio_dev console_dev; bool have_keyboard; + bool __maybe_unused keyboard_ok = false;
/* Check if video initialization should be skipped */ if (board_video_skip()) return 0;
/* Init video chip - returns with framebuffer cleared */ - skip_dev_init = (video_init() == -1); + if (video_init() == -1) + return 0;
if (board_cfb_skip()) return 0; @@ -2272,11 +2273,9 @@ int drv_video_init(void) if (have_keyboard) { debug("KBD: Keyboard init ...\n"); #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE) - skip_dev_init |= (VIDEO_KBD_INIT_FCT == -1); + keyboard_ok = !(VIDEO_KBD_INIT_FCT == -1); #endif } - if (skip_dev_init) - return 0;
/* Init vga device */ memset(&console_dev, 0, sizeof(console_dev)); @@ -2287,7 +2286,7 @@ int drv_video_init(void) console_dev.puts = video_puts; /* 'puts' function */
#if !defined(CONFIG_VGA_AS_SINGLE_DEVICE) - if (have_keyboard) { + if (have_keyboard && keyboard_ok) { /* Also init console device */ console_dev.flags |= DEV_FLAGS_INPUT; console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */

Hi Anatolkij,
On 24 August 2015 at 02:00, Bin Meng bmeng.cn@gmail.com wrote:
So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
What are your thoughts on this patch, please?
In the long term, we should remove CONFIG_VGA_AS_SINGLE_DEVICE and treat the cfb_concole an output device only. The keyboard part should be moved out of cfb_console driver and be as a input device driver separately.
Changes in v3: None Changes in v2: None
drivers/video/cfb_console.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c index 30e0317..aa7ca86 100644 --- a/drivers/video/cfb_console.c +++ b/drivers/video/cfb_console.c @@ -2247,16 +2247,17 @@ __weak int board_video_skip(void)
int drv_video_init(void) {
int skip_dev_init; struct stdio_dev console_dev; bool have_keyboard;
bool __maybe_unused keyboard_ok = false; /* Check if video initialization should be skipped */ if (board_video_skip()) return 0; /* Init video chip - returns with framebuffer cleared */
skip_dev_init = (video_init() == -1);
if (video_init() == -1)
return 0; if (board_cfb_skip()) return 0;
@@ -2272,11 +2273,9 @@ int drv_video_init(void) if (have_keyboard) { debug("KBD: Keyboard init ...\n"); #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE)
skip_dev_init |= (VIDEO_KBD_INIT_FCT == -1);
keyboard_ok = !(VIDEO_KBD_INIT_FCT == -1);
#endif }
if (skip_dev_init)
return 0; /* Init vga device */ memset(&console_dev, 0, sizeof(console_dev));
@@ -2287,7 +2286,7 @@ int drv_video_init(void) console_dev.puts = video_puts; /* 'puts' function */
#if !defined(CONFIG_VGA_AS_SINGLE_DEVICE)
if (have_keyboard) {
if (have_keyboard && keyboard_ok) { /* Also init console device */ console_dev.flags |= DEV_FLAGS_INPUT; console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */
-- 1.8.2.1
Regards, Simon

Hi Simon,
On Mon, 24 Aug 2015 22:13:41 -0600 Simon Glass sjg@chromium.org wrote:
On 24 August 2015 at 02:00, Bin Meng bmeng.cn@gmail.com wrote:
So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
What are your thoughts on this patch, please?
it is okay for me, please merge it with other patches in this series.
Thanks,
Anatolij

On 25 August 2015 at 00:54, Anatolij Gustschin agust@denx.de wrote:
Hi Simon,
On Mon, 24 Aug 2015 22:13:41 -0600 Simon Glass sjg@chromium.org wrote:
On 24 August 2015 at 02:00, Bin Meng bmeng.cn@gmail.com wrote:
So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
What are your thoughts on this patch, please?
it is okay for me, please merge it with other patches in this series.
Thanks,
Anatolij
Applied to u-boot-x86, thanks!

Hi Bin,
On Mon, 24 Aug 2015 01:00:07 -0700 Bin Meng bmeng.cn@gmail.com wrote:
So far if CONFIG_VGA_AS_SINGLE_DEVICE is not defined, the VGA device will try to initialize a keyboard device (for x86, it is i8042). But if i8042 controller initialization fails (eg: there is no keyboard connected to the PS/2 port), drv_video_init() just simply returns. This kills the opportunity of using a usb keyboard later with the vga console, as the vga initialization part is actually ok, only keyboard part fails. Change the code logic to allow this.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
Acked-by: Anatolij Gustschin agust@denx.de

So far we only enabled one legacy serial port on the SMSC LPC47m superio chipset on Intel Crown Bay board. As the board also has dual PS/2 ports routed out, enable the keyboard controller which is i8042 compatible so that we can use PS/2 keyboard and mouse.
In order to make PS/2 keyboard work with the VGA console, remove CONFIG_VGA_AS_SINGLE_DEVICE. To boot Linux kernel with PIC mode using PIRQ routing table, adjust the mask in the device tree to reserve irq12 which is used by PS/2 mouse.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
---
Changes in v3: None Changes in v2: None
arch/x86/dts/crownbay.dts | 2 +- board/intel/crownbay/crownbay.c | 7 ++++--- include/configs/crownbay.h | 3 --- 3 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/arch/x86/dts/crownbay.dts b/arch/x86/dts/crownbay.dts index 3af9cc3..800901c 100644 --- a/arch/x86/dts/crownbay.dts +++ b/arch/x86/dts/crownbay.dts @@ -168,7 +168,7 @@ compatible = "intel,irq-router"; intel,pirq-config = "pci"; intel,pirq-link = <0x60 8>; - intel,pirq-mask = <0xdee0>; + intel,pirq-mask = <0xcee0>; intel,pirq-routing = < /* TunnelCreek PCI devices */ PCI_BDF(0, 2, 0) INTA PIRQE diff --git a/board/intel/crownbay/crownbay.c b/board/intel/crownbay/crownbay.c index ad2d5b6..d6de9fa 100644 --- a/board/intel/crownbay/crownbay.c +++ b/board/intel/crownbay/crownbay.c @@ -10,11 +10,12 @@ #include <netdev.h> #include <smsc_lpc47m.h>
-#define SERIAL_DEV PNP_DEV(0x2e, 4) - int board_early_init_f(void) { - lpc47m_enable_serial(SERIAL_DEV, UART0_BASE, UART0_IRQ); + lpc47m_enable_serial(PNP_DEV(LPC47M_IO_PORT, LPC47M_SP1), + UART0_BASE, UART0_IRQ); + lpc47m_enable_kbc(PNP_DEV(LPC47M_IO_PORT, LPC47M_KBC), + KBD_IRQ, MSE_IRQ);
return 0; } diff --git a/include/configs/crownbay.h b/include/configs/crownbay.h index e87bd54..32b6006 100644 --- a/include/configs/crownbay.h +++ b/include/configs/crownbay.h @@ -54,9 +54,6 @@ #define CONFIG_PCH_GBE #define CONFIG_PHYLIB
-/* TunnelCreek IGD support */ -#define CONFIG_VGA_AS_SINGLE_DEVICE - /* Environment configuration */ #define CONFIG_ENV_SECT_SIZE 0x1000 #define CONFIG_ENV_OFFSET 0

On 24 August 2015 at 01:00, Bin Meng bmeng.cn@gmail.com wrote:
So far we only enabled one legacy serial port on the SMSC LPC47m superio chipset on Intel Crown Bay board. As the board also has dual PS/2 ports routed out, enable the keyboard controller which is i8042 compatible so that we can use PS/2 keyboard and mouse.
In order to make PS/2 keyboard work with the VGA console, remove CONFIG_VGA_AS_SINGLE_DEVICE. To boot Linux kernel with PIC mode using PIRQ routing table, adjust the mask in the device tree to reserve irq12 which is used by PS/2 mouse.
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
Changes in v3: None Changes in v2: None
arch/x86/dts/crownbay.dts | 2 +- board/intel/crownbay/crownbay.c | 7 ++++--- include/configs/crownbay.h | 3 --- 3 files changed, 5 insertions(+), 7 deletions(-)
Applied to u-boot-x86, thanks!

Remove unused CONFIG_USE_CPCIDVI wrapped codes.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
---
Changes in v3: - New patch to remove unused codes in ct69000 driver
Changes in v2: None
drivers/video/ct69000.c | 21 --------------------- 1 file changed, 21 deletions(-)
diff --git a/drivers/video/ct69000.c b/drivers/video/ct69000.c index 168b9ba..22b3441 100644 --- a/drivers/video/ct69000.c +++ b/drivers/video/ct69000.c @@ -256,9 +256,6 @@ struct ctfb_chips_properties {
static const struct ctfb_chips_properties chips[] = { {PCI_DEVICE_ID_CT_69000, 0x200000, 1, 4, -2, 3, 257, 100, 220}, -#ifdef CONFIG_USE_CPCIDVI - {PCI_DEVICE_ID_CT_69030, 0x400000, 1, 4, -2, 3, 257, 100, 220}, -#endif {PCI_DEVICE_ID_CT_65555, 0x100000, 16, 4, 0, 1, 255, 48, 220}, /* NOT TESTED */ {0, 0, 0, 0, 0, 0, 0, 0, 0} /* Terminator */ }; @@ -944,9 +941,6 @@ SetDrawingEngine (int bits_per_pixel) */ static struct pci_device_id supported[] = { {PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69000}, -#ifdef CONFIG_USE_CPCIDVI - {PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69030}, -#endif {} };
@@ -1111,22 +1105,7 @@ video_hw_init (void) pGD->cprBase = pci_mem_base; /* Dummy */ /* set up Hardware */
-#ifdef CONFIG_USE_CPCIDVI - if (device_id == PCI_DEVICE_ID_CT_69030) { - ctWrite (CT_MSR_W_O, 0x0b); - ctWrite (0x3cd, 0x13); - ctWrite_i (CT_FP_O, 0x02, 0x00); - ctWrite_i (CT_FP_O, 0x05, 0x00); - ctWrite_i (CT_FP_O, 0x06, 0x00); - ctWrite (0x3c2, 0x0b); - ctWrite_i (CT_FP_O, 0x02, 0x10); - ctWrite_i (CT_FP_O, 0x01, 0x09); - } else { - ctWrite (CT_MSR_W_O, 0x01); - } -#else ctWrite (CT_MSR_W_O, 0x01); -#endif
/* set the extended Registers */ ctLoadRegs (CT_XR_O, xreg);

On 24 August 2015 at 02:00, Bin Meng bmeng.cn@gmail.com wrote:
Remove unused CONFIG_USE_CPCIDVI wrapped codes.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Changes in v3:
- New patch to remove unused codes in ct69000 driver
Changes in v2: None
drivers/video/ct69000.c | 21 --------------------- 1 file changed, 21 deletions(-)
Acked-by: Simon Glass sjg@chromium.org

On Mon, 24 Aug 2015 01:00:09 -0700 Bin Meng bmeng.cn@gmail.com wrote:
Remove unused CONFIG_USE_CPCIDVI wrapped codes.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Acked-by: Anatolij Gustschin agust@denx.de

On 25 August 2015 at 00:49, Anatolij Gustschin agust@denx.de wrote:
On Mon, 24 Aug 2015 01:00:09 -0700 Bin Meng bmeng.cn@gmail.com wrote:
Remove unused CONFIG_USE_CPCIDVI wrapped codes.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Acked-by: Anatolij Gustschin agust@denx.de
Applied to u-boot-x86, thanks!

On 24 August 2015 at 02:00, Bin Meng bmeng.cn@gmail.com wrote:
Remove unused CONFIG_USE_CPCIDVI wrapped codes.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Changes in v3:
- Keep i8042_flush(), i8042_disable() and board_i8042_skip()
Changes in v2:
- Split the removing of unused codes into this patch
drivers/input/i8042.c | 17 ----------------- 1 file changed, 17 deletions(-)
Acked-by: Simon Glass sjg@chromium.org

On 24 August 2015 at 21:13, Simon Glass sjg@chromium.org wrote:
On 24 August 2015 at 02:00, Bin Meng bmeng.cn@gmail.com wrote:
Remove unused CONFIG_USE_CPCIDVI wrapped codes.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Changes in v3:
- Keep i8042_flush(), i8042_disable() and board_i8042_skip()
Changes in v2:
- Split the removing of unused codes into this patch
drivers/input/i8042.c | 17 ----------------- 1 file changed, 17 deletions(-)
Acked-by: Simon Glass sjg@chromium.org
I'm also going to apply this series as a bug-fix since it corrects the i8042 controller init, etc.
Applied to u-boot-x86, thanks!
participants (3)
-
Anatolij Gustschin
-
Bin Meng
-
Simon Glass