kernel/tty.c

来源:互联网 发布:笔记本电池校正软件 编辑:程序博客网 时间:2024/05/24 22:43
Code:
  1. /*  
  2.     By Marcus Xing  
  3.     kernel/tty.c  
  4.     处理终端的代码  
  5. */  
  6.   
  7. #include "type.h"   
  8. #include "const.h"   
  9. #include "ipc.h"   
  10. #include "protect.h"   
  11. #include "proc.h"   
  12. #include "console.h"   
  13. #include "tty.h"   
  14. #include "global.h"   
  15. #include "keyboard.h"   
  16. #include "proto.h"   
  17.   
  18. /* 内部函数声明 */  
  19. static void Init_TTY(TTY *tty);   
  20. static void TTY_Read(TTY *tty);   
  21. static void TTY_Write(TTY *tty);   
  22.   
  23. /*-----------------------------------------------------------------Init_All_TYY  
  24.     初始化所有的TTY  
  25. */  
  26. void Init_All_TTY()   
  27. {   
  28.     TTY *tty;   
  29.        
  30.     /* 初始化每个TTY */  
  31.     for(tty = TTY_Table;tty < TTY_Table + TTY_NUM;tty++)   
  32.     {   
  33.         Init_TTY(tty);   
  34.     }   
  35.        
  36.     Select_Console(0);      /* 当前控制台0号 */  
  37. }   
  38.   
  39. /*---------------------------------------------------------Put_Key_In_TTY_Buffer    
  40.     把一个key放到参数指定的TTY的缓冲区中  
  41. */  
  42. void Put_Key_In_TTY_Buffer(TTY *tty,u32 key)   
  43. {   
  44.     if(tty->tty_buffer_size < TTY_BUFFER_SIZE)   
  45.     {   
  46.         Disable_Int();   
  47.         *tty->tty_tail = key;   
  48.         tty->tty_tail++;   
  49.         if(tty->tty_tail >= tty->tty_buffer + TTY_BUFFER_SIZE)   
  50.         {   
  51.             tty->tty_tail = tty->tty_buffer;   
  52.         }   
  53.         tty->tty_buffer_size++;   
  54.         Enable_Int();   
  55.     }   
  56. }   
  57.   
  58. /*----------------------------------------------------------------------Proc_TTY  
  59.     终端显示进程  
  60. */  
  61. void Proc_TTY()   
  62. {   
  63.     //Panic("PROC TTY PANIC");   
  64.     TTY *tty;   
  65.     /* 死循环 */  
  66.     while(1)   
  67.     {   
  68.         /* 遍历每个TTY */  
  69.         for(tty = TTY_Table;tty < TTY_Table + TTY_NUM;tty++)   
  70.         {   
  71.             TTY_Read(tty);   
  72.             TTY_Write(tty);   
  73.         }   
  74.     }   
  75. }   
  76.   
  77. /*--------------------------------------------------------------------In_Process  
  78.     显示键盘输入的函数,Keyboard_Read调用  
  79. */  
  80. void In_Process(TTY *tty,u32 key)   
  81. {   
  82.     /* 如果可显示,放到参数指示的TTY的缓冲区中 */  
  83.     if(!(key & FLAG_EXT))   
  84.     {   
  85.         Put_Key_In_TTY_Buffer(tty,key);   
  86.     }   
  87.     /* 如果不可打印,进行相应处理 */  
  88.     else  
  89.     {   
  90.         u32 raw_key = key & MASK_RAW;   /* 保留低9位,低8位是内容,第9位是显示标记 */  
  91.         switch(raw_key)   
  92.         {   
  93.             case POWER:   
  94.                 Reset();   
  95.                 break;   
  96.                    
  97.             /* 处理F1,F2,F3键 */  
  98.             case F1:   
  99.             case F2:   
  100.             case F3:   
  101.                 /* 如果按下ALT + SHIFT + 1,2,3键,则进行控制台切换 */  
  102.                 if((key & FLAG_ALT_L) || (key & FLAG_ALT_R))   
  103.                 {   
  104.                     Select_Console(raw_key - F1);   
  105.                 }   
  106.                 break;   
  107.                    
  108.             /* 处理退格键 */  
  109.             case BACKSPACE:   
  110.                 Put_Key_In_TTY_Buffer(tty,'/b');        /* 把'/b'丢到缓冲区 */  
  111.                 break;   
  112.                    
  113.             /* 处理回车键 */  
  114.             case ENTER:   
  115.                 Put_Key_In_TTY_Buffer(tty,'/n');        /* 把'/n'丢到缓冲区 */  
  116.                 break;   
  117.                     
  118.             /* 按下了UP键 */  
  119.             case UP:   
  120.                 /* 如果按下SHIFT + UP,则上滚屏幕 */  
  121.                 if((key & FLAG_SHIFT_L) || (key & FLAG_SHIFT_R))   
  122.                 {   
  123.                     Scroll_Screen(tty->console,1);   
  124.                 }   
  125.                 break;   
  126.                
  127.             /* 按下了DOWN键 */  
  128.             case DOWN:   
  129.                 /* 如果按下SHIFT + DOWN,则下滚屏幕 */  
  130.                 if((key & FLAG_SHIFT_L) || (key & FLAG_SHIFT_R))   
  131.                 {   
  132.                     Scroll_Screen(tty->console,0);   
  133.                 }   
  134.                 break;   
  135.         }   
  136.     }   
  137. }   
  138.   
  139. /*----------------------------------------------------------------------Init_TTY  
  140.     初始化一个TTY,仅在当前文件中调用  
  141. */  
  142. static void Init_TTY(TTY *tty)   
  143. {   
  144.     /* 尾指针和头指针都指向缓冲区起始处 */  
  145.     tty->tty_tail = tty->tty_head = tty->tty_buffer;       
  146.     tty->tty_buffer_size = 0;   /* 缓冲区码的数目开始为0 */  
  147.        
  148.     /* 初始化控制台 */  
  149.     Init_Console(tty);   
  150. }   
  151.   
  152. /*----------------------------------------------------------------------TTY_Read  
  153.     读入一个key到当前TTY的BUFFER,仅在当前文件中调用  
  154. */  
  155. static void TTY_Read(TTY *tty)   
  156. {   
  157.     /* 如果参数的指示的控制台为当前控制台,则进行处理 */  
  158.     if(Is_Current_Console(tty->console))   
  159.     {   
  160.         Keyboard_Read(tty);   
  161.     }   
  162. }   
  163.   
  164. /*---------------------------------------------------------------------TTY_Write  
  165.     从参数指示的TTY的BUFFER读出key来到相应的控制台上,仅在当前文件中调用  
  166. */  
  167. static void TTY_Write(TTY *tty)   
  168. {   
  169.     char key;   
  170.        
  171.     /* 如果参数指示的TTY的缓冲区大小大于0则读出一个码给Out_Char处理 */  
  172.     if(tty->tty_buffer_size > 0)   
  173.     {   
  174.         Disable_Int();   
  175.         key = (char)(*tty->tty_head);   
  176.         tty->tty_head++;   
  177.         if(tty->tty_head >= tty->tty_buffer + TTY_BUFFER_SIZE)   
  178.         {   
  179.             tty->tty_head = tty->tty_buffer;   
  180.         }   
  181.         tty->tty_buffer_size--;   
  182.         Enable_Int();   
  183.            
  184.         Out_Char(tty->console,key);   
  185.     }   
  186. }   

 

原创粉丝点击