Вынос кода в модуль ps/2

This commit is contained in:
Aren Elchinyan 2023-12-15 00:39:28 +03:00
parent 1d06b2443d
commit e36201c412
6 changed files with 70 additions and 36 deletions

View File

@ -1,3 +1,3 @@
#define VERSION_MAJOR 0
#define VERSION_MINOR 1
#define VERSION_BUILD 870
#define VERSION_BUILD 877

View File

@ -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);
}
}

View File

@ -40,7 +40,6 @@ common:
movq 104(%rsp), %rsi
movq 112(%rsp), %rdi
addq $136, %rsp
sti
iretq
entry0:
pushq $0

View File

@ -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"); }
}

19
modules/ps2/build.sh Normal file
View File

@ -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"

48
modules/ps2/main.c Normal file
View File

@ -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 };
}