我的任务是为嵌入式设备编写一个设备驱动程序,它将通过 SPI 接口与微控制器通信。最终,USB 接口将用于从外部下载更新的代码并在验证阶段使用。
我的问题是,有没有人知道一个好的参考设计或文档或在线教程,其中涵盖了嵌入式系统中 USB 协议栈/设备驱动程序的实现/设计?我刚刚开始阅读 650 页的 USB v2.0 规范目前有点令人生畏。
仅供参考,我使用的微控制器是飞思卡尔 9S12。
标记
根据 Goldenmean 的 (-AD) 评论,我想添加以下信息:
1) 嵌入式设备使用自定义执行程序,不使用 COTS 或 RTOS。
2) 设备将使用中断来指示数据已准备好从设备中检索。
3) 我已经阅读了一些关于 Linux 的文档,但是由于我对 Linux 一点也不熟悉,所以目前它不是很有帮助(尽管我希望它会很快)。
4) 设计方法,至少现在,它为 USB 设备编写设备驱动程序,然后 USB 协议层 (I/O) 将驻留在设备驱动程序的顶部以解释数据。我认为这将是最好的方法,尽管我可能是错的。
编辑 - 一年后
我只是想在它们从我脑海中消失之前分享一些东西,以防我再也不会在 USB 设备上工作。在开发代码并首次启动和运行时,我遇到了一些障碍。
我遇到的第一个问题是,当 USB 设备连接到主机(在我的情况下为 Windows)时,主机发出了重置请求。USB 设备将复位并清除中断使能标志。我没有阅读足够多的文献来知道这种情况正在发生,因此我从未收到设置请求中断。我花了很长时间才弄清楚这一点。
我遇到的第二个问题是没有正确处理 Set_Configuration 的设置请求。我正在处理它,但我没有正确处理请求,因为当这个设置请求进来时 USB 设备没有发送 ACK。我最终通过使用硬件 USB 协议分析器发现了这一点。
我还遇到了其他问题,但这是我花了很长时间才弄清楚的两个最大的问题。我不得不担心的另一个问题是大端和小端,分别是飞思卡尔 9S12 与 USB 数据格式(英特尔)。
我最终构建了类似于我过去所做的 UART 设备驱动程序的 USB 设备驱动程序。我已在以下 URL 上发布了代码。
http://lordhog.wordpress.com/2010/12/13/usb-drive
我经常使用结构,因此人们可能不喜欢它们,因为它们不像使用#defines 那样具有门户(例如,MAX3420_SETUP_DATA_AVAIL_INT_REQR 0x20),但我喜欢它们,因为它使代码对我来说更具可读性。如果有人对此有任何疑问,请随时发送电子邮件,我可以尝试提供一些见解。只要您知道要专注于哪些领域,“USB Complete:开发人员指南”一书就会很有帮助。这是一个简单的应用程序,只使用了低速 USB。