diff --git a/init/main.c b/init/main.c index ac04b1d..dc7f441 100644 --- a/init/main.c +++ b/init/main.c @@ -1,9 +1,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -14,22 +16,155 @@ extern unsigned long get_rflags(void); extern char __pstart[], __pend[]; +static char keycode_chars[] = { + [KEY_UNKNOWN] = ' ', + [KEY_A] = 'a', + [KEY_B] = 'b', + [KEY_C] = 'c', + [KEY_D] = 'd', + [KEY_E] = 'e', + [KEY_F] = 'f', + [KEY_G] = 'g', + [KEY_H] = 'h', + [KEY_I] = 'i', + [KEY_J] = 'j', + [KEY_K] = 'k', + [KEY_L] = 'l', + [KEY_M] = 'm', + [KEY_N] = 'n', + [KEY_O] = 'o', + [KEY_P] = 'p', + [KEY_Q] = 'q', + [KEY_R] = 'r', + [KEY_S] = 's', + [KEY_T] = 't', + [KEY_U] = 'u', + [KEY_V] = 'v', + [KEY_W] = 'w', + [KEY_X] = 'x', + [KEY_Y] = 'y', + [KEY_Z] = 'z', + [KEY_KEY_1] = '1', + [KEY_KEY_2] = '2', + [KEY_KEY_3] = '3', + [KEY_KEY_4] = '4', + [KEY_KEY_5] = '5', + [KEY_KEY_6] = '6', + [KEY_KEY_7] = '7', + [KEY_KEY_8] = '8', + [KEY_KEY_9] = '9', + [KEY_KEY_0] = '0', + [KEY_ENTER] = '\n', + [KEY_ESCAPE] = 0, + [KEY_BACKSPACE] = '\b', + [KEY_TAB] = ' ', + [KEY_SPACE] = ' ', + [KEY_MINUS] = '-', + [KEY_EQUALS] = '=', + [KEY_LEFT_BRACE] = '[', + [KEY_RIGHT_BRACE] = ']', + [KEY_BACKSLASH] = '\\', + [KEY_NON_US_HASH] = 0, + [KEY_SEMICOLON] = ';', + [KEY_APOSTROPHE] = '\'', + [KEY_GRAVE_ACCENT] = 0, + [KEY_COMMA] = ',', + [KEY_DOT] = '.', + [KEY_SLASH] = '/', + [KEY_CAPS_LOCK] = 0, + [KEY_F1] = 0, + [KEY_F2] = 0, + [KEY_F3] = 0, + [KEY_F4] = 0, + [KEY_F5] = 0, + [KEY_F6] = 0, + [KEY_F7] = 0, + [KEY_F8] = 0, + [KEY_F9] = 0, + [KEY_F10] = 0, + [KEY_F11] = 0, + [KEY_F12] = 0, + [KEY_PRINT_SCREEN] = 0, + [KEY_SCROLL_LOCK] = 0, + [KEY_PAUSE] = 0, + [KEY_INSERT] = 0, + [KEY_HOME] = 0, + [KEY_PAGE_UP] = 0, + [KEY_DELETE] = 0, + [KEY_END] = 0, + [KEY_PAGE_DOWN] = 0, + [KEY_RIGHT] = 0, + [KEY_LEFT] = 0, + [KEY_DOWN] = 0, + [KEY_UP] = 0, + [KEY_NUM_LOCK] = 0, + [KEY_KEYPAD_SLASH] = '/', + [KEY_KEYPAD_ASTERISK] = '*', + [KEY_KEYPAD_MINUS] = '-', + [KEY_KEYPAD_PLUS] = '+', + [KEY_KEYPAD_ENTER] = '\n', + [KEY_KEYPAD_1] = '1', + [KEY_KEYPAD_2] = '2', + [KEY_KEYPAD_3] = '3', + [KEY_KEYPAD_4] = '4', + [KEY_KEYPAD_5] = '5', + [KEY_KEYPAD_6] = '6', + [KEY_KEYPAD_7] = '7', + [KEY_KEYPAD_8] = '8', + [KEY_KEYPAD_9] = '9', + [KEY_KEYPAD_0] = '0', + [KEY_KEYPAD_DOT] = '.', + [KEY_NON_US_BACKSLASH] = 0, + [KEY_KEYPAD_EQUALS] = '=', + [KEY_MENU] = 0, + [KEY_LEFT_CTRL] = 0, + [KEY_LEFT_SHIFT] = 0, + [KEY_LEFT_ALT] = 0, + [KEY_LEFT_META] = 0, + [KEY_RIGHT_CTRL] = 0, + [KEY_RIGHT_SHIFT] = 0, + [KEY_RIGHT_ALT] = 0, + [KEY_RIGHT_META] = 0, + [KEY_MEDIA_MUTE] = 0, + [KEY_MEDIA_VOLUME_INCREMENT] = 0, + [KEY_MEDIA_VOLUME_DECREMENT] = 0, +}; + void print_kernel_banner(void) { printk("Socks kernel version " BUILD_ID); } +static void hang(void) +{ + while (1) { + printk("tick"); + milli_sleep(2000); + } +} + void background_thread(void) { printk("background_thread() running on processor %u", this_cpu()); milli_sleep(500); while (1) { - printk("tock"); - milli_sleep(1000); + //printk("tock"); + milli_sleep(2000); } } +static void putchar(char c) +{ + unsigned long flags; + struct queue *consoles = get_consoles(&flags); + queue_foreach(struct console, con, consoles, c_list) { + console_write(con, &c, 1); + } + + put_consoles(consoles, flags); +} + void kernel_init(uintptr_t arg) { ml_init(arg); @@ -51,8 +186,46 @@ void kernel_init(uintptr_t arg) create_kernel_thread(background_thread); - while (1) { - printk("tick"); - milli_sleep(1000); + struct object *kbd_obj; + status = object_namespace_get_object(global_namespace(), "/dev/system/misc/ps2kbd", &kbd_obj); + if (status != KERN_OK) { + printk("no keyboard available"); + hang(); } + + struct device *kbd_dev = cast_to_device(kbd_obj); + if (!kbd_dev) { + printk("no keyboard available"); + hang(); + } + + struct input_device *kbd = INPUT_DEVICE(kbd_dev); + if (!kbd) { + printk("no keyboard available"); + hang(); + } + + while (1) { + struct input_event ev; + size_t r; + status = device_read(kbd_dev, &ev, sizeof ev, &r); + + if (status != KERN_OK || r != sizeof ev) { + printk("keyboard read error: %s", kern_status_string(status)); + break; + } + + if (ev.ev_type != INPUT_TYPE_KEY || ev.ev_key.state != INPUT_KEYSTATE_DOWN) { + continue; + } + + char c = keycode_chars[ev.ev_key.key]; + if (c == 0) { + continue; + } + + putchar(c); + } + + hang(); }