- /*
- By Marcus Xing
- kernel/tty.c
- 处理终端的代码
- */
- #include "type.h"
- #include "const.h"
- #include "ipc.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_TYY
- 初始化所有的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()
- {
- //Panic("PROC TTY PANIC");
- 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);
- }
- }