mirror of
https://github.com/yourtion/30dayMakeOS.git
synced 2026-02-03 01:53:24 +08:00
45 lines
909 B
C
45 lines
909 B
C
/* 键盘控制代码 */
|
|
|
|
#include "bootpack.h"
|
|
|
|
struct FIFO32 *keyfifo;
|
|
int keydata0;
|
|
|
|
void inthandler21(int *esp)
|
|
{
|
|
int data;
|
|
io_out8(PIC0_OCW2, 0x61); /* 把IRQ-01接收信号结束的信息通知给PIC */
|
|
data = io_in8(PORT_KEYDAT);
|
|
fifo32_put(keyfifo, data + keydata0);
|
|
return;
|
|
}
|
|
|
|
#define PORT_KEYSTA 0x0064
|
|
#define KEYSTA_SEND_NOTREADY 0x02
|
|
#define KEYCMD_WRITE_MODE 0x60
|
|
#define KBC_MODE 0x47
|
|
|
|
void wait_KBC_sendready(void)
|
|
{
|
|
/* 等待键盘控制电路准备完毕 */
|
|
for (;;) {
|
|
if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) {
|
|
break;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
void init_keyboard(struct FIFO32 *fifo, int data0)
|
|
{
|
|
/* 将FIFO缓冲区的信息保存到全局变量里 */
|
|
keyfifo = fifo;
|
|
keydata0 = data0;
|
|
/* 键盘控制器的初始化 */
|
|
wait_KBC_sendready();
|
|
io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);
|
|
wait_KBC_sendready();
|
|
io_out8(PORT_KEYDAT, KBC_MODE);
|
|
return;
|
|
}
|