首页 > 解决方案 > 使用 Intel 的 xHC 启用插槽命令后,如何确定哪个 Root Hub 端口连接了 USB 设备?

问题描述

我正在使用 UEFI 启动的小型爱好操作系统中为英特尔的 xHC 编写一个小型驱动程序。

重置所有 Root Hub 端口后,我收到 2 个端口状态更改事件,这是因为我要求 QEMU 在命令行中模拟 USB 键盘和 USB 鼠标。每个设备的一个端口状态更改事件似乎是公平的。在此之后,我按照 USB 设备的初始化步骤进行操作。如 xHCI 规范中所述:

端口成功进入启用状态后,系统软件应使用启用插槽命令为新连接的设备获取设备插槽,如第 4.3.2 节所述。

因此,我向每个存在端口状态更改事件的根集线器端口发送一个启用插槽命令。这似乎有效,因为我在事件环上获得了 2 个命令完成事件,它们都触发了中断。这两个事件都标有完成代码 1,表示成功。

我的问题从这里开始。在端口状态更改事件中有一个端口 ID 字段,它允许确定哪个端口触发了事件。在命令完成事件中,没有这些。我可以链接到触发事件的命令 TRB,但命令 TRB 不包含端口 ID。我的问题是,在启用插槽命令之后,我需要创建一个输入上下文,包括一个插槽上下文,它应该包含根集线器端口号。

我可以保留我向其发送启用插槽命令的端口列表,但这会导致竞争条件,尤其是在启用多处理后。

如何正确获取触发命令完成事件的根集线器端口?

标签: usbx86-64interruptosdevhci

解决方案


在 linux-usb 邮件列表中提出了类似的问题。
Mathias Nyman 在那里指出Enable Slot具有误导性,因为它没有启用特定端口的插槽,而是该命令仅在Device Context Base Address Array中返回一个空闲索引。
该索引是Slot ID值。

dev_ctx_base_addr[slot_id]程序员必须使用指向设备上下文结构的指针设置相应的条目(即),并用他们认为合适的任何端口号路由字符串填充其插槽上下文。 重要的是要强调Slot IDPort Number/Route String之间没有先验关系。

因此,当命令完成事件到达时,您可以只拥有一个插槽队列来初始化和出列它们。


推荐阅读