Add Basic Keyboard Driver

This commit is contained in:
Tyler McGurrin 2025-03-05 02:39:32 -05:00
parent e38974d290
commit 24a0061375
7 changed files with 563 additions and 23 deletions

View File

@ -3,4 +3,371 @@
|Copyright (C) 2024|
|Tyler McGurrin |
\*----------------*/
#include "keyboard.h"
#include "keyboard.h"
#include <arch/i686/irq.h>
#include <arch/i686/io.h>
#include <stdio.h>
#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);
}

View File

@ -3,4 +3,92 @@
|Copyright (C) 2024|
|Tyler McGurrin |
\*----------------*/
#pragma once
#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;

View File

@ -10,6 +10,7 @@
#include <arch/i686/io.h>
#include <arch/i686/irq.h>
#include <arch/i686/basicfunc.h>
#include <dri/keyboard.h>
#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);
// }

View File

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

64
src/kernel/string.c Normal file
View File

@ -0,0 +1,64 @@
/*----------------*\
|Nanite OS |
|Copyright (C) 2024|
|Tyler McGurrin |
\*----------------*/
#include "string.h"
#include <stdint.h>
#include <stddef.h>
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;
}

11
src/kernel/string.h Normal file
View File

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

View File

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