X86下控制Intel8042初始化鼠标

x86下开启鼠标中断和鼠标初始化

  1. 在bochs中开启鼠标mouse: enable,默认是ps/2接口鼠标

  2. 设置Intel 8259A开启鼠标中断

    同时打开irq2 和 irq12才能开启鼠标中断

    但是经过测试实际上并没有产生 鼠标中断,

    测试过程

    1. 关闭除鼠标中断外的其它中断

    2. 启动bochs,show extint:开启显示外部中断,

    3. c,然后经过一段中断输出后停止了,开启鼠标,移动鼠标,bochs并没有显示中断产生

中断开启但是没有产生鼠标中断的原因是并没有设置鼠标的电路芯片

需要通过Intel 8042来设置鼠标,(Intel 8042也能设置键盘)

Intel 8042资料

  1. 寄存器端口

    1

  2. 状态寄存器/控制寄存器的意义

    2

鼠标的初始化

先弄清除8042的2个寄存器,IO端口分别是0x60,和0x64.

实际上有4个用处,

  1. in 0x60端口,则0x60端口作为 8042的输出缓冲寄存器,
  2. out 0x60端口,则0x60端口作为 8042的输入缓冲寄存器
  3. in 0x64端口,则0x64端口 作为8042的状态寄存器
  4. out 0x64端口,则0x64端口 作为8042的控制寄存器

判断0x60 输入缓冲寄存器是否可以写入

向8042的输入缓冲寄存器0x60写入信息前,

需要先从状态寄存器0x64得到是否能写入的信息

bit 2 = 0则输入寄存器0x60可以写入信息,代码^wait_keysta_ready()

目前暂时先设置8042使鼠标能产生中断

这篇博客对8042说的很清楚了

  1. 首先设置8042自身,
  2. 向鼠标发送命令
  1. 设置8042的控制寄存器为0x47,(也就是设置8042的工作模式)

    0x47是0100 0111

    则根据控制寄存器的bit的意义知:

    开启了鼠标和键盘中断,并且设置了状态寄存器的bit 2,和将keyboard scancode转为了第一套

  2. 向鼠标发送命令0xf4:[Enable Data Reporting]

    则鼠标会产生数据发送给8042

然后在bochs中添加鼠标中断处理例程测试鼠标中断已经成功产生

具体代码^mouse_chip_init()


一篇参考