mirror of https://github.com/0Nera/BMOSP.git
Вынос кода в модуль ps/2
This commit is contained in:
parent
1d06b2443d
commit
e36201c412
|
@ -1,3 +1,3 @@
|
|||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 1
|
||||
#define VERSION_BUILD 870
|
||||
#define VERSION_BUILD 877
|
||||
|
|
|
@ -61,7 +61,7 @@ void isr_generic(struct frame state) {
|
|||
if (isr[state.int_number]) { isr[state.int_number](&state); }
|
||||
|
||||
if (state.int_number >= 39) { outb(0xA0, 0x20); }
|
||||
// outb(0x20, 0x20);
|
||||
outb(0x20, 0x20);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -40,7 +40,6 @@ common:
|
|||
movq 104(%rsp), %rsi
|
||||
movq 112(%rsp), %rdi
|
||||
addq $136, %rsp
|
||||
sti
|
||||
iretq
|
||||
entry0:
|
||||
pushq $0
|
||||
|
|
|
@ -40,37 +40,5 @@ void _start( ) {
|
|||
|
||||
asm volatile("sti");
|
||||
|
||||
for (;;) {
|
||||
if (!(inb(0x64) & 1)) {
|
||||
io_wait( );
|
||||
continue;
|
||||
}
|
||||
uint64_t byte = inb(0x60);
|
||||
switch (byte) {
|
||||
case 0x1: // Клавиша "ESCAPE"
|
||||
LOG("Выход для Bochs\n");
|
||||
outw(0xB004, 0x2000);
|
||||
|
||||
LOG("Выход для Qemu\n");
|
||||
outw(0x604, 0x2000);
|
||||
|
||||
LOG("Выход для Virtualbox\n");
|
||||
outw(0x4004, 0x3400);
|
||||
|
||||
LOG("Выход для облачного гипервизора\n");
|
||||
outw(0x600, 0x34);
|
||||
break;
|
||||
case 0x4F: // Клавиша "END"
|
||||
LOG("Вызов прерывания переключения задач!\n");
|
||||
asm volatile("int $32");
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
uint8_t status = inb(0x61);
|
||||
|
||||
status |= 1;
|
||||
|
||||
outb(0x61, status);
|
||||
}
|
||||
for (;;) { asm volatile("hlt"); }
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
#/bin/sh
|
||||
echo "Название: PS/2"
|
||||
echo "Лицензия: Публичное достояние"
|
||||
|
||||
|
||||
CC="gcc"
|
||||
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -static -nostdlib "
|
||||
|
||||
if [ -d "../../sdk" ]; then
|
||||
CC="../../sdk/bin/x86_64-elf-gcc"
|
||||
fi
|
||||
|
||||
|
||||
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o ps2.o
|
||||
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none ps2.o -o ps2.ko
|
||||
|
||||
cp ps2.ko ../bin/
|
||||
|
||||
echo "Сборка завершена, файл: ps2.ko"
|
|
@ -0,0 +1,48 @@
|
|||
#include <system.h>
|
||||
|
||||
static void handler( ) {
|
||||
for (;;) {
|
||||
if (!(inb(0x64) & 1)) { continue; }
|
||||
uint64_t byte = inb(0x60);
|
||||
switch (byte) {
|
||||
case 0x1: // Клавиша "ESCAPE"
|
||||
fb_printf("Выход для Bochs\n");
|
||||
outw(0xB004, 0x2000);
|
||||
|
||||
fb_printf("Выход для Qemu\n");
|
||||
outw(0x604, 0x2000);
|
||||
|
||||
fb_printf("Выход для Virtualbox\n");
|
||||
outw(0x4004, 0x3400);
|
||||
|
||||
fb_printf("Выход для облачного гипервизора\n");
|
||||
outw(0x600, 0x34);
|
||||
break;
|
||||
case 0x4F: // Клавиша "END"
|
||||
fb_printf("Вызов прерывания переключения задач!\n");
|
||||
asm volatile("int $32");
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
uint8_t status = inb(0x61);
|
||||
|
||||
status |= 1;
|
||||
|
||||
outb(0x61, status);
|
||||
}
|
||||
}
|
||||
|
||||
module_info_t __attribute__((section(".minit"))) init(env_t *env) {
|
||||
init_env(env);
|
||||
|
||||
return (module_info_t){ .name = (char *)"[KEYBOARD]",
|
||||
.message = (char *)"PS/2 драйвер",
|
||||
.type = 0,
|
||||
.data_size = 0,
|
||||
.data = (void *)0,
|
||||
.err_code = 0,
|
||||
.module_id = 0,
|
||||
.irq = 33,
|
||||
.irq_handler = handler };
|
||||
}
|
Loading…
Reference in New Issue