从零开始搭建环境编写操作系统 AT&T GCC (八)使用键盘和滚轮鼠标

本文介绍了如何在操作系统中设置键盘和鼠标中断处理,包括键盘中断处理函数的创建、键盘扫描码的读取以及键盘缓冲区的实现。接着讲解了如何初始化和配置鼠标,包括发送特定命令给i8042芯片以及处理鼠标数据包。最后讨论了鼠标中断的配置和数据解析,以及初步实现了鼠标移动。
摘要由CSDN通过智能技术生成

  终于要让键盘和鼠标使用起来了,前期工作都完成了,这一步其实是非常容易的。
一、键盘中断和处理
  当键盘中的一个按钮被按下或抬起时,将通过8259A芯片向CPU发送一个键盘中断的消息,这时CPU将转入键盘中断处理程序。键盘上的每个按键都对应一个扫描码,当有键盘中断时,这个扫描码被送入0x60端口。CPU通过读取0x60端口中的扫描码就可以得知是键盘中的哪个键盘被按下或抬起了。
  在system文件夹下新建一个keyboard文件夹,然后新建keyboard.c和keyboard.h
  打开functions.s,要新建一个键盘的中断处理函数,不要忘记.global一下,因为我们还要在main.c中使用它的地址。
  

KeyboardIntCallBack: 
    cli
        pushal
        pushfl
        //调用键盘中断处理函数
        call IntKeyboard
        popfl
        popal
        sti
        iret

  回到main.c,声明这个函数 extern void KeyboardIntCallBack(void);
  修改如下内容:

    for (i=1;i<0x30;i++)
    {
        idt[i].offset1 = (short)((int)(void*)(DefaultIntCallBack));
        idt[i].selector = 0x0008;
        idt[i].no_use = 0x8e00;
        idt[i].offset2 = (short)(((int)(void*)(DefaultIntCallBack))>>16);   
    }//增加下边的四行
    idt[0x21].offset1 = (short)((int)(void*)(KeyboardIntCallBack));
    idt[0x21].selector = 0x0008;
    idt[0x21].no_use = 0x8e00;
    idt[0x21].offset2 = (short)(((int)(void*)(KeyboardIntCallBack))>>16);

  简单解释一下,int 21是我们的键盘中断,可以在第五讲中分析出来,所以我们要特别设置int 21的回调函数为KeyboardIntCallBack,这个函数在汇编function.s中,调用这个函数后,KeyboardIntCallBack对中断进行处理,然后调用keyboard.c中的IntKeyboard处理函数进行处理。
  我们先把keyboard.c加到Makefile中,Makefile添加下边一句话
  

keyboard.o : keyboard/keyboard.c Makefile
    gcc -c keyboard/keyboard.c -o $(OBJ_DIR)/keyboard.o -m32

  然后修改链接ld为如下:
  

system.bin : system.o Makefile system.lds main.o functions.o font.o font_code.o cursor.o keyboard.o
    ld -m elf_i386 -o $(BIN_DIR)/system.elf \
    $(OBJ_DIR)/system.o $(OBJ_DIR)/functions.o $(OBJ_DIR)/main.o \
    $(OBJ_DIR)/font.o $(OBJ_DIR)/font_code.o \
    $(OBJ_DIR)/cursor.o $(OBJ_DIR)/keyboard.o \
     -T system.lds

  搞定,开始编写keyboard.c
  按键的输入码并不是ASCII码,而是一种特殊的编码,如下给出:
  

#define KEY_ESC                        0X01        // ESC
#define KEY_1                          0X02        // 1
#define KEY_2                          0X03        // 2
#define KEY_3                          0X04        // 3
#define KEY_4                          0X05        // 4
#define KEY_5                          0X06        // 5
#define KEY_6                          0X07        // 6
#define KEY_7                          0X08        // 7
#define KEY_8                          0X09        // 8
#define KEY_9                          0X0A        // 9
#define KEY_0                          0X0B        // 0
#define KEY_DASH                       0X0C        // -
#define KEY_EQUAL                      0X0D        // =
#define KEY_BACKSPACE                  0X0E        // BACKSPACE
#define KEY_TAB                        0X0F        // TAB
#define KEY_Q                          0X10        // Q
#define KEY_W                          0X11        // W
#define KEY_E                          0X12        // E
#define KEY_R                          0X13        // R
#define KEY_T                          0X14        // T
#define KEY_Y                          0X15        // Y
#define KEY_U                          0X16        // U
#define KEY_I                          0X17        // I
#define KEY_O                          0X18        // O
#define KEY_P                          0X19        // P
#define KEY_LBRACKET                   0X1A        // [
#define KEY_RBRACKET                   0X1B        // ]
#define KEY_ENTER                      0X1C        // ENTER
#define KEY_CTRL                       0X1D        // CTRL
#define KEY_A                          0X1E        // A
#define KEY_S                          0X1F        // S
#define KEY_D                          0X20        // D
#define KEY_F                          0X21        // F
#define KEY_G                          0X22        // G
#define KEY_H                          0X23        // H
#define KEY_J                          0X24        // J
#define KEY_K                          0X25        // K
#define KEY_L                          0X26        // L
#define KEY_SEMICOLON                  0X27        // ;
#define KEY_RQUOTE                     0X28        // '
#define KEY_LQUOTE                     0X29        // `
#define KEY_LEFT_SHIFT                 0X2A        // LEFT SHIFT
#define KEY_BACKSLASH                  0X2B        // '\'
#define KEY_Z                          0X2C        // Z
#define KEY_X                          0X2D        // X
#define KEY_C                          0X2E        // C
#define KEY_V                          0X2F        // V
#define KEY_B                          0X30        // B
#define KEY_N                          0X31        // N
#define KEY_M                          0X32        // M
#define KEY_COMMA                      0X33        // ,
#define KEY_PERIOD                     0X34        // .
#define KEY_SLASH                      0X35        // /
#define KEY_RIGHT_SHIFT                0X36        // RIGHT SHIFT
#define KEY_PRTSC                      0X37        // PRINT SCREEN
#define KEY_ALT                        0X38        // ALT
#define KEY_SPACE                      0X39        // SPACE
#define KEY_CAPS_LOCK                  0X3A        // CAPS LOCK
#define KEY_F1                         0X3B        // F1
#define KEY_F2                         0X3C        // F2
#define KEY_F3                         0X3D        // F3
#define KEY_F4                         0X3E        // F4
#define KEY_F5                         0X3F        // F5
#define KEY_F6                         0X40        // F6
#define KEY_F7                         0X41        // F7
#define KEY_F8                         0X42        // F8
#define KEY_F9                         0X43        // F9
#define KEY_F10                        0X44        // F10
#define KEY_NUM_LOCK                   0X45        // NUM LOCK
#define KEY_SCROLL_LOCK                0X46        // SCROLL LOCK
#define KEY_HOME                       0X47        // HOME
#define KEY_UP                         0X48        // UP
#define KEY_PAGE_UP                    0X49        // PAGE UP
#define KEY_SUB                        0X4A        // SUB
#define KEY_LEFT                       0X4B        // LEFT
#define KEY_CENTER                     0X4C        // CENTER
#define KEY_RIGHT                      0X4D        // RIGHT
#define KEY_ADD                        0X4E        // ADD
#define KEY_
一个小型的操作系统,采用gcc进行开发,几千行的代码,方便初学者学习,内含有编译好的映像文件,及bochs模拟器配置文件,可在bochs下模拟运行。如下为源码包内的README文件: # # Snixos Project version 1.0, 2003.6 # (C) Copyright 2003,2004,2005 Jockeyson,KeqianGao # All Rights Reserved. # Distributed under the terms of the GNU General Public License. # # This program is a free and open source software and you can redistribute # it and/or modify it under the terms of the GNU General Public License as # published by the Free Software Foundation. As no any liability is assumed # for any incidental or consequential damages in connection with the # information or program fragments contained herein,so any exception arised # is at your own risk. It is ABSOLUTELY WITHOUT ANY WARRANTY. # Bug report please send to Snallie@tom.com . # 0. What is Snixos Project? Snixos Project is an experimental operating system designed by Jockeyson , KeqianGao aiming at multitask/multithread, Chinese envionment including Chinese characters input and ouput etc... 1. What you need to run Snixos PC with the following minimum configuration: CPU: i386 or above MEM: 2M extended memory or more DISPLAY: VGA or above Floppy Drive: 1.44M 2. Compile Environment RH Linux 7.2 or above (kernel 2.4.7-10 ) NASM 0.98 gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98) 3. Compile and install a. unpack the source package tar zxvf snixos_x.x_YYYYMMDD_HHMMSS.tgz b. cd to snixos cd snixos c. before make insert a 1.44M floppy in drive c.1 to make snixos run in VGA text mode make clean make VIDEO=TEXT diskimg make floppy c.2 to make snixos run VGA graphics mode make clean make diskimg make floppy d. bootup with the floppy just created in step c also you can follow this way to run snixos in bochs either in Windows or Linux a. just as the above b. just as the above c. invoke these command: make clean; make diskimg you'll get a snixos ima
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值