我正在尝试使用 Atmel 处理器上的 USB 主机端口连接到单个 USB 设备。我有一个内存有限且没有操作系统的嵌入式系统。我想实现一个简单的专用主机来连接单个 USB 从设备。
谁能指导我实现一个简单的 USB 主机?
处理器是 Atmel AT91SAM9261S。
首先,如果我没记错的话,AT91SAM9261S板载OHCI usb 控制器,您至少需要实现简单的主机控制器驱动程序(您可以查看 Linux 实现)。根据您的设备将使用的传输类型,它可能不是很难 - 非常难:) 没有简单的方法来实现 USB 堆栈。实现控制器驱动程序后,您需要注意 USB 设备枚举部分,请参阅USB 规范的第 9 章。只有在此之后,您才能开始实现您的设备逻辑。
对于简化的用例,有很多代码可以省略,但是如果没有良好的 USB 背景,很难确定哪些相关,哪些不相关。
如果您正在寻找商业解决方案,我公司可以提供任何方式。
我使用了On-Time 的RTUSB-32堆栈。这是一个很小的足迹堆栈,很容易集成到我们的环境中,文档很好。它们很好地抽象出所需的支持,因此它完全是平台和操作系统中立的,并且您需要提供给它的钩子数量相对较少 - 即:它被很好地封装。
由于您获得了所有源代码,您会发现该代码肯定不是世界上结构最完善的代码,但如果需要,无需大量工作即可破译它。无论如何,它基本上“正常工作”没有问题。我们已经让它在一些产品中运行了几年,并且只遇到了一个与堆栈的兼容性问题,它不能完全正确地使用某种类型的 USB 2.0 集线器进行自动发现。我们向他们发送了集线器的样本,他们在几天内就获得了补丁。很难打败它。总的来说,我认为这是一个很好的价值,当然比坐下来从头开始写东西要好。
如果您的设备不必是主机,这会容易得多:-P,因为 Atmel 提供了 USB 设备的示例源代码。如果我是你,我会考虑在Atmel 的 AT91SAM 第三方页面上使用喜欢 USB 的 RTOS 之一,这可能需要 Ilya 建议的 jungo 的 USB 堆栈。
如果您确实编写了自己的 OHCI 驱动程序,那么libusb作为 USB 堆栈上层的实现可能会有所帮助。