135 lines
3.5 KiB
C
135 lines
3.5 KiB
C
#include <asm/head.h>
|
|
#include "init_kbd.h"
|
|
|
|
#include "../boot_io.h"
|
|
|
|
#undef DEBUG_KBD_MODE
|
|
#undef DebugKBD
|
|
#define DEBUG_KBD_MODE 0 /* keyboard debug */
|
|
#define DebugKBD if (DEBUG_KBD_MODE) rom_printk
|
|
|
|
void wait_kbd_write(void)
|
|
{
|
|
unsigned char in = bios_inb(KBD_STATUS_REG);
|
|
while (in & KBD_STAT_IBF) {
|
|
in = bios_inb(KBD_STATUS_REG);
|
|
}
|
|
}
|
|
|
|
void wait_kbd_read(void)
|
|
{
|
|
unsigned char in = bios_inb(KBD_STATUS_REG);
|
|
DebugKBD("wait_kbd_read() status 0x%x\n", in);
|
|
while ((~in) & KBD_STAT_OBF) {
|
|
in = bios_inb(KBD_STATUS_REG);
|
|
DebugKBD("wait_kbd_read() while status 0x%x\n", in);
|
|
}
|
|
}
|
|
|
|
void send_kbd_cmd(unsigned int cmd)
|
|
{
|
|
wait_kbd_write();
|
|
DebugKBD("send_kbd_cmd() cmd 0x%x\n", cmd);
|
|
bios_outb(cmd, KBD_CNTL_REG);
|
|
}
|
|
|
|
void send_kbd_data(unsigned int data)
|
|
{
|
|
wait_kbd_write();
|
|
DebugKBD("send_kbd_data() data out 0x%x\n", data);
|
|
bios_outb(data, KBD_DATA_REG);
|
|
}
|
|
|
|
unsigned int recv_kbd_data(void)
|
|
{
|
|
unsigned int in;
|
|
wait_kbd_read();
|
|
in = (unsigned int)bios_inb(KBD_DATA_REG);
|
|
DebugKBD("recv_kbd_data() data in 0x%x\n", in);
|
|
return in;
|
|
}
|
|
|
|
void init_kbd(void)
|
|
{
|
|
int check = 0;
|
|
rom_printk("kbd init ...\n");
|
|
// init KBC
|
|
send_kbd_cmd(KBD_CCMD_KBD_DISABLE);
|
|
check = 1;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_cmd(KBD_CCMD_SELF_TEST);
|
|
if (recv_kbd_data() != 0x55) goto failed;
|
|
check = 2;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_cmd(KBD_CCMD_GET_VERSION);
|
|
recv_kbd_data();
|
|
check = 3;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_cmd(KBD_CCMD_KBD_TEST);
|
|
if (recv_kbd_data() != 0x00) goto failed;
|
|
check = 4;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_cmd(KBD_CCMD_KBD_ENABLE);
|
|
//
|
|
check = 5;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
#if 1
|
|
send_kbd_data(KBD_CMD_RESET);
|
|
if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
if (recv_kbd_data() != KBD_REPLY_POR) goto failed;
|
|
check = 6;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(KBD_CMD_DISABLE);
|
|
if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
check = 7;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(KBD_CMD_SET_LEDS);
|
|
if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
check = 8;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(0x07);
|
|
if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
check = 9;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(KBD_CMD_ECHO);
|
|
if (recv_kbd_data() != 0xee) goto failed;
|
|
check = 10;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(KBD_CMD_READ_ID);
|
|
if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
check = 11;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
recv_kbd_data();
|
|
recv_kbd_data();
|
|
check = 12;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(KBD_CMD_SET_RATE);
|
|
if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
check = 13;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(0x0);
|
|
// if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
check = 14;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(KBD_CMD_SET_LEDS);
|
|
if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
check = 15;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(0x0);
|
|
if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
check = 16;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_data(KBD_CMD_ENABLE);
|
|
if (recv_kbd_data() != KBD_REPLY_ACK) goto failed;
|
|
check = 17;
|
|
DebugKBD("init_kbd() check #%d\n", check);
|
|
send_kbd_cmd(KBD_CCMD_WRITE_MODE);
|
|
send_kbd_data(KBD_MODE_KBD_INT | KBD_MODE_SYS | KBD_MODE_KCC);
|
|
#endif
|
|
rom_printk("kbd init passed ...\n");
|
|
return;
|
|
failed:
|
|
rom_printk("kbd init faled... check %d\n", check);
|
|
return;
|
|
}
|