From 520c3931879a681b1c761b91f48d7e4611b361f0 Mon Sep 17 00:00:00 2001 From: xiaoyi1212 Date: Sat, 31 Aug 2024 23:46:21 +0800 Subject: [PATCH] Update TTY --- src/driver/keyboard.c | 45 +++++++++++++++++++++++++++++++++++++++++-- src/include/task.h | 4 +++- src/include/tty.h | 20 +++++++++++++++++++ src/kernel/task.c | 7 +++++-- src/kernel/tty.c | 25 ++++++++++++++++++++++++ 5 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 src/include/tty.h create mode 100644 src/kernel/tty.c diff --git a/src/driver/keyboard.c b/src/driver/keyboard.c index 61cbeac..08e55f2 100644 --- a/src/driver/keyboard.c +++ b/src/driver/keyboard.c @@ -89,6 +89,21 @@ unsigned char shift_keyboard_map[128] = 0, /* All other keys are undefined */ }; +char keytable[0x54] = { // 按下Shift + 0, 0x01, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\b', '\t', 'Q', + 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 10, 0, 'A', 'S', 'D', 'F', + 'G', 'H', 'J', 'K', 'L', ':', '\"', '~', 0, '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', + '<', '>', '?', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, '7', 'D', '8', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.'}; + +char keytable1[0x54] = { // 未按下Shift + 0, 0x01, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', '\t', 'q', + 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 10, 0, 'a', 's', 'd', 'f', + 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', 0, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', + ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.'}; + + static void default_handle(uint32_t key,int release,char c){ if(!release) { if(key == 42) { @@ -146,8 +161,6 @@ int handle_keyboard_input(registers_t *reg){ io_cli(); - info("PS/2 Keyboard: %c : %08x",c,key); - struct key_listener* h = head_listener; while (1){ h->func(key,release,c); @@ -223,4 +236,32 @@ void add_listener(struct key_listener* listener){ break; } } +} + +int kernel_getch() { + uint8_t ch; + ch = input_char_inSM(); // 扫描码 + if (ch == 0xe0) { // keytable之外的键(↑,↓,←,→) + ch = input_char_inSM(); + if (ch == 0x48) { // ↑ + return -1; + } else if (ch == 0x50) { // ↓ + return -2; + } else if (ch == 0x4b) { // ← + return -3; + } else if (ch == 0x4d) { // → + return -4; + } + } + // 返回扫描码(keytable之内)对应的ASCII码 + if (keytable[ch] == 0x00) { + return 0; + } else if (shift == 0 && caps_lock == 0) { + return keytable1[ch]; + } else if (shift == 1 || caps_lock == 1) { + return keytable[ch]; + } else if (shift == 1 && caps_lock == 1) { + return keytable1[ch]; + } + return -1; } \ No newline at end of file diff --git a/src/include/task.h b/src/include/task.h index 53cf7b6..615668e 100644 --- a/src/include/task.h +++ b/src/include/task.h @@ -3,6 +3,7 @@ #include "memory.h" #include "vfs.h" +#include "tty.h" typedef struct { int (*main)(int argc,char* * argv); @@ -41,8 +42,9 @@ struct task_struct { int mem_size; // 内存利用率 char *name; // 进程名 void *stack; // 进程的内核栈地址 - header_t *head; // 进程堆 + header_t *head; // 进程堆链表头 header_t *tail; + tty_t *tty; // 输入输出设备管理器 vfs_t *vfs_now; // 文件路径焦点 bool isUser; // 是否是用户进程 uint32_t program_break; // 进程堆基址 diff --git a/src/include/tty.h b/src/include/tty.h new file mode 100644 index 0000000..0eee023 --- /dev/null +++ b/src/include/tty.h @@ -0,0 +1,20 @@ +#ifndef CRASHPOWEROS_TTY_H +#define CRASHPOWEROS_TTY_H + +#include "common.h" +#include "fifo.h" + +typedef struct tty{ + uint32_t *frame_buffer; // 图形缓冲区映射 + uint32_t width; + uint32_t height; + bool is_default_frame; // 是否为根缓冲区 + struct FIFO8 *fifo; // 键盘输出缓冲区 +}tty_t; + +#include "task.h" + +void init_default_tty(struct task_struct *task); +void free_tty(struct task_struct *task); + +#endif diff --git a/src/kernel/task.c b/src/kernel/task.c index 0d77e23..410ca60 100644 --- a/src/kernel/task.c +++ b/src/kernel/task.c @@ -145,12 +145,13 @@ void task_kill(int pid) { } argv->state = TASK_DEATH; printf("Taskkill process PID:%d Name:%s\n", argv->pid, argv->name); - kfree(argv); + free_tty(*argv); struct task_struct *head = running_proc_head; struct task_struct *last = NULL; while (1) { if (head->pid == argv->pid) { last->next = argv->next; + kfree(argv); io_sti(); return; } @@ -215,6 +216,8 @@ int32_t user_process(char *path, char *name){ // 用户进程创建 new_task->program_break_end = USER_HEAP_END; new_task->name = name; new_task->isUser = 1; + new_task->tty = kmalloc(sizeof(tty_t)); + init_default_tty(*new_task); extern char root_disk; vfs_change_disk(new_task,root_disk); @@ -233,7 +236,7 @@ int32_t user_process(char *path, char *name){ // 用户进程创建 alloc_frame(pg,0,1); } - char* buffer = USER_EXEC_FILE_START;//user_alloc(new_task,size); + char* buffer = USER_EXEC_FILE_START; memset(buffer,0,size); vfs_readfile(path,buffer); diff --git a/src/kernel/tty.c b/src/kernel/tty.c new file mode 100644 index 0000000..a51e8b5 --- /dev/null +++ b/src/kernel/tty.c @@ -0,0 +1,25 @@ +#include "../include/tty.h" + +extern uint32_t *screen; +extern uint32_t width, height; + +void init_default_tty(struct task_struct *task){ + task->tty->fifo = kmalloc(sizeof(struct FIFO8)); + char* buffer = kmalloc(256); + + task->tty->frame_buffer = screen; + task->tty->width = width; + task->tty->height = height; + task->tty->is_default_frame = true; + + fifo8_init(task->tty->fifo,256,buffer); +} + +void free_tty(struct task_struct *task){ + if(!task->tty->is_default_frame){ + kfree(task->tty->frame_buffer); + } + kfree(task->tty->fifo->buf); + kfree(task->tty->fifo); + kfree(task->tty); +}