博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.7.3 对键盘进行设置
阅读量:3677 次
发布时间:2019-05-21

本文共 3400 字,大约阅读时间需要 11 分钟。

2.7.3 对键盘进行设置

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

效果如图2-15所示。

执行代码如下:

//代码路径:kernel/chr_dev/console.c:   
    …  
#define ORIG_X   (*(unsigned char *)0x90000)  
#define ORIG_Y   (*(unsigned char *)0x90001)  
#define ORIG_VIDEO_PAGE  (*(unsigned short *)0x90004)  
#define ORIG_VIDEO_MODE  ((*(unsigned short *)0x90006) & 0xff)  
#define ORIG_VIDEO_COLS   (((*(unsigned short *)0x90006) & 0xff00) >> 8)  
#define ORIG_VIDEO_LINES  (25)  
#define ORIG_VIDEO_EGA_AX  (*(unsigned short *)0x90008)  
#define ORIG_VIDEO_EGA_BX  (*(unsigned short *)0x9000a)  
#define ORIG_VIDEO_EGA_CX  (*(unsigned short *)0x9000c)  
 
#define VIDEO_TYPE_MDA  0x10 /* Monochrome Text Display */  
#define VIDEO_TYPE_CGA  0x11 /* CGA Display    */  
#define VIDEO_TYPE_EGAM  0x20 /* EGA/VGA in Monochrome Mode */  
#define VIDEO_TYPE_EGAC  0x21 /* EGA/VGA in Color Mode  */  
 
#define NPAR 16  
    …  
void con_init(void)  
{  
    register unsigned char a;  
    char *display_desc= "????";  
    char *display_ptr;  
 
    video_num_columns= ORIG_VIDEO_COLS;//参看机器系统数据  
    video_size_row= video_num_columns * 2;  
    video_num_lines= ORIG_VIDEO_LINES;  
    video_page= ORIG_VIDEO_PAGE; //参看机器系统数据  
    video_erase_char= 0x0720;  
      
    if (ORIG_VIDEO_MODE== 7) /* Is this a monochrome display? */  
    {  
         video_mem_start= 0xb0000;  
         video_port_reg= 0x3b4;  
         video_port_val= 0x3b5;  
         if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) //参看机器系统数据  
         {  
               video_type= VIDEO_TYPE_EGAM;  
               video_mem_end= 0xb8000;  
               display_desc= "EGAm";  
         }  
         else  
         {  
               video_type= VIDEO_TYPE_MDA;  
               video_mem_end = 0xb2000;  
               display_desc= "*MDA";  
         }  
    }  
    else      /* If not, it is color. */  
    {  
         video_mem_start= 0xb8000;  
         video_port_reg = 0x3d4;  
         video_port_val = 0x3d5;  
         if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) //参看机器系统数据  
         {  
               video_type= VIDEO_TYPE_EGAC;  
               video_mem_end= 0xbc000;  
               display_desc= "EGAc";  
         }  
         else  
         {  
               video_type= VIDEO_TYPE_CGA;  
               video_mem_end= 0xba000;  
               display_desc= "*CGA";  
         }  
    }  
 
    /* Let the user known what kind of display driver we are using */  
      
    display_ptr= ((char *)video_mem_start) + video_size_row - 8;  
    while (*display_desc)  
    {  
         *display_ptr++= *display_desc++;  
         display_ptr++;  
    }  
      
    /* Initialize the variables used for scrolling (mostly EGA/VGA) */  
      
    origin = video_mem_start;  
    scr_end = video_mem_start + video_num_lines * video_size_row;  
    top = 0;  
    bottom = video_num_lines;  
 
    gotoxy(ORIG_X,ORIG_Y); //参看机器系统数据  
    set_trap_gate(0x21,&keyboard_interrupt);//设置键盘中断,参看2.5节  
    outb_p(inb_p(0x21)&0xfd,0x21);// 取消对键盘中断的屏蔽,允许IRQ1  
    a=inb_p(0x61);  
    outb_p(a|0x80,0x61); // 禁止键盘工作  
    outb(a,0x61);  //再允许键盘工作  
}  

转载地址:http://fyxbn.baihongyu.com/

你可能感兴趣的文章
firewalld-cmd命令
查看>>
DVWA靶场CentOS
查看>>
nginx服务器
查看>>
git命令
查看>>
KVM部署及配置
查看>>
基于Gitlab+Jenkins的测试环境自动构建和生产多环境手动发布方案
查看>>
权限和归属
查看>>
LDAP
查看>>
GREP
查看>>
cron计划
查看>>
用户.组.成员
查看>>
家目录漫游
查看>>
查找文件
查看>>
Shell脚本
查看>>
ISCSI
查看>>
CentOS7防火墙
查看>>
艺术之旅
查看>>
聚合连接
查看>>
MariaDB数据库
查看>>
rsync同步操作
查看>>