IN-BIOS模拟PS / 2鼠标响应NACK命令

时间:2017-06-23 20:55:05

标签: x86 operating-system driver mouse bios

背景

我使用i8042 PS/2 controller的条形码代码,即键盘和鼠标驱动程序。鼠标和键盘通过USB接口连接,但由于USB Legacy support USB键和鼠标被BIOS模拟为PS / 2设备。这个问题是关于鼠标的,所以让我们关注它。

默认情况下,鼠标发送到控制器的移动数据包由3个字节组成:

          Bit 7      Bit 6      Bit 5        Bit 4      Bit 3         Bit 2      Bit 1         Bit 0
Byte 1  Y overflow  X overflow  Y sign bit  X sign bit  Always 1    Middle Btn  Right Btn   Left Btn
Byte 2                                X movement
Byte 3                                Y movement

有一个名为Intellimouse Extensions的扩展,它需要使轮子工作。此扩展可以在init步骤中激活,如下所示:

Get mouse id (mouse will respond with ID==0 as non Intellimouse)
Set sample rate 200
Set sample rate 100
Set sample rate 80
Get mouse id (if this mouse support Intellimouse Extensions mouse will respond with ID==3)

在这种设置之后,鼠标将发送4字节数据包扩展,其中包含有关Z轴移动(滚轮)的信息。这是来自Linux内核的这种init的一个例子:

 572 /*
 573  * IntelliMouse magic init.
 574  */
 575 static int intellimouse_detect(struct psmouse *psmouse, bool set_properties)
 576 {
 577         struct ps2dev *ps2dev = &psmouse->ps2dev;
 578         unsigned char param[2];
 579 
 580         param[0] = 200;
 581         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
 582         param[0] = 100;
 583         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
 584         param[0] =  80;
 585         ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);
 586         ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);
 587 
 588         if (param[0] != 3)
 589                 return -1;
 590 
 591         if (set_properties) {
 592                 __set_bit(BTN_MIDDLE, psmouse->dev->keybit);
 593                 __set_bit(REL_WHEEL, psmouse->dev->relbit);
 594 
 595                 if (!psmouse->vendor)
 596                         psmouse->vendor = "Generic";
 597                 if (!psmouse->name)
 598                         psmouse->name = "Wheel Mouse";
 599                 psmouse->pktsize = 4;
 600         }
 601 
 602         return 0;
 603 }

问题:

问题是我有一个x86_64目标,其中此命令(更改采样率,获取鼠标ID)正在响应0xFE代码,这意味着NACK。在其他几个x86_64目标和qemu中,它工作正常,我收到0xFA(ACK)代码,然后从数据端口读取适当的值。结果我无法启用车轮支撑。

问题:

1。)由于使用了传统的USB支持,PS / 2设备的行为被模拟,我猜BIOS可能无法模拟整个行为。这可能吗?是否意味着在使用传统USB支持时我不能使用滚轮鼠标?

2.。)设备可以回答任何此命令的NACK的其他原因是什么?

0 个答案:

没有答案