背景
我使用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的其他原因是什么?