From 36de2495d62c1652236ac1ffcba46b0b12ddabeb Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Sat, 6 Aug 2022 20:03:12 +0200 Subject: keymap --- kernel/include/font.h | 3 +- kernel/include/keymap.h | 358 ++++++++++++++++++++++++++++++++++++++++++ kernel/src/devices/keyboard.c | 75 ++++++++- kernel/src/main.c | 2 - 4 files changed, 433 insertions(+), 5 deletions(-) create mode 100644 kernel/include/keymap.h diff --git a/kernel/include/font.h b/kernel/include/font.h index 678a6c2..2bb00fa 100644 --- a/kernel/include/font.h +++ b/kernel/include/font.h @@ -19,7 +19,6 @@ typedef struct { /* font i used: /usr/share/kbd/consolefonts/lat9-16.psf.gz */ /* xxd -i font.psf */ -#endif unsigned char font[] = { 0x72, 0xb5, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, @@ -367,3 +366,5 @@ unsigned char font[] = { 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00 }; unsigned int font_len = 4128; + +#endif diff --git a/kernel/include/keymap.h b/kernel/include/keymap.h new file mode 100644 index 0000000..c027146 --- /dev/null +++ b/kernel/include/keymap.h @@ -0,0 +1,358 @@ +#ifndef KEYMAP_H +#define KEYMAP_H + +#include + +#define KEY_ESCAPE 0x01 +#define KEY_1 0x02 +#define KEY_2 0x03 +#define KEY_3 0x04 +#define KEY_4 0x05 +#define KEY_5 0x06 +#define KEY_6 0x07 +#define KEY_7 0x08 +#define KEY_8 0x09 +#define KEY_9 0x0A +#define KEY_0 0x0B +#define KEY_MINUS 0x0C +#define KEY_EQUAL 0x0D +#define KEY_BACKSPACE 0x0E +#define KEY_TAB 0x0F +#define KEY_Q 0x10 +#define KEY_W 0x11 +#define KEY_E 0x12 +#define KEY_R 0x13 +#define KEY_T 0x14 +#define KEY_Y 0x15 +#define KEY_U 0x16 +#define KEY_I 0x17 +#define KEY_O 0x18 +#define KEY_P 0x19 +#define KEY_LBRACKET 0x1A +#define KEY_RBRACKET 0x1B +#define KEY_ENTER 0x1C +#define KEY_LEFT 0x1D +#define KEY_A 0x1E +#define KEY_S 0x1F +#define KEY_D 0x20 +#define KEY_F 0x21 +#define KEY_G 0x22 +#define KEY_H 0x23 +#define KEY_J 0x24 +#define KEY_K 0x25 +#define KEY_L 0x26 +#define KEY_ 0x27 +#define KEY_SQUOTE 0x28 +#define KEY_BACK_TICK 0x29 +#define KEY_LSHIFT 0x2A +#define KEY_LSLASH 0x2B +#define KEY_Z 0x2C +#define KEY_X 0x2D +#define KEY_C 0x2E +#define KEY_V 0x2F +#define KEY_B 0x30 +#define KEY_N 0x31 +#define KEY_M 0x32 +#define KEY_COMMA 0x33 +#define KEY_DOT 0x34 +#define KEY_RSLASH 0x35 +#define KEY_RSHIFT 0x36 +#define KEY_ASTERISK 0x37 +#define KEY_LALT 0x38 +#define KEY_SPACE 0x39 +#define KEY_CAPSLOCK 0x3A +#define KEY_F1 0x3B +#define KEY_F2 0x3C +#define KEY_F3 0x3D +#define KEY_F4 0x3E +#define KEY_F5 0x3F +#define KEY_F6 0x40 +#define KEY_F7 0x41 +#define KEY_F8 0x42 +#define KEY_F9 0x43 +#define KEY_F10 0x44 +#define KEY_NUMLOCK 0x45 +#define KEY_SCLOCK 0x46 +#define KEY_NUMPAD_7 0x47 +#define KEY_NUMPAD_8 0x48 +#define KEY_NUMPAD_9 0x49 +#define KEY_NUMPAD_MINUS 0x4A +#define KEY_NUMPAD_4 0x4B +#define KEY_NUMPAD_5 0x4C +#define KEY_NUMPAD_6 0x4D +#define KEY_NUMPAD_PLUS 0x4E +#define KEY_NUMPAD_1 0x4F +#define KEY_NUMPAD_2 0x50 +#define KEY_NUMPAD_3 0x51 +#define KEY_NUMPAD_0 0x52 +#define KEY_NUMPAD_DOT 0x53 +#define KEY_F11 0x57 +#define KEY_F12 0x58 + +char keymap[] = { + ' ', + ' ', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '0', + '-', + '=', + ' ', + ' ', + 'q', + 'w', + 'e', + 'r', + 't', + 'y', + 'u', + 'i', + 'o', + 'p', + '[', + ']', + '\n', + ' ', + 'a', + 's', + 'd', + 'f', + 'g', + 'h', + 'j', + 'k', + 'l', + ';', + '\'', + '`', + ' ', + '\\', + 'z', + 'x', + 'c', + 'v', + 'b', + 'n', + 'm', + ',', + '.', + '/', + ' ', + '*', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + '7', + '8', + '9', + '-', + '4', + '5', + '6', + '+', + '1', + '2', + '3', + '0', + '.', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', +}; + +uint16_t keymap_len = 128; + +char shift_keymap[] = { + ' ', + ' ', + '!', + '@', + '#', + '$', + '%', + '^', + '&', + '*', + '(', + ')', + '_', + '+', + ' ', + ' ', + 'Q', + 'W', + 'E', + 'R', + 'T', + 'Y', + 'U', + 'I', + 'O', + 'P', + '{', + '}', + '\n', + ' ', + 'A', + 'S', + 'D', + 'F', + 'G', + 'H', + 'J', + 'K', + 'L', + ':', + '\"', + '~', + ' ', + '|', + 'Z', + 'X', + 'C', + 'V', + 'B', + 'N', + 'M', + '<', + '>', + '?', + ' ', + '*', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + '7', + '8', + '9', + '-', + '4', + '5', + '6', + '+', + '1', + '2', + '3', + '0', + '.', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', +}; + +uint16_t shift_keymap_len = 128; + +#endif diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c index 105c3a8..bf4948d 100644 --- a/kernel/src/devices/keyboard.c +++ b/kernel/src/devices/keyboard.c @@ -1,13 +1,62 @@ #include +#include + #include #include #include #include +#include #define KEYBOARD_DATA_PORT 0x60 #define KEYBOARD_STATUS_PORT 0x64 -uint8_t i = 0; +static uint32_t x; +static uint32_t y; +bool is_pressed[128]; + +uint32_t strlen(const char *s); + +uint32_t stoi(const char *s) +{ + static uint32_t num; + uint32_t s_len = strlen(s); + + for (int i = s_len - 1; i >= 0; i--) { + num += s[i] - '0'; + } + + return num; +} + +void itos(uint32_t num, char** s) +{ + uint32_t i; + for (i = 0; num; num/=10, i++) { + *s[i] = num%10 - '0'; + } + *s[i] = '\0'; +} + +void print_char(char c) +{ + if (x * 8 >= fb.width) { + x = 0; + y++; + } + if (y * 16 >= fb.height) { + x = 0; + y = 0; + } + fb_draw_character(fb, c, x * 8, y * 16, WHITE, BLACK); + x++; +} + +void print_string(char* s) +{ + for (uint32_t i = 0; i < strlen(s); i++) { + print_char(s[i]); + } +} void keyboard_handler(void) { @@ -16,5 +65,27 @@ void keyboard_handler(void) return; } uint8_t keycode = inb(KEYBOARD_DATA_PORT); - fb_draw_character(fb, keycode, 0, 0, RED, BLACK); + if (keycode < keymap_len) { + is_pressed[keycode] = true; + if (keycode == KEY_SPACE) { + print_char(' '); + + } else if (keycode == KEY_BACKSPACE) { + if (!x) return; + x--; + print_char(' '); + x--; + } else if (keycode == KEY_ENTER) { + x = 0; + y++; + } else { + if (keymap[keycode] == ' ') return; + if (is_pressed[KEY_LSHIFT] || is_pressed[KEY_RSHIFT]) + print_char(shift_keymap[keycode]); + else + print_char(keymap[keycode]); + } + } else { + is_pressed[keycode - 128] = false; + } } diff --git a/kernel/src/main.c b/kernel/src/main.c index 96f3572..2653b4d 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -9,8 +9,6 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) init_idt(); init_fb(multiboot_bootinfo, multiboot_magic); - fb_draw_string(fb, "Still working...", 8, 0, WHITE, BLACK); - for(;;) { __asm__ volatile ("hlt;"); } -- cgit v1.2.3