2.7.3 对键盘进行设置

来源:互联网 发布:德瓦管在淘宝上叫什么 编辑:程序博客网 时间:2024/05/21 06:32

2.7.3 对键盘进行设置

对键盘进行设置是先将键盘中断服务程序与IDT相挂接,然后取消8259A中对键盘中断的屏蔽,允许IRQ1发送中断信号,通过先禁止键盘工作、再允许键盘工作,键盘便能够使用了。键盘中断处理程序与IDT的挂接函数set_intr_gate()与前面讲解过的set_trap_gate()函数类似,参看对set_trap_gate()函数的讲解。

效果如图2-15所示。

执行代码如下:

  1. //代码路径:kernel/chr_dev/console.c:  
  2.     …  
  3. #define ORIG_X   (*(unsigned char *)0x90000)  
  4. #define ORIG_Y   (*(unsigned char *)0x90001)  
  5. #define ORIG_VIDEO_PAGE  (*(unsigned short *)0x90004)  
  6. #define ORIG_VIDEO_MODE  ((*(unsigned short *)0x90006) & 0xff)  
  7. #define ORIG_VIDEO_COLS   (((*(unsigned short *)0x90006) & 0xff00) >> 8)  
  8. #define ORIG_VIDEO_LINES  (25)  
  9. #define ORIG_VIDEO_EGA_AX  (*(unsigned short *)0x90008)  
  10. #define ORIG_VIDEO_EGA_BX  (*(unsigned short *)0x9000a)  
  11. #define ORIG_VIDEO_EGA_CX  (*(unsigned short *)0x9000c)  
  12.  
  13. #define VIDEO_TYPE_MDA  0x10 /* Monochrome Text Display */  
  14. #define VIDEO_TYPE_CGA  0x11 /* CGA Display    */  
  15. #define VIDEO_TYPE_EGAM  0x20 /* EGA/VGA in Monochrome Mode */  
  16. #define VIDEO_TYPE_EGAC  0x21 /* EGA/VGA in Color Mode  */  
  17.  
  18. #define NPAR 16  
  19.     …  
  20. void con_init(void)  
  21. {  
  22.     register unsigned char a;  
  23.     char *display_desc"????";  
  24.     char *display_ptr;  
  25.  
  26.     video_num_columnsORIG_VIDEO_COLS;//参看机器系统数据  
  27.     video_size_rowvideo_num_columns * 2;  
  28.     video_num_linesORIG_VIDEO_LINES;  
  29.     video_pageORIG_VIDEO_PAGE; //参看机器系统数据  
  30.     video_erase_char0x0720;  
  31.       
  32.     if (ORIG_VIDEO_MODE== 7) /* Is this a monochrome display? */  
  33.     {  
  34.          video_mem_start0xb0000;  
  35.          video_port_reg0x3b4;  
  36.          video_port_val0x3b5;  
  37.          if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) //参看机器系统数据  
  38.          {  
  39.                video_typeVIDEO_TYPE_EGAM;  
  40.                video_mem_end0xb8000;  
  41.                display_desc"EGAm";  
  42.          }  
  43.          else  
  44.          {  
  45.                video_typeVIDEO_TYPE_MDA;  
  46.                video_mem_end = 0xb2000;  
  47.                display_desc"*MDA";  
  48.          }  
  49.     }  
  50.     else      /* If not, it is color. */  
  51.     {  
  52.          video_mem_start0xb8000;  
  53.          video_port_reg = 0x3d4;  
  54.          video_port_val = 0x3d5;  
  55.          if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) //参看机器系统数据  
  56.          {  
  57.                video_typeVIDEO_TYPE_EGAC;  
  58.                video_mem_end0xbc000;  
  59.                display_desc"EGAc";  
  60.          }  
  61.          else  
  62.          {  
  63.                video_typeVIDEO_TYPE_CGA;  
  64.                video_mem_end0xba000;  
  65.                display_desc"*CGA";  
  66.          }  
  67.     }  
  68.  
  69.     /* Let the user known what kind of display driver we are using */  
  70.       
  71.     display_ptr= ((char *)video_mem_start) + video_size_row - 8;  
  72.     while (*display_desc)  
  73.     {  
  74.          *display_ptr++= *display_desc++;  
  75.          display_ptr++;  
  76.     }  
  77.       
  78.     /* Initialize the variables used for scrolling (mostly EGA/VGA) */  
  79.       
  80.     origin = video_mem_start;  
  81.     scr_end = video_mem_start + video_num_lines * video_size_row;  
  82.     top = 0;  
  83.     bottom = video_num_lines;  
  84.  
  85.     gotoxy(ORIG_X,ORIG_Y); //参看机器系统数据  
  86.     set_trap_gate(0x21,&keyboard_interrupt);//设置键盘中断,参看2.5节  
  87.     outb_p(inb_p(0x21)&0xfd,0x21);// 取消对键盘中断的屏蔽,允许IRQ1  
  88.     a=inb_p(0x61);  
  89.     outb_p(a|0x80,0x61); // 禁止键盘工作  
  90.     outb(a,0x61);  //再允许键盘工作  
  91. }  
0 0
原创粉丝点击