x86: i8042: Correctly initialize the controller
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>
This commit is contained in:
parent
835dd00050
commit
7d96166b1b
1 changed files with 23 additions and 24 deletions
|
@ -454,54 +454,53 @@ 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_DATA_REG, CMD_RESET_KBD);
|
||||
|
||||
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;
|
||||
out8(I8042_CMD_REG, CMD_RD_CONFIG);
|
||||
if (kbd_output_full() == 0)
|
||||
return -1;
|
||||
config = in8(I8042_DATA_REG);
|
||||
config |= CONFIG_AT_TRANS;
|
||||
config &= ~(CONFIG_KIRQ_EN | CONFIG_MIRQ_EN);
|
||||
if (kbd_input_empty() == 0)
|
||||
return -1;
|
||||
|
||||
/* Set KBC mode */
|
||||
out8(I8042_CMD_REG, CMD_WR_CONFIG);
|
||||
|
||||
if (kbd_input_empty() == 0)
|
||||
return -1;
|
||||
out8(I8042_DATA_REG, config);
|
||||
|
||||
out8(I8042_DATA_REG,
|
||||
CONFIG_AT_TRANS | CONFIG_SET_BIST | CONFIG_KIRQ_EN);
|
||||
|
||||
/* enable keyboard */
|
||||
if (kbd_input_empty() == 0)
|
||||
return -1;
|
||||
|
||||
/* Enable Keyboard */
|
||||
out8(I8042_CMD_REG, CMD_KBD_EN);
|
||||
if (kbd_input_empty() == 0)
|
||||
return -1;
|
||||
|
||||
out8(I8042_CMD_REG, CMD_WR_CONFIG);
|
||||
if (kbd_input_empty() == 0)
|
||||
return -1;
|
||||
|
||||
out8(I8042_DATA_REG,
|
||||
CONFIG_AT_TRANS | CONFIG_MCLK_DIS |
|
||||
CONFIG_KCLK_DIS | CONFIG_SET_BIST);
|
||||
if (kbd_input_empty() == 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue