Linux 如何测试USB设备堆栈?

Linux 如何测试USB设备堆栈?,linux,usb,Linux,Usb,我正在为微控制器开发USB设备堆栈。“为什么?”你可能会问?首先也是最重要的:制造商的驱动程序,这是我的出发点,完全是垃圾。它没有以正确的方式响应USB重置(所有端点都应该重新初始化),它没有以正确的方式响应设置数据包(当接收到设置数据包时,端点0必须重新初始化),并且它不允许根据设备是以高速还是全速模式运行而使用不同的描述符。除此之外,由于控制器非常智能,所以没有太多工作要做:端点基本上由控制器管理,控制器使用DMA缓冲区的链接列表与应用程序通信。所有ACK/NACK/NYET逻辑都在控制器本

我正在为微控制器开发USB设备堆栈。“为什么?”你可能会问?首先也是最重要的:制造商的驱动程序,这是我的出发点,完全是垃圾。它没有以正确的方式响应USB重置(所有端点都应该重新初始化),它没有以正确的方式响应设置数据包(当接收到设置数据包时,端点0必须重新初始化),并且它不允许根据设备是以高速还是全速模式运行而使用不同的描述符。除此之外,由于控制器非常智能,所以没有太多工作要做:端点基本上由控制器管理,控制器使用DMA缓冲区的链接列表与应用程序通信。所有ACK/NACK/NYET逻辑都在控制器本身中,如果DMA缓冲区用完,它会自动发送NACK/NYET

但是我越来越沮丧了。该设备对我(TM)有效,但朋友报告说它对他们无效。我慢慢地发现了制造商的驱动程序的所有问题。所需要的只是一个坏的USB端口或电缆,主机缺少一些ACK,USB驱动程序/控制器处于坏状态,我的设备不再响应。我能想到很多必须处理的角落案例,但我没有任何方法来测试它们。尤其是我的设备发送的数据包丢失ACK似乎是一个问题

让我们考虑两个场景:

  • 我的设备在端点0上接收设置数据包。我用数据包回应。主机不发送ACK。相反,主机发送另一个设置数据包(与之前相同)

    据我所知,我必须取消端点0上所有挂起的传输(数据包尚未确认,因此它仍在DMA缓冲区队列中)。然后我必须发送新的数据包

  • 我的设备在任何端点(端点0、批量端点等)上发送数据。主机不发送ACK。相反,检测到USB设备重置

    我必须取消所有端点上所有挂起的传输(一些数据包可能仍在DMA缓冲区队列中)。然后我等待端点0上的常规内容(设置数据包等)

  • 我已经运行了USB3CV工具的第9章测试。它只在Windows上工作。它为我的USB 3控制器加载一些特殊的测试xHCI驱动程序,然后开始测试我的USB设备。我的设备通过了所有测试。测试基本上似乎下载了所有描述符,然后检查它们的一致性。我的描述符现在已修复。所有的灯都是绿色的。但那不是我想要的

    如上所述,只有在能够控制主机控制器发送的单个数据包的情况下,才能对USB设备堆栈进行全面测试。例如,标准EHCI或xHCI控制器甚至可能无法抑制ACK

    彻底测试USB设备堆栈最便宜的方法是什么?是否有特殊的USB 2.0主机控制器?也许是基于FPGA的解决方案?当然,还需要特殊的软件来控制主机控制器