From 24a0061375bb1caa6cda66809d39eca0108e03e4 Mon Sep 17 00:00:00 2001 From: Tyler McGurrin Date: Wed, 5 Mar 2025 02:39:32 -0500 Subject: [PATCH] Add Basic Keyboard Driver --- src/kernel/dri/keyboard.c | 369 +++++++++++++++++++++++++++++++++++++- src/kernel/dri/keyboard.h | 90 +++++++++- src/kernel/main.c | 18 +- src/kernel/stdio.c | 30 ++-- src/kernel/string.c | 64 +++++++ src/kernel/string.h | 11 ++ write.sh | 4 +- 7 files changed, 563 insertions(+), 23 deletions(-) create mode 100644 src/kernel/string.c create mode 100644 src/kernel/string.h diff --git a/src/kernel/dri/keyboard.c b/src/kernel/dri/keyboard.c index 3d33da0..dd56724 100644 --- a/src/kernel/dri/keyboard.c +++ b/src/kernel/dri/keyboard.c @@ -3,4 +3,371 @@ |Copyright (C) 2024| |Tyler McGurrin | \*----------------*/ -#include "keyboard.h" \ No newline at end of file +#include "keyboard.h" + +#include +#include +#include + +#define PS2_KEYBOARD_PORT 0x60 + +char* Keyboard_Scanner() +{ + int scancode; + char* key = ""; + scancode = i686_inb(PS2_KEYBOARD_PORT); + // Debug Message, unneeded + // printf("Keycode = %d Port = %d\n", keycode, PS2_KEYBOARD_PORT); + +switch (scancode) { + + case KEYSCAN_1: + key = "1"; + break; + + case KEYSCAN_2: + key = "2"; + break; + + case KEYSCAN_3: + key = "3"; + break; + + case KEYSCAN_4: + key = "4"; + break; + + case KEYSCAN_5: + key = "5"; + break; + + case KEYSCAN_6: + key = "6"; + break; + + case KEYSCAN_7: + key = "7"; + break; + + case KEYSCAN_8: + key = "8"; + break; + + case KEYSCAN_9: + key = "9"; + break; + + case KEYSCAN_0: + key = "0"; + break; + + case KEYSCAN_Minus: + key = "-"; + break; + + case KEYSCAN_Equals: + key = "="; + break; + + case KEYSCAN_Q: + key = "q"; + break; + + case KEYSCAN_W: + key = "w"; + break; + + case KEYSCAN_E: + key = "e"; + break; + + case KEYSCAN_R: + key = "r"; + break; + + case KEYSCAN_T: + key = "t"; + break; + + case KEYSCAN_Y: + key = "y"; + break; + + case KEYSCAN_U: + key = "u"; + break; + + case KEYSCAN_I: + key = "i"; + break; + + case KEYSCAN_O: + key = "o"; + break; + + case KEYSCAN_P: + key = "p"; + break; + + case KEYSCAN_LeftBracket: + key = "["; + break; + + case KEYSCAN_RightBracket: + key = "]"; + break; + + case KEYSCAN_A: + key = "a"; + break; + + case KEYSCAN_S: + key = "s"; + break; + + case KEYSCAN_D: + key = "d"; + break; + + case KEYSCAN_F: + key = "f"; + break; + + case KEYSCAN_G: + key = "g"; + break; + + case KEYSCAN_H: + key = "h"; + break; + + case KEYSCAN_J: + key = "j"; + break; + + case KEYSCAN_K: + key = "k"; + break; + + case KEYSCAN_L: + key = "l"; + break; + + case KEYSCAN_Semicolon: + key = ";"; + break; + + case KEYSCAN_Apostrophe: + key = "'"; + break; + + case KEYSCAN_Grave: + key = "`"; + break; + + case KEYSCAN_Backslash: + key = "\\"; + break; + + case KEYSCAN_Z: + key = "z"; + break; + + case KEYSCAN_X: + key = "x"; + break; + + case KEYSCAN_C: + key = "c"; + break; + + case KEYSCAN_V: + key = "v"; + break; + + case KEYSCAN_B: + key = "b"; + break; + + case KEYSCAN_N: + key = "n"; + break; + + case KEYSCAN_M: + key = "m"; + break; + + case KEYSCAN_Comma: + key = ","; + break; + + case KEYSCAN_Period: + key = "."; + break; + + case KEYSCAN_Forwardslash: + key = "/"; + break; + + case KEYSCAN_Space: + key = " "; + break; + + case KEYSCAN_Enter: + key = "\n"; + break; + + case KEYSCAN_BackSpace: + key = "\b \b"; + break; + + case KEYSCAN_Tab: + key = "\t"; + break; + + case KEYSCAN_CTRL: + key = ""; + break; + + case KEYSCAN_LShift: + key = ""; + break; + + case KEYSCAN_RShift: + key = ""; + break; + + case KEYSCAN_PrtSc: + key = ""; + break; + + case KEYSCAN_Alt: + key = ""; + break; + + case KEYSCAN_Caps: + key = ""; + break; + + case KEYSCAN_F1: + key = ""; + break; + + case KEYSCAN_F2: + key = ""; + break; + + case KEYSCAN_F3: + key = ""; + break; + + case KEYSCAN_F4: + key = ""; + break; + + case KEYSCAN_F5: + key = ""; + break; + + case KEYSCAN_F6: + key = ""; + break; + + case KEYSCAN_F7: + key = ""; + break; + + case KEYSCAN_F8: + key = ""; + break; + + case KEYSCAN_F9: + key = ""; + break; + + case KEYSCAN_F10: + key = ""; + break; + + case KEYSCAN_Num: + key = ""; + break; + + case KEYSCAN_Scroll: + key = ""; + break; + + case KEYSCAN_Home: + key = ""; + break; + + case KEYSCAN_Up: + key = ""; + break; + + case KEYSCAN_PgUp: + key = ""; + break; + + case KEYSCAN_Minus2: + key = ""; + break; + + case KEYSCAN_Left: + key = ""; + break; + + case KEYSCAN_Center: + key = ""; + break; + + case KEYSCAN_Right: + key = ""; + break; + + case KEYSCAN_Plus: + key = ""; + break; + + case KEYSCAN_End: + key = ""; + break; + + case KEYSCAN_Down: + key = ""; + break; + + case KEYSCAN_PgDn: + key = ""; + break; + + case KEYSCAN_Ins: + key = ""; + break; + + case KEYSCAN_Delete: + key = ""; + break; + + case KEYSCAN_ESC: + key = ""; + break; + + default: + break; + +} + return key; +} + +void Keyboard_Handler() +{ + char* key = Keyboard_Scanner(); + printf("%s", key); + return; +} + +void Keyboard_Init() +{ + i686_IRQ_RegisterHandler(1, Keyboard_Handler); +} \ No newline at end of file diff --git a/src/kernel/dri/keyboard.h b/src/kernel/dri/keyboard.h index afc031f..5af59d2 100644 --- a/src/kernel/dri/keyboard.h +++ b/src/kernel/dri/keyboard.h @@ -3,4 +3,92 @@ |Copyright (C) 2024| |Tyler McGurrin | \*----------------*/ -#pragma once \ No newline at end of file +#pragma once + +void Keyboard_Init(); + +typedef enum { + KEYSCAN_ESC = 1 , + KEYSCAN_1 = 2 , + KEYSCAN_2 = 3 , + KEYSCAN_3 = 4 , + KEYSCAN_4 = 5 , + KEYSCAN_5 = 6 , + KEYSCAN_6 = 7 , + KEYSCAN_7 = 8 , + KEYSCAN_8 = 9 , + KEYSCAN_9 = 10, + KEYSCAN_0 = 11, + KEYSCAN_Minus = 12, + KEYSCAN_Equals = 13, + KEYSCAN_BackSpace = 14, + KEYSCAN_Tab = 15, + KEYSCAN_Q = 16, + KEYSCAN_W = 17, + KEYSCAN_E = 18, + KEYSCAN_R = 19, + KEYSCAN_T = 20, + KEYSCAN_Y = 21, + KEYSCAN_U = 22, + KEYSCAN_I = 23, + KEYSCAN_O = 24, + KEYSCAN_P = 25, + KEYSCAN_LeftBracket = 26, + KEYSCAN_RightBracket = 27, + KEYSCAN_Enter = 28, + KEYSCAN_CTRL = 29, + KEYSCAN_A = 30, + KEYSCAN_S = 31, + KEYSCAN_D = 32, + KEYSCAN_F = 33, + KEYSCAN_G = 34, + KEYSCAN_H = 35, + KEYSCAN_J = 36, + KEYSCAN_K = 37, + KEYSCAN_L = 38, + KEYSCAN_Semicolon = 39, + KEYSCAN_Apostrophe = 40, + KEYSCAN_Grave = 41, + KEYSCAN_LShift = 42, + KEYSCAN_Backslash = 43, + KEYSCAN_Z = 44, + KEYSCAN_X = 45, + KEYSCAN_C = 46, + KEYSCAN_V = 47, + KEYSCAN_B = 48, + KEYSCAN_N = 49, + KEYSCAN_M = 50, + KEYSCAN_Comma = 51, + KEYSCAN_Period = 52, + KEYSCAN_Forwardslash = 53, + KEYSCAN_RShift = 54, + KEYSCAN_PrtSc = 55, + KEYSCAN_Alt = 56, + KEYSCAN_Space = 57, + KEYSCAN_Caps = 58, + KEYSCAN_F1 = 59, + KEYSCAN_F2 = 60, + KEYSCAN_F3 = 61, + KEYSCAN_F4 = 62, + KEYSCAN_F5 = 63, + KEYSCAN_F6 = 64, + KEYSCAN_F7 = 65, + KEYSCAN_F8 = 66, + KEYSCAN_F9 = 67, + KEYSCAN_F10 = 68, + KEYSCAN_Num = 69, + KEYSCAN_Scroll = 70, + KEYSCAN_Home = 71, + KEYSCAN_Up = 72, + KEYSCAN_PgUp = 73, + KEYSCAN_Minus2 = 74, + KEYSCAN_Left = 75, + KEYSCAN_Center = 76, + KEYSCAN_Right = 77, + KEYSCAN_Plus = 78, + KEYSCAN_End = 79, + KEYSCAN_Down = 80, + KEYSCAN_PgDn = 81, + KEYSCAN_Ins = 82, + KEYSCAN_Delete = 83 +} Scancodes; \ No newline at end of file diff --git a/src/kernel/main.c b/src/kernel/main.c index 979f54f..c30554f 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "../libs/version.h" #include "../libs/boot/bootparams.h" @@ -37,12 +38,17 @@ void __attribute__((section(".entry"))) start(BootParams* bootParams) { printf("Done!\n\n\n\n\n"); i686_IRQ_RegisterHandler(0, timer); - printf("Boot Device: %x\n", bootParams->BootDevice); - printf("Memory Region Count: %x\n", bootParams->Memory.RegionCount); - for (int i = 0; i < bootParams->Memory.RegionCount; i++) { - printf("Memory: start=0x%llx length=0x%llx type=0x%x\n", - bootParams->Memory.Regions[i].Begin, bootParams->Memory.Regions[i].Length, bootParams->Memory.Regions[i].Type); - } + printf("Load Keyboard Driver..."); + Keyboard_Init(); + printf("Done!\n"); + + // Debug Info for Memory :3 + // printf("Boot Device: %x\n", bootParams->BootDevice); + // printf("Memory Region Count: %x\n", bootParams->Memory.RegionCount); + // for (int i = 0; i < bootParams->Memory.RegionCount; i++) { + // printf("Memory: start=0x%llx length=0x%llx type=0x%x\n", + // bootParams->Memory.Regions[i].Begin, bootParams->Memory.Regions[i].Length, bootParams->Memory.Regions[i].Type); + // } diff --git a/src/kernel/stdio.c b/src/kernel/stdio.c index 503b738..535046d 100644 --- a/src/kernel/stdio.c +++ b/src/kernel/stdio.c @@ -71,20 +71,21 @@ void clrscr() void scrollback(int lines) { - for (int y = lines; y < SCREEN_HEIGHT; y++) - for (int x = 0; x < SCREEN_WIDTH; x++) - { - putchr(x, y - lines, getchr(x, y)); - putcolour(x, y - lines, getcolour(x, y)); - } + for (int y = lines; y < SCREEN_HEIGHT; y++) + for (int x = 0; x < SCREEN_WIDTH; x++) + { + putchr(x, y - lines, getchr(x, y)); + putcolour(x, y - lines, getcolour(x, y)); + } - for (int y= SCREEN_HEIGHT - lines; y < SCREEN_HEIGHT; y++) - for (int x = 0; x < SCREEN_WIDTH; x++) - { - putchr(x, y - lines, getchr(x, y)); - putcolour(x, y - lines, getcolour(x, y)); - } - g_ScreenY -= lines; + for (int y = SCREEN_HEIGHT - lines; y < SCREEN_HEIGHT; y++) + for (int x = 0; x < SCREEN_WIDTH; x++) + { + putchr(x, y, '\0'); + putcolour(x, y, DEFAULT_COLOUR); + } + + g_ScreenY -= lines; } void putc(char c) @@ -102,6 +103,9 @@ void putc(char c) case '\r': g_ScreenX = 0; break; + case '\b': + g_ScreenX--; + break; default: putchr(g_ScreenX, g_ScreenY, c); g_ScreenX++; diff --git a/src/kernel/string.c b/src/kernel/string.c new file mode 100644 index 0000000..cfdfeb1 --- /dev/null +++ b/src/kernel/string.c @@ -0,0 +1,64 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2024| +|Tyler McGurrin | +\*----------------*/ +#include "string.h" +#include +#include + +const char* strchr(const char* str, char chr) { + if (str == NULL) + return NULL; + + while (*str) { + if (*str == chr) + return str; + + ++str; + } + + return NULL; +} + +char* strcpy(char* dst, const char* src) { + char* origDst = dst; + + if (dst == NULL) + return NULL; + + if (src == NULL) { + *dst = '\0'; + return dst; + } + while (*src) { + *dst = *src; + ++src; + ++dst; + } + + *dst = '\0'; + return origDst; +} + +unsigned strlen(const char* str) { + unsigned len = 0; + while (*str) { + ++len; ++str; + } + return len; +} + +char* strcat(char *dest, const char *src) { + char *original_dest = dest; + while (*dest != '\0') { + dest++; + } + while (*src != '\0') { + *dest = *src; + dest++; + src++; + } + *dest = '\0'; + return original_dest; +} \ No newline at end of file diff --git a/src/kernel/string.h b/src/kernel/string.h new file mode 100644 index 0000000..613492e --- /dev/null +++ b/src/kernel/string.h @@ -0,0 +1,11 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2024| +|Tyler McGurrin | +\*----------------*/ +#pragma once + +const char* strchr(const char* str, char chr); +char* strcpy(char* dst, const char* src); +unsigned strlen(const char* str); +char* strcat(char* dest, const char* src); diff --git a/write.sh b/write.sh index 9e32ff6..eb9d17d 100755 --- a/write.sh +++ b/write.sh @@ -7,7 +7,7 @@ make echo --------- echo Finished! echo --------- -read -p "Do you want to write the IMG to Floppy? (/dev/sdc) (y/n) " yn +read -p "Do you want to write the IMG to Floppy? (/dev/sdd) (y/n) " yn case $yn in y ) @@ -15,7 +15,7 @@ case $yn in echo Writing IMG to Floppy echo --------------------- - sudo dd if=./build/main_floppy.img of=/dev/sdc status=progress + sudo dd if=./build/main_floppy.img of=/dev/sdd status=progress echo --------- echo Finished!