DMA 的 USB 拓扑:控制器、集线器与接口
主机控制器、根集线器和共享带宽是怎么回事,为什么插后置接口不是玄学;还会教你查看接口实际协商出的速率,以及 USB 选择性暂停是怎样让连接断开的。
简短回答
USB 是一棵树:每个主机控制器下挂一个根集线器,其下的所有外置集线器、扩展坞或前置面板接口都共享它的带宽。DMA 卡应该插在直连根集线器的后置接口上,并且同一控制器上没有其他设备跟它抢资源。
本页内容10
USB 接口实际上是怎样连到电脑上的
大多数人以为每个 USB 插口都是一条独立通往电脑的连接,但实际并非如此。一台机器只有少数几个主机控制器,每个控制器下面有一个根集线器,每个根集线器下面又有一组接口。插在这些接口上的所有设备,共享该控制器的带宽、中断处理和驱动。外置集线器 或扩展坞会再多加一层,这一层又由它下面的所有设备共享。几乎所有原因不明的 DMA 掉线,都是因为这棵树层级太深或者太繁忙,超出了读取端能承受的范围。
需要了解的四个 USB 术语
搞清这四个术语之后,你看到的大部分 USB 建议就都说得通了。
- 主机控制器
- 负责运行一条 USB 总线的芯片。现代机器上是 xHCI 控制器。它有自己的驱动,也可能成为瓶颈
- 根集线器
- 位于某个控制器这棵树最顶端的虚拟集线器。它的接口就是直接连到主板上的那些插口
- 集线器(HUB)
- 任何把一个接口扩展成多个的设备:外置集线器、扩展坞、带 USB 接口的显示器、机箱内的前置面板板卡
- 协商速率
- 链路实际协商出来的速率,而不是接口标称能达到的速率。USB 3 接口配一根 USB 2 线,协商出来的就是 USB 2
为什么要用后置 USB 接口?
后置 I/O 接口焊在主板上,直接连到根集线器。前置面板接口位于一根连接主板插针的内部线缆末端,而很多机箱的这个插针本身还挂在一个内部集线器 后面。因此,信号到达控制器之前,前置接口会多出线缆长度、额外的接头,往往还有一级集线器。满速运行的 USB 3 容不得勉强凑合的通路,这正是每篇教程都让你用后置接口的根本原因。这也解释了为什么一张在前置接口上出问题的卡,换到后置接口、其他什么都不改,就能正常工作。
提示
让 DMA 卡独占一个 USB 控制器
和一个闲置的键盘共用控制器没有任何代价,但和摄像头、移动硬盘、采集卡或 USB 解码器(DAC)共用,就会实打实地占用带宽。它还会恰好在读取端传输到一半的时候增加中断负载。有多个后置接口的机器,通常会把它们分配到不止一个控制器上。实际目标是:DMA 卡所在接口的控制器上不挂其他高负载设备,吃带宽的外设都放到别处。出于同样的原因,测读取速度前拔掉所有不必要的设备并不只是走个形式,因为这会改变测试结果。
如何查看接口实际协商出的速率
在副机(第二台电脑)上操作,DMA 卡保持连接,游戏主机保持开机。目的是确认链路是以 USB 3 建立的,没有悄悄回落到更低的速率。
- 在副机上打开设备管理器
- 在“查看”菜单中选择“依连接排序设备”,列表会按实际的树状结构重新显示
- 顺着这棵树,从主机控制器经过根集线器一路找到你的设备,中间遇到的每个集线器都记下来,它们都是可以去掉的层级
- 把“查看”切回“依类型排序设备”,展开“通用串行总线控制器”
- 右键单击 FTDI 或 USB 桥接设备,选择“属性”,打开“详细信息”选项卡
- 在“属性”下拉列表中选择“父系”,它显示的是 USB 树中位于该设备正上方的那个设备
- 要直接读取速率,就安装 Windows SDK 并勾选 Debugging Tools,运行 USBView 并选中该设备,查看它的总线速率。显示 SuperSpeed 表示 USB 3 链路已建立,显示 High 则表示已回落到 USB 2
- 如果速率不对,先换线,再换接口,然后去掉中间的所有设备;每次只改一项,每改一项都重新检查一次速率
用 powercfg 关闭 USB 选择性暂停
USB 选择性暂停允许集线器驱动把它认为空闲的接口断电。对键盘来说这能省电,但对 DMA 卡来说,就意味着设备会在你没留意的时候消失。下面两个 GUID 分别是标准的 USB 设置子组和选择性暂停设置,值为 0 表示禁用。请在以管理员身份打开的命令提示符中运行这些命令,而且只在副机上运行。
powercfg /setacvalueindex SCHEME_CURRENT 2a737441-1930-4402-8d77-b2bebba308a3 48e6b7a6-50f5-4782-a5d4-53bb8f07e226 0
powercfg /setdcvalueindex SCHEME_CURRENT 2a737441-1930-4402-8d77-b2bebba308a3 48e6b7a6-50f5-4782-a5d4-53bb8f07e226 0
powercfg /setactive SCHEME_CURRENT
powercfg /query SCHEME_CURRENT 2a737441-1930-4402-8d77-b2bebba308a3警告
设备管理器里的 USB 节电也要关
在电源计划里禁用选择性暂停是必要的,但往往还不够。设备管理器中的“USB 根集线器”和“USB 集线器”设备也可能有自己的“电源管理”选项卡,不过并不是每个集线器都会显示。凡是有这个选项卡的,“允许计算机关闭此设备以节约电源”默认都是勾选的,所以要把链路上每个集线器的这一项都取消勾选。如果两处设置都改了,DMA 卡空闲一段时间后仍然消失,先怀疑线缆或接口,再怀疑卡。
常见 USB 问题及解决方法
每一行对应一个大家经常搜索的症状。请按顺序往下排查,因为每一项解决方法的成本都比下一项低。
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 设备显示为 High speed 而不是 SuperSpeed | 用了 USB 2 线或只能充电的线,或者接口看着像 USB 3 实际却不是 | 换成支持数据传输的 USB 3 线,再换到主板说明书中标明为 USB 3 的接口。每改一项都重新检查显示的速率 |
| 摄像头或移动硬盘一工作,读取速率就暴跌 | 两个设备挂在同一个主机控制器下,正在共享它的带宽 | 把另一个设备移到其他控制器的接口上,或者本次使用时干脆拔掉它 |
| 设备空闲几分钟后消失 | USB 选择性暂停,或者某个 USB 根集线器仍被允许断电 | 在电源计划中禁用 USB 选择性暂停,然后把链路上每个显示该选项的集线器的电源管理复选框都取消勾选 |
| 在一个后置接口上正常,换到旁边的接口就失败 | 这两个接口属于不同的控制器,只有其中一个驱动正常、供电预算也够 | 把 DMA 卡固定在能用的那个接口上并做好标记,因为即使两个接口挨在一起,也不能互换 |
| 一直很稳定,直到在机器上任意位置加了扩展坞或集线器 | 集线器多加了一层,而且任何变动都会让它重新协商共享的上行链路 | 把扩展坞永久移出 DMA 卡的链路,只用它来接鼠标、键盘和显示器 |
| Unknown USB device, descriptor request failed(中文系统显示为“未知 USB 设备(设备描述符请求失败)”) | 链路质量太勉强,无法完成枚举:通常是线缆问题,有时是插口损坏 | 换一根短的、确认完好的线,插到另一个后置接口上试试;如果确认完好的线在两个控制器上都失败,就要怀疑 DMA 卡上的插口 |
USB 常见问题
如果确实需要更多接口,能用带独立供电的集线器吗?
接外设可以,但 DMA 卡默认不要这样接。如果实在别无选择,就用一个不接任何其他设备的带供电的集线器,并在信任它之前先测一下读取速率。
线缆长度有影响吗?
有,因为 USB 3 的信号容限会随长度下降,便宜的长线是间歇性掉线的常见原因。用能轻松够到的最短的线。
怎么知道哪些接口共用一个控制器?
在设备管理器中选择“查看”→“依连接排序设备”,就能看到真实的树状结构,挂在同一个主机控制器下的设备都共用该控制器。USBView 显示的是同一棵树,并且附带速率。
USB 2 接口到底能不能用?
通常能完成枚举,但吞吐量会被严重限制,所以 USB 2 链路只能当作一个诊断结果,而不是可以长期保留的配置。
在设备管理器里禁用其他 USB 设备有帮助吗?
很少有帮助。直接拔掉更可靠,也方便恢复;禁用设备则会让这台机器多出一处改动,以后你还得记着。
资料来源
除上面列出的两份参考资料外,关于后置接口、共享控制器和掉线的内容,都来自团队在自己机器上的实测。
- 01
- 02
继续阅读
仍然没有解决?在 Discord 提交工单
全部指南