/* By Marcus Xing kernel/tty.c 处理终端的代码 */ #include "type.h" #include "const.h" #include "protect.h" #include "proc.h" #include "console.h" #include "tty.h" #include "global.h" #include "keyboard.h" #include "proto.h" /* 内部函数声明 */ static void Init_TTY(TTY *tty); static void TTY_Read(TTY *tty); static void TTY_Write(TTY *tty); /*------------------------------------------------------------------Init_All_TTY 初始化所有的TTY */ void Init_All_TTY() { TTY *tty; /* 初始化每个TTY */ for(tty = TTY_Table;tty < TTY_Table + TTY_NUM;tty++) { Init_TTY(tty); } Select_Console(0); /* 当前控制台0号 */ } /*---------------------------------------------------------Put_Key_In_TTY_Buffer 把一个key放到参数指定的TTY的缓冲区中 */ void Put_Key_In_TTY_Buffer(TTY *tty,u32 key) { if(tty->tty_buffer_size < TTY_BUFFER_SIZE) { Disable_Int(); *tty->tty_tail = key; tty->tty_tail++; if(tty->tty_tail >= tty->tty_buffer + TTY_BUFFER_SIZE) { tty->tty_tail = tty->tty_buffer; } tty->tty_buffer_size++; Enable_Int(); } } /*----------------------------------------------------------------------Proc_TTY 终端显示进程 */ void Proc_TTY() { TTY *tty; /* 死循环 */ while(1) { /* 遍历每个TTY */ for(tty = TTY_Table;tty < TTY_Table + TTY_NUM;tty++) { TTY_Read(tty); TTY_Write(tty); } } } /*--------------------------------------------------------------------In_Process 显示键盘输入的函数,Keyboard_Read调用 */ void In_Process(TTY *tty,u32 key) { /* 如果可显示,放到参数指示的TTY的缓冲区中 */ if(!(key & FLAG_EXT)) { Put_Key_In_TTY_Buffer(tty,key); } /* 如果不可打印,进行相应处理 */ else { u32 raw_key = key & MASK_RAW; /* 保留低9位,低8位是内容,第9位是显示标记 */ switch(raw_key) { case POWER: Reset(); break; /* 处理F1,F2,F3键 */ case F1: case F2: case F3: /* 如果按下ALT + SHIFT + 1,2,3键,则进行控制台切换 */ if((key & FLAG_ALT_L) || (key & FLAG_ALT_R)) { Select_Console(raw_key - F1); } break; /* 处理退格键 */ case BACKSPACE: Put_Key_In_TTY_Buffer(tty,'/b'); /* 把'/b'丢到缓冲区 */ break; /* 处理回车键 */ case ENTER: Put_Key_In_TTY_Buffer(tty,'/n'); /* 把'/n'丢到缓冲区 */ break; /* 按下了UP键 */ case UP: /* 如果按下SHIFT + UP,则上滚屏幕 */ if((key & FLAG_SHIFT_L) || (key & FLAG_SHIFT_R)) { Scroll_Screen(tty->console,1); } break; /* 按下了DOWN键 */ case DOWN: /* 如果按下SHIFT + DOWN,则下滚屏幕 */ if((key & FLAG_SHIFT_L) || (key & FLAG_SHIFT_R)) { Scroll_Screen(tty->console,0); } break; } } } /*----------------------------------------------------------------------Init_TTY 初始化一个TTY,仅在当前文件中调用 */ static void Init_TTY(TTY *tty) { /* 尾指针和头指针都指向缓冲区起始处 */ tty->tty_tail = tty->tty_head = tty->tty_buffer; tty->tty_buffer_size = 0; /* 缓冲区码的数目开始为0 */ /* 初始化控制台 */ Init_Console(tty); } /*----------------------------------------------------------------------TTY_Read 读入一个key到当前TTY的BUFFER,仅在当前文件中调用 */ static void TTY_Read(TTY *tty) { /* 如果参数的指示的控制台为当前控制台,则进行处理 */ if(Is_Current_Console(tty->console)) { Keyboard_Read(tty); } } /*---------------------------------------------------------------------TTY_Write 从参数指示的TTY的BUFFER读出key来到相应的控制台上,仅在当前文件中调用 */ static void TTY_Write(TTY *tty) { char key; /* 如果参数指示的TTY的缓冲区大小大于0则读出一个码给Out_Char处理 */ if(tty->tty_buffer_size > 0) { Disable_Int(); key = (char)(*tty->tty_head); tty->tty_head++; if(tty->tty_head >= tty->tty_buffer + TTY_BUFFER_SIZE) { tty->tty_head = tty->tty_buffer; } tty->tty_buffer_size--; Enable_Int(); Out_Char(tty->console,key); } }