From d4a70e316e0991d788fb922e3e4eafae97fe950e Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Fri, 20 Feb 2015 21:59:07 -0500 Subject: keyboard driver WIP --- Makefile | 2 + OBJ | 3 + drivers/include/ps2_keymaps.h | 28 +--- drivers/ps2_keymaps.c | 314 +++++++++++++++++++++++++++++++++++++----- drivers/ps2kbd.c | 62 ++------- kernel/main.c | 15 ++ 6 files changed, 314 insertions(+), 110 deletions(-) diff --git a/Makefile b/Makefile index cfa96c0..7ce90ac 100644 --- a/Makefile +++ b/Makefile @@ -54,3 +54,5 @@ clean: @echo "Cleaning build directory..." @rm -f $(OBJ) kappa.iso kappa.bin @rm -rf $(ISODIR) + +include autodeps diff --git a/OBJ b/OBJ index 010a3f9..1bc9ae6 100644 --- a/OBJ +++ b/OBJ @@ -13,6 +13,7 @@ drivers/gfx-as.o drivers/gfx_font.o drivers/pcspkr.o drivers/ps2kbd.o +drivers/ps2_keymaps.o drivers/tty.o kernel/fpu.o kernel/gdt-as.o @@ -26,6 +27,8 @@ kernel/isr-as.o kernel/isr.o kernel/log.o kernel/main.o +kernel/paging.o +kernel/paging-as.o kernel/panic.o kernel/timer.o libc/stdio.o diff --git a/drivers/include/ps2_keymaps.h b/drivers/include/ps2_keymaps.h index 0e71cc5..91688c8 100644 --- a/drivers/include/ps2_keymaps.h +++ b/drivers/include/ps2_keymaps.h @@ -1,26 +1,8 @@ #include -#define PS2_KEY_UNKNOWN 0xFF00 -#define PS2_KEY_ESCAPE 0xFF01 -#define PS2_KEY_NUMLOCK 0xFF02 -#define PS2_KEY_CAPSLOCK 0xFF03 -#define PS2_KEY_SCRLLOCK 0xFF04 -#define PS2_KEY_CONTROL 0xFF05 -#define PS2_KEY_BKSP 0xFF06 -#define PS2_KEY_F1 0xFF07 -#define PS2_KEY_F2 0xFF08 -#define PS2_KEY_F3 0xFF09 -#define PS2_KEY_F4 0xFF0A -#define PS2_KEY_F5 0xFF0B -#define PS2_KEY_F6 0xFF0C -#define PS2_KEY_F7 0xFF0D -#define PS2_KEY_F8 0xFF0E -#define PS2_KEY_F9 0xFF0F -#define PS2_KEY_F10 0xFF10 -#define PS2_KEY_F11 0xFF11 -#define PS2_KEY_F12 0xFF12 -#define PS2_KEY_ALT 0xFF13 -#define PS2_KEY_GUI 0xFF14 -#define PS2_KEY_SHIFT 0xFF15 +#define ERROR_KEY 0x00 +#define PRINTING_KEY 0x01 +#define SPECIAL_KEY 0x02 -extern uint16_t ps2_keymap_set1[128]; +extern uint8_t ps2_scancodes_set1[128]; +extern char ps2_set1_ascii[128]; diff --git a/drivers/ps2_keymaps.c b/drivers/ps2_keymaps.c index 9a92452..cd7fd08 100644 --- a/drivers/ps2_keymaps.c +++ b/drivers/ps2_keymaps.c @@ -1,45 +1,289 @@ #include #include "ps2_keymaps.h" -uint16_t ps2_keymap_set1[128] = { - PS2_KEY_UNKNOWN, - PS2_KEY_ESCAPE, - '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', PS2_KEY_BKSP, - '\t','q', 'w', 'e', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', - PS2_KEY_CONTROL, - 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', - PS2_KEY_SHIFT, +uint8_t ps2_scancodes_set1[128] = { + ERROR_KEY, /* error */ + SPECIAL_KEY, /* esc */ + PRINTING_KEY, /* 1 */ + PRINTING_KEY, /* 2 */ + PRINTING_KEY, /* 3 */ + PRINTING_KEY, /* 4 */ + PRINTING_KEY, /* 5 */ + PRINTING_KEY, /* 6 */ + PRINTING_KEY, /* 7 */ + PRINTING_KEY, /* 8 */ + PRINTING_KEY, /* 9 */ + PRINTING_KEY, /* 0 */ + PRINTING_KEY, /* - */ + PRINTING_KEY, /* = */ + SPECIAL_KEY, /* backspace */ + PRINTING_KEY, /* tab */ + PRINTING_KEY, /* Q */ + PRINTING_KEY, /* W */ + PRINTING_KEY, /* E */ + PRINTING_KEY, /* R */ + PRINTING_KEY, /* T */ + PRINTING_KEY, /* Y */ + PRINTING_KEY, /* U */ + PRINTING_KEY, /* I */ + PRINTING_KEY, /* O */ + PRINTING_KEY, /* P */ + PRINTING_KEY, /* [ */ + PRINTING_KEY, /* ] */ + PRINTING_KEY, /* enter */ + SPECIAL_KEY, /* left ctrl */ + PRINTING_KEY, /* A */ + PRINTING_KEY, /* S */ + PRINTING_KEY, /* D */ + PRINTING_KEY, /* F */ + PRINTING_KEY, /* G */ + PRINTING_KEY, /* H */ + PRINTING_KEY, /* J */ + PRINTING_KEY, /* K */ + PRINTING_KEY, /* L */ + PRINTING_KEY, /* ; */ + PRINTING_KEY, /* ' */ + PRINTING_KEY, /* ` */ + SPECIAL_KEY, /* left shift */ + PRINTING_KEY, /* \ (backslash) */ + PRINTING_KEY, /* Z */ + PRINTING_KEY, /* X */ + PRINTING_KEY, /* C */ + PRINTING_KEY, /* V */ + PRINTING_KEY, /* B */ + PRINTING_KEY, /* N */ + PRINTING_KEY, /* M */ + PRINTING_KEY, /* , */ + PRINTING_KEY, /* . */ + PRINTING_KEY, /* / */ + SPECIAL_KEY, /* right shift */ + PRINTING_KEY, /* keypad * */ + SPECIAL_KEY, /* right alt */ + PRINTING_KEY, /* space */ + SPECIAL_KEY, /* caps lock */ + SPECIAL_KEY, /* F1 */ + SPECIAL_KEY, /* F2 */ + SPECIAL_KEY, /* F3 */ + SPECIAL_KEY, /* F4 */ + SPECIAL_KEY, /* F5 */ + SPECIAL_KEY, /* F6 */ + SPECIAL_KEY, /* F7 */ + SPECIAL_KEY, /* F8 */ + SPECIAL_KEY, /* F9 */ + SPECIAL_KEY, /* F10 */ + SPECIAL_KEY, /* num lock */ + SPECIAL_KEY, /* scroll lock */ + PRINTING_KEY, /* keypad 7 */ + PRINTING_KEY, /* keypad 8 */ + PRINTING_KEY, /* keypad 9 */ + PRINTING_KEY, /* keypad - */ + PRINTING_KEY, /* keypad 4 */ + PRINTING_KEY, /* keypad 5 */ + PRINTING_KEY, /* keypad 6 */ + PRINTING_KEY, /* keypad + */ + PRINTING_KEY, /* keypad 1 */ + PRINTING_KEY, /* keypad 2 */ + PRINTING_KEY, /* keypad 3 */ + PRINTING_KEY, /* keypad 0 */ + PRINTING_KEY, /* keypad . */ + ERROR_KEY, /* 0x54 */ + ERROR_KEY, /* 0x55 */ + ERROR_KEY, /* 0x56 */ + SPECIAL_KEY, /* F11 */ + SPECIAL_KEY, /* F12 */ + ERROR_KEY, + ERROR_KEY, + ERROR_KEY, + ERROR_KEY +}; + +char ps2_set1_ascii[128] = { + '\0', + '\0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '0', + '-', + '=', + '\0', + '\t', + 'q', + 'w', + 'e', + 'r', + 't', + 'y', + 'u', + 'i', + 'o', + 'p', + '[', + ']', + '\n', + '\0', + 'a', + 's', + 'd', + 'f', + 'g', + 'h', + 'j', + 'k', + 'l', + ';', + '\'', + '`', + '\0', '\\', - 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', PS2_KEY_SHIFT, + 'z', + 'x', + 'c', + 'v', + 'b', + 'n', + 'm', + ',', + '.', + '/', + '\0', + '*', + '\0', + ' ', + '\0', /* caps lock */ + '\0', /* F1 */ + '\0', /* F2 */ + '\0', /* F3 */ + '\0', /* F4 */ + '\0', /* F5 */ + '\0', /* F6 */ + '\0', /* F7 */ + '\0', /* F8 */ + '\0', /* F9 */ + '\0', /* F10 */ + '\0', /* num lock */ + '\0', /* scroll lock */ + '7', + '8', + '9', + '-', + '4', + '5', + '6', + '+', + '1', + '2', + '3', + '0', + '.', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', +}; +char ps2_set1_shift[128] = { + '\0', + '\0', + '!', + '@', + '#', + '$', + '%', + '^', + '&', + '*', + '(', + ')', + '_', + '+', + '\0', + '\t', + 'Q', + 'w', + 'E', + 'R', + 'T', + 'Y', + 'U', + 'I', + 'O', + 'P', + '{', + '}', + '\n', + '\0', + 'A', + 'S', + 'D', + 'F', + 'G', + 'H', + 'J', + 'K', + 'L', + ':', + '"', + '~', + '\0', + '|', + 'Z', + 'X', + 'C', + 'V', + 'B', + 'N', + 'M', + '<', + '>', + '?', + '\0', '*', - PS2_KEY_ALT, - ' ', PS2_KEY_CAPSLOCK, - PS2_KEY_F1, - PS2_KEY_F2, - PS2_KEY_F3, - PS2_KEY_F4, - PS2_KEY_F5, - PS2_KEY_F6, - PS2_KEY_F7, - PS2_KEY_F8, - PS2_KEY_F9, - PS2_KEY_F10, - PS2_KEY_NUMLOCK, - PS2_KEY_SCRLLOCK, - '7', '8', '9', + '\0', + ' ', + '\0', /* caps lock */ + '\0', /* F1 */ + '\0', /* F2 */ + '\0', /* F3 */ + '\0', /* F4 */ + '\0', /* F5 */ + '\0', /* F6 */ + '\0', /* F7 */ + '\0', /* F8 */ + '\0', /* F9 */ + '\0', /* F10 */ + '\0', /* num lock */ + '\0', /* scroll lock */ + '7', + '8', + '9', '-', - '4', '5', '6', + '4', + '5', + '6', '+', - '1', '2', '3', + '1', + '2', + '3', '0', '.', - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, - PS2_KEY_F11, - PS2_KEY_F12, - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, - PS2_KEY_UNKNOWN, + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', + '\0', }; diff --git a/drivers/ps2kbd.c b/drivers/ps2kbd.c index 30fe762..73b75d1 100644 --- a/drivers/ps2kbd.c +++ b/drivers/ps2kbd.c @@ -61,59 +61,17 @@ static void key_handler(struct regs_t *regs) { (void) regs; uint8_t scancode = inb(0x60); - switch(scancode) + if(scancode == 0xE0) + /* extended, forget it! */ + return; + /* AND by 0x7F to get in the range of [0,128) */ + int type = ps2_scancodes_set1[scancode & 0x7F]; + int release = (scancode & 0x80) >> 7; + switch(type) { - case 0x2A: - ps2_shift = 1; - break; - case 0xAA: - ps2_shift = 0; - break; - case 0x1D: - ps2_ctrl = 1; - break; - case 0x9D: - ps2_ctrl = 0; - break; - case 0x38: - ps2_alt = 1; - break; - case 0xB8: - ps2_alt = 0; - break; - case 0xE0: - { - uint8_t spec = inb(0x60); - switch(spec) - { - case 0x48: - ps2_arrowkeys[IDX_UP] = 1; - break; - case 0x4B: - ps2_arrowkeys[IDX_LEFT] = 1; - break; - case 0x50: - ps2_arrowkeys[IDX_DOWN] = 1; - break; - case 0x4D: - ps2_arrowkeys[IDX_RIGHT] = 1; - break; - case 0xC8: - ps2_arrowkeys[IDX_UP] = 0; - break; - case 0xCB: - ps2_arrowkeys[IDX_LEFT] = 0; - break; - case 0xD0: - ps2_arrowkeys[IDX_DOWN] = 0; - break; - case 0xCD: - ps2_arrowkeys[IDX_RIGHT] = 0; - break; - } - break; - } - default: + case PRINTING_KEY: + if(!release) + putchar(ps2_set1_ascii[scancode]); break; } } diff --git a/kernel/main.c b/kernel/main.c index 4c768b7..04ef369 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -10,6 +10,7 @@ #include "irq.h" #include "log.h" #include "multiboot.h" +#include "paging.h" #include "panic.h" #include "pcspkr.h" #include "ps2kbd.h" @@ -46,6 +47,11 @@ void div0(struct regs_t *regs) panic("Divide by zero!\n"); } +void nothin(struct regs_t* regs) +{ + (void) regs; +} + void main(struct multiboot_info_t *hdr, uint32_t magic) { fpu_enable(); @@ -55,6 +61,7 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) printf("GFX init\n"); bool gfx_status = gfx_init((struct vbe_info_t*)hdr->vbe_mode_info); + printf("GFX init done.\n"); /* if graphical initialization fails, fall back to text mode */ if(!gfx_status) @@ -83,6 +90,11 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) set_interrupt_handler(0, div0); set_interrupt_handler(0xd, gpf); set_interrupt_handler(0x80, int80); + set_interrupt_handler(6, nothin); + + paging_init(); + + printf("Paging enabled.\n"); asm("sti"); @@ -90,6 +102,9 @@ void main(struct multiboot_info_t *hdr, uint32_t magic) printf("Kernel version %s: \"%s\"\n", KAPPA_KERNEL_VERSION, KAPPA_KERNEL_CODENAME); + while(1) + asm("hlt"); + printf("Starting linked-in application XRacer...\n"); //printf("Running graphics benchmark...\n"); srand(42); -- cgit v1.1