diff --git a/.bochsrc b/.bochsrc index c3cac63..80a00d7 100644 --- a/.bochsrc +++ b/.bochsrc @@ -39,5 +39,5 @@ debug: action=ignore pass: action=fatal keyboard_mapping: enabled=0, map= keyboard_type: mf -user_shortcut: keys=none +user_shortcut: keys=ctrlaltdel # no cmosimage diff --git a/kernel/Makefile b/kernel/Makefile index 3279a10..f704008 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -17,7 +17,7 @@ LD_FLAGS=-nodefaultlibs -nostdlib --no-demangle -T link.ld all: Asm_Kernel C_Kernel $(LD) $(LD_FLAGS) -Map kernel.map boot.o kernel.o asmfuncs.o mm.o vmm.o parallel.o \ - conv.o kout.o vconsole.o console.o devices.o pic.o -o kernel.bin + conv.o kout.o vconsole.o console.o devices.o pic.o keyboard.o -o kernel.bin Asm_Kernel: $(NASM) $(NASM_FLAGS) -l boot.lst boot.asm -o boot.o @@ -34,6 +34,7 @@ C_Kernel: $(CC) $(CC_FLAGS) -c fs/devices.c -o devices.o $(CC) $(CC_FLAGS) -c console.c -o console.o $(CC) $(CC_FLAGS) -c sys/pic.c -o pic.o + $(CC) $(CC_FLAGS) -c char/keyboard.c -o keyboard.o ################################################# # Clean up the source directory of any binaries # diff --git a/kernel/char/keyboard.c b/kernel/char/keyboard.c index e16f5e3..2e9a1bd 100644 --- a/kernel/char/keyboard.c +++ b/kernel/char/keyboard.c @@ -8,35 +8,49 @@ #include "sys/io.h" #include "sys/pic.h" #include "functions.h" +#include "kout.h" #define KBD_BUFFER_LENGTH 64 -u8_t kbdFlags = 0; //holds current keyboard flags - caps/num/scroll/shift/ctrl/alt -u8_t kbdAscii = 0; //holds ASCII value of a key pressed -u8_t kbdScan = 0; //holds the keyboard scan code of a key pressed - -u32_t kbdBuffer[KBD_BUFFER_LENGTH]; //a buffer for all keypresses -int kbdBufferStart = 0; //position of next key in buffer -int kbdBufferLen = 0; //number of keys left in the buffer -u8_t kbdExt = 0; //# of extended key codes left to input -u8_t kbdExt2 = 0; //# of 2nd-set-extended key codes left to input -u8_t ackReason = 0; //used to record the reason why we would get an acknowledge u8_t (0xFA) +u8_t kbdFlags = 0; // holds current keyboard flags - caps/num/scroll/shift/ctrl/alt +char lastWasE0 = 0; // was the last byte 0x0E ? +u32_t kbdBuffer[KBD_BUFFER_LENGTH]; // a buffer for all keypresses +int kbdBufferStart = 0; // position of next key in buffer +int kbdBufferLen = 0; // number of keys left in the buffer +u8_t rawIgnore = 0; // how many signals to blatantly ignore +u8_t ackReason = 0; // used to record the reason why we would get an acknowledge byte (0xFA) //these arrays convert a keyboard scan code to an ASCII character value - //nul esc bksp tab lctl lsft rsft lalt caps F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 numScrlNumPad------- unknown---- F11 F12 unknown.... -const u8_t SCAN2ASCII[129] = "\000\0331234567890-=\010\011qwertyuiop[]\n\001asdfghjkl;'`\001\\zxcvbnm,./\001*\001 \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001-\001\001\001+\001\001\001\001\001\002\002\002\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002"; -const u8_t SCAN2ASCIISHIFT[129] = "\000\033!@#$%^&*()_+\010\011QWERTYUIOP{}\n\001ASDFGHJKL:\"~\001|ZXCVBNM<>?\001*\001 \001\001\001\001\001\001\001\001\001\001\001\001\001789-456+1230.\002\002\002\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002"; +const u8_t SCAN2ASCII[129] = + "\000\0331234567890-=\010\011" // null,esc,1234567890-=,bksp,tab + "qwertyuiop[]\n\000as" // qwertyuiop[],enter,lctrl,as + "dfghjkl;'`\000\\zxcv" // dfghjkl;'`,lshift,\zxcv + "bnm,./\000*\000 \000\000\000\000\000\000" // bnm,./,rshift,*,alt,space,caps,f1,f2,f3,f4,f5 + "\000\000\000\000\000\000\000\000\000\000-\000\000\000+\000" // f6,f7,f8,f9,f10,num,scrl,home,up,pgup,dash,left,center,right,plus,end + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" // down,pgdn,ins,del,?,?,?,f11,f12,?,?,winL,winR,menu,?,? + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" // ? + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"; // ? +const u8_t SCAN2ASCII2[129] = + "\000\033!@#$%^&*()_+\010\011" + "QWERTYUIOP{}\n\000AS" + "DFGHJKL:\"~\000|ZXCV" + "BNM<>?\000*\000 \000\000\000\000\000\000" + "\000\000\000\000\000\000\000789-456+1" + "230.\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"; //====FUNCTIONS: // The Keyboard Interrupt Service Routine void isr_keyboard() { kbdScan = inportb(0x60); - //printf("\nKEYBOARD INTERRUPT: 0x%x", kbdScan); + kprintf("KEYBOARD INTERRUPT: 0x%x\n", kbdScan); u8_t inState = inportb(0x61); outportb(0x61, inState|0x80); outportb(0x61, inState); + return; //printf("IRQ 1: %x\n", kbdScan); @@ -49,13 +63,13 @@ void isr_keyboard() } ackReason = 0; } - if (kbdScan == 224) //extended key + if (kbdScan == 224) // 0xE0 == extended key { kbdExt = 1; pic_eoi(); return; } - if (kbdScan == 225) //2nd-set-extended key + if (kbdScan == 225) // 0xE1 == 2nd-set-extended key { kbdExt2 = 2; pic_eoi(); @@ -180,7 +194,7 @@ void isr_keyboard() // printf("kbdScan == %d\nkbdAscii == %d\nkbdFlags == %d\n", kbdScan, kbdAscii, kbdFlags); if ((kbdScan == 83) && (kbdFlags & KBD_CTRL) && (kbdFlags & KBD_ALT)) { - printf("Initiating reboot."); + kprintf("Initiating reboot."); restart(); } if (kbdAscii == 2) //unknown key / ignore key diff --git a/kernel/char/keyboard.h b/kernel/char/keyboard.h index 130c0ce..b6e1a2d 100644 --- a/kernel/char/keyboard.h +++ b/kernel/char/keyboard.h @@ -8,12 +8,12 @@ #ifndef __HOS_KEYBOARD__ #define __HOS_KEYBOARD__ __HOS_KEYBOARD__ -#define KBD_SCROLL 0x01 -#define KBD_NUM 0x02 -#define KBD_CAPS 0x04 -#define KBD_SHIFT 0x10 -#define KBD_CTRL 0x20 -#define KBD_ALT 0x40 +#define KBDF_SCROLL 0x01 +#define KBDF_NUM 0x02 +#define KBDF_CAPS 0x04 +#define KBDF_SHIFT 0x10 +#define KBDF_CTRL 0x20 +#define KBDF_ALT 0x40 #define KBD_SCAN_RELEASED 128 diff --git a/kernel/kernel.c b/kernel/kernel.c index 3392ffc..4c0c55c 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -141,15 +141,15 @@ void isr(u32_t num) criticalCounter++; switch (num) { - case 0x20: // timer interrupt + case 0x20: // timer (*(u16_t *)CONSOLE_MEMORY)++; timer++; - if (!(timer % (HOS_TIMER_FREQ / 4))) - { - kprintf("Timer int "); - } pic_eoi(); - break; + break; + case 0x21: // keyboard + isr_keyboard(); + pic_eoi(); + break; default: kprintf("Unhandled interrupt #%d, CR2 = 0x%x!\n", num, read_cr2()); halt();