X86 HID USB设备(如键盘)上的按键是否会触发事件环中的事件,从而触发中断?

X86 HID USB设备(如键盘)上的按键是否会触发事件环中的事件,从而触发中断?,x86,operating-system,usb,osdev,X86,Operating System,Usb,Osdev,我已经阅读了一段时间xHCI规范和其他资源。我想在我正在编写的业余操作系统中实现对HID USB设备的支持。我的问题是关于MSI-X机制和事件环。如xHCI规范所述 中断器0至MaxIntrs-1可各自触发一个唯一的中断向量。i、 e.中断器的索引与MSI-X表结构中的MSI-X向量索引或MSI-X PBA结构中的相关挂起位之间存在1:1的映射。有关更多信息,请参阅PCIspec中的第6.8.2节 因此,在中断寄存器集和MSI-X消息表中有一个1:1的索引映射。还说, xHC实现可能支持中断映射

我已经阅读了一段时间xHCI规范和其他资源。我想在我正在编写的业余操作系统中实现对HID USB设备的支持。我的问题是关于MSI-X机制和事件环。如xHCI规范所述

中断器0至MaxIntrs-1可各自触发一个唯一的中断向量。i、 e.中断器的索引与MSI-X表结构中的MSI-X向量索引或MSI-X PBA结构中的相关挂起位之间存在1:1的映射。有关更多信息,请参阅PCIspec中的第6.8.2节

因此,在中断寄存器集和MSI-X消息表中有一个1:1的索引映射。还说,

xHC实现可能支持中断映射。中断器映射是利用特定传输请求块生成的传输事件,以中断器及其事件环为目标的能力。如果中断器数量(MaxIntrs)字段大于1,则应支持中断器映射。传输TRB中中断器目标字段的值确定哪个中断器应接收由相应设备插槽或传输TRB生成的传输事件。如果不支持中断器映射,xHC和所有针对中断器0的事件都应忽略中断器目标字段

考虑到这一点,我想我只实现中断器0,因为我现在不想让事情变得太复杂。我的看法是,我将遵循键盘的初始化步骤。然后,我将在中断器0的事件环上等待一个事件(中断)。然后我会看看活动圈中的活动。如果是传输事件,我将查看事件TRB的插槽ID和端点ID字段,以确定设备上下文基址数组中的设备插槽,并获取该设备插槽的哪个端点触发了中断。如果是键盘端点中的中断,我会在该端点的传输环上放置一个正常的TRB,请求8字节的数据。根据osdev.org,我应该以一定的间隔轮询USB键盘:

驱动程序软件应请求HID设备的配置描述符。HID设备必须至少支持一种配置。然后,软件应扫描端点描述符,搜索指示“中断输入”类型的描述符,即使用中断传输将设备数据发送到主机的端点。软件应保存端点的4位ID以及端点的8位间隔。interval值以毫秒(ms)为单位对时间进行编码,软件应在该时间间隔内轮询一次报告数据包。例如,如果间隔值为8,则软件应每8毫秒向设备请求一次报告

最后,是否真的有一个事件放置在键盘按键上的事件环上,或者软件是否应该每隔毫秒轮询HID设备

我问这个问题是因为我会怀疑现代操作系统是否会通过轮询USB键盘来确定按键是否被按下。至于我对USB的理解,USB设备不会初始化任何传输。这样,您就可以轮询USB总线了。键盘按键是否可能中断


现代操作系统是使用某些芯片组的PS/2键盘模拟,还是全部使用USB驱动程序(始终在x86上)?

正如您所指出的,USB设备(至少在USB3.0之前)是不会启动任何传输的从属设备。主机需要发送中断传输以轮询中断。但是,这不是软件的责任。OHCI拥有HCCA树,在该树中,TDs以特定速率轮询端点。ECHI具有周期帧列表,XHCI具有周期传输环。软件需要在适当的深度放置TD(或等效物),以使主机控制器自动向enpoint发送中断传输。对于XHCI,这将生成一个事件和一个中断。我还不知道周期性转移环。我有时间的时候去看看。不客气。仔细检查细节,我记不清所有的细节,而且那些规格太大了。