boot: Use BIOS calls to read keyboard, which should work for USB
This commit is contained in:
parent
de09abf2dd
commit
887bbc45a0
12
boot/boot.S
12
boot/boot.S
@ -252,6 +252,10 @@ do_bios_call.1:
|
||||
cmp %bx, %ax
|
||||
je do_bios_call.set_mode
|
||||
|
||||
mov $0x04, %ax
|
||||
cmp %bx, %ax
|
||||
je do_bios_call.test_key
|
||||
|
||||
/* Else: Bad call, jump to loop. */
|
||||
jmp do_bios_call.done
|
||||
|
||||
@ -277,6 +281,14 @@ do_bios_call.set_mode:
|
||||
int $0x10
|
||||
jmp do_bios_call.done
|
||||
|
||||
do_bios_call.test_key:
|
||||
movl 36(%esp), %ebx
|
||||
xor %ax, %ax
|
||||
mov %bl, %ah
|
||||
int $0x16
|
||||
movl %eax, 20(%esp)
|
||||
jmp do_bios_call.done
|
||||
|
||||
do_bios_call.done:
|
||||
/* Disable interrupts again */
|
||||
cli
|
||||
|
14
boot/kbd.c
14
boot/kbd.c
@ -166,16 +166,22 @@ int read_key(int * c) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern int do_bios_call(unsigned int function, unsigned int arg1);
|
||||
|
||||
int kbd_status(void) {
|
||||
int result = do_bios_call(4,0x11);
|
||||
return (result & 0xFF) == 0;
|
||||
}
|
||||
|
||||
int read_scancode(int timeout) {
|
||||
if (timeout) {
|
||||
int start_s = read_cmos_seconds();
|
||||
while (!(inportb(0x64) & 1)) {
|
||||
while (kbd_status()) {
|
||||
int now_s = read_cmos_seconds();
|
||||
if (now_s != start_s) return -1;
|
||||
}
|
||||
} else {
|
||||
while (!(inportb(0x64) & 1));
|
||||
}
|
||||
return inportb(0x60);
|
||||
int result = do_bios_call(4,0);
|
||||
return result >> 8;
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user