【发布时间】:2021-09-28 05:00:52
【问题描述】:
我正在编写一个使用 UEFI 启动的小型 x86-64 爱好操作系统。我目前正在为英特尔的 xHC 编写驱动程序。我现在可以寻址 USB 设备并为每个设备的端点 0 分配一个传输环。然后我使用 GET_DESCRIPTOR 请求来获取每个设备的配置描述符。我要求 QEMU 模拟 USB 键盘和 USB 鼠标。因此,我得到了 2 个不同的描述符,如下所示:
user@user-System-Product-Name:~$ hexdump -C result.bin
00000000 09 02 22 00 01 01 06 a0 32 09 04 00 00 01 03 01 |..".....2.......|
00000010 02 00 09 21 01 00 00 01 22 34 00 07 05 81 03 04 |...!...."4......|
00000020 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00001000 09 02 22 00 01 01 08 a0 32 09 04 00 00 01 03 01 |..".....2.......|
00001010 01 00 09 21 11 01 00 01 22 3f 00 07 05 81 03 08 |...!...."?......|
00001020 00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002000
基本上,我要求 GDB 输出我在文件 result.bin 中放置描述符的 RAM 的内容。然后我在控制台中十六进制转储 result.bin 的内容。这里首先可以看到USB鼠标的配置。然后,1 页后,USB 键盘的配置。
鼠标的配置描述符是09 02 22 00 01 01 06 a0 32。它后面跟着 2 个接口描述符:09 04 00 00 01 03 01 02 00 和 09 21 01 00 00 01 22 34 00。后面跟着一个端点描述符:07 05 81 03 08 00 07。
在鼠标和键盘的第一个接口描述符中,表示有一个端点描述符(由描述符的 bNumEndpoints 字段表示,它是从 0 开始索引的第 4 个字节)。我希望以下描述符是端点描述符。相反,我得到了第二个接口描述符(通过它的长度为 9 个字节而不是 7 个字节以及不同字段的值来表示)。
如https://wiki.osdev.org/Universal_Serial_Bus所述:
每个 CONFIGURATION 描述符至少有一个 INTERFACE 描述符,每个 INTERFACE 描述符最多可以有 15 个 ENDPOINT 描述符。当主机请求某个 CONFIGURATION 描述符时,设备返回 CONFIGURATION 描述符,紧接着是第一个 INTERFACE 描述符,紧接着是接口定义的端点的所有 ENDPOINT 描述符(可能没有)。如果存在,则紧随其后的是下一个 INTERFACE 描述符,然后是其 ENDPOINT 描述符(如果适用)。这种模式一直持续到特定配置范围内的所有信息都被传输为止。
在我的情况下,为什么我得到 2 个接口描述符,然后是端点描述符?这是一个 QEMU 错误还是我应该预料到的?
【问题讨论】: