Update TTY
This commit is contained in:
parent
a6b044fe1c
commit
520c393187
|
@ -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;
|
||||
}
|
|
@ -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; // 进程堆基址
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue