From 8e6cc9a56448c81c5ba83fa7ef51bca4c7dc6ad8 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Wed, 24 Apr 2019 22:40:12 +0200 Subject: [PATCH] Keyboard works ! --- kaleid/kernel/init/init.c | 14 ++++---- kaleid/kernel/io/keyb.c | 71 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 11 deletions(-) diff --git a/kaleid/kernel/init/init.c b/kaleid/kernel/init/init.c index 4f03219..fb67032 100644 --- a/kaleid/kernel/init/init.c +++ b/kaleid/kernel/init/init.c @@ -38,6 +38,7 @@ extern error_t IoInitVGABuffer(void); //io/keyb.c extern void IoSetupKeyb(void); +extern void IoEnableKeyb(void); //io/rtc.c extern void IoSetupRtc(void); @@ -87,21 +88,20 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg) // Drivers ISR inits IoSetupRtc(); + IoSetupKeyb(); // Interrupts launching IdtSetup(); KeEnableIRQs(); // Drivers enabling IoEnableRtc(); + IoEnableKeyb(); while (1) { - asm volatile ("hlt"); - if (IoRtcTicks > 2000) { - KernLog("CC\n"); - break; - } - } - KernLog("\nGoodbye after %d ticks", IoRtcTicks); + } + + + KernLog("\nGoodbye after %d ticks", IoRtcTicks); // End this machine's suffering BFlushBuf(BStdOut); KeCrashSystem(); diff --git a/kaleid/kernel/io/keyb.c b/kaleid/kernel/io/keyb.c index 6184e16..b41ddf9 100644 --- a/kaleid/kernel/io/keyb.c +++ b/kaleid/kernel/io/keyb.c @@ -24,18 +24,83 @@ #include #include +#include extern void KeybIsr(void); extern void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags); extern void SendEOItoPIC(void); +char ScanCodes[100] = { 0 }; void IoSetupKeyb(void) { IdtRegisterIrq(KeybIsr, 0x21, 0x8E); } +void KeybPrint(char code) +{ + if (code) { + bprintf(BStdOut, "%c", ScanCodes[(int)code]); + BFlushBuf(BStdOut); + } +} -uchar KeybHandler(void) +void ScanCodesInit(void) +{ + ScanCodes[0x02] = '1'; + ScanCodes[0x03] = '2'; + ScanCodes[0x04] = '3'; + ScanCodes[0x05] = '4'; + ScanCodes[0x06] = '5'; + ScanCodes[0x07] = '6'; + ScanCodes[0x08] = '7'; + ScanCodes[0x09] = '8'; + ScanCodes[0x0A] = '9'; + ScanCodes[0x0B] = '0'; + + ScanCodes[0x10] = 'a'; + ScanCodes[0x11] = 'z'; + ScanCodes[0x12] = 'e'; + ScanCodes[0x13] = 'r'; + ScanCodes[0x14] = 't'; + ScanCodes[0x15] = 'y'; + ScanCodes[0x16] = 'u'; + ScanCodes[0x17] = 'i'; + ScanCodes[0x18] = 'o'; + ScanCodes[0x19] = 'p'; + + ScanCodes[0x1E] = 'q'; + ScanCodes[0x1F] = 's'; + ScanCodes[0x20] = 'd'; + ScanCodes[0x21] = 'f'; + ScanCodes[0x22] = 'g'; + ScanCodes[0x23] = 'h'; + ScanCodes[0x24] = 'j'; + ScanCodes[0x25] = 'k'; + ScanCodes[0x26] = 'l'; + + ScanCodes[0x2C] = 'w'; + ScanCodes[0x2D] = 'x'; + ScanCodes[0x2E] = 'c'; + ScanCodes[0x2F] = 'v'; + ScanCodes[0x30] = 'b'; + ScanCodes[0x31] = 'n'; + ScanCodes[0x32] = 'm'; + + ScanCodes[0x1C] = '\n'; + ScanCodes[0x39] = ' '; +} + +void IoEnableKeyb(void) +{ + ulong flags = KePauseIRQs(); + char readedInterruptConfig = IoReadByteFromPort(0x21); + IoWriteByteOnPort(0x21, 0xFD & readedInterruptConfig); + KeRestoreIRQs(flags); + + ScanCodesInit(); +} + +void KeybHandler(void) { char status; char code = 0; @@ -50,7 +115,5 @@ uchar KeybHandler(void) if(code < 0) code = 0; } - - return code; + KeybPrint((int)code); } -