我正在开发用于微控制器的USB设备堆栈。 “为什么?”你可能会问?首先,最重要的是:制造商的驱动程序(是我的出发点)是完全垃圾。它没有以正确的方式对USB复位做出反应(所有端点都应该已经被初始化),它没有以正确的方式对设置包做出反应(当接收到设置包时,端点0必须被重新初始化),并且根据设备是以高速还是全速模式运行,它不允许使用不同的描述符。除此之外,由于控制器非常智能,因此没有什么可做的:端点基本上由控制器管理,并且控制器与DMA缓冲区的链接列表一起使用以与应用程序通信。所有ACK / NACK / NYET逻辑都在控制器本身中,如果DMA缓冲区用完,它将自动发送NACK / NYET。
但是我越来越沮丧。该设备对我有效(TM),但朋友报告说该设备不适用于他们。我慢慢发现制造商的驱动程序有问题。它所需要的只是USB端口或电缆损坏,主机缺少一些ACK,并且USB驱动程序/控制器处于损坏状态,并且我的设备不再响应。我可以想到很多必须解决的极端情况,但是我没有任何测试方法。尤其是我的设备发送的DATA数据包缺少ACK似乎是一个问题。
让我们考虑两种情况:
我的设备在端点0上收到SETUP数据包。我以DATA数据包作为响应。主机不发送ACK。相反,主机发送另一个SETUP数据包(与以前相同)。
据我所知,我必须取消端点0上的所有挂起的传输(尚未确认DATA数据包,因此它仍在DMA缓冲区的队列中)。然后,我必须发送新的DATA数据包。
我的设备在任何端点(端点0,批量端点等)上发送数据。主机不发送ACK。而是检测到USB设备重置。
我必须取消所有端点上的所有挂起的传输(某些数据包可能仍在DMA缓冲区的队列中)。然后我等待端点0上的常见内容(SETUP数据包等)
我已经运行了USB3CV工具的第9章测试。它仅适用于Windows。它会为我的USB 3控制器加载一些特殊的测试xHCI驱动程序,然后开始测试我的USB设备。我的设备通过了所有测试。测试基本上似乎是下载所有描述符,然后检查它们的一致性。我的描述符现在固定。所有指示灯均为绿色。但这不是我想要的。
如上所述,只有在一个USB设备堆栈可以控制主机控制器发送的单个数据包时,才能对USB设备堆栈进行彻底的测试。例如,也许标准的EHCI或xHCI控制器甚至都无法抑制ACK。
彻底测试USB设备堆栈的最便宜方法是什么?是否有特殊的USB 2.0主机控制器?也许一些基于FPGA的解决方案?当然,还需要特殊的软件来控制主机控制器。