【问题标题】:USB for embedded devices - designing a device driver/protocol stack用于嵌入式设备的 USB - 设计设备驱动程序/协议栈
【发布时间】:2010-10-05 18:09:18
【问题描述】:

我的任务是为嵌入式设备编写一个设备驱动程序,该设备将通过 SPI 接口与微控制器通信。最终,USB 接口将用于从外部下载更新的代码并在验证阶段使用。

我的问题是,有没有人知道一个很好的参考设计或文档或在线教程,其中涵盖了嵌入式系统中 USB 协议栈/设备驱动程序的实现/设计?我刚刚开始阅读 650 页的 USB v2.0 规范目前有点令人生畏。

仅供参考,我使用的微控制器是飞思卡尔 9S12。

标记

基于 Goldenmean 的 (-AD) cmets,我想添加以下信息:

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。

【问题讨论】:

    标签: embedded usb device-driver


    【解决方案1】:

    在为任何接口(USB、并行端口等)编写设备驱动程序时,需要开发的代码将取决于该处理器/微控制器上是否运行任何操作系统 (OS)、RTOS。 例如如果要运行的话,WinCE - 它将有自己的驱动程序开发工具包,以及在设备驱动程序开发中要遵循的步骤。对于任何其他操作系统(如 Linux、symbian)也是如此。

    如果它是控制处理器/微控制器的普通固件代码(无操作系统),那么情况就完全不同了。 因此,根据您所处的上述任何一种情况,您需要阅读和理解:-

    1.) 处理器/微控制器开发板的硬件规格 - 寄存器文件、端口、内存布局等。

    2.) USB 规格

    3.) 我很快找到了几个指针。谷歌应该是你的朋友! http://www.lrr.in.tum.de/Par/arch/usb/usbdoc/ - Linux USB 设备驱动程序

    http://www.microsoft.com/technet/archive/wce/support/usbce.mspx

    -AD

    【讨论】:

      【解决方案2】:

      我使用的是早期版本的USB Complete by Jan Axelson。确实很完整。

      来自编辑评论:

      现在是第四版,通用串行总线 (USB) 接口开发人员指南涵盖了项目开发的所有方面,例如硬件设计、设备固件和主机应用软件。

      【讨论】:

      • Marcelo,感谢您提供的信息,我将把它放在我的愿望清单上,但是在本书出版之前我需要开发设备驱动程序和协议层。我确实订购了同一作者的另一本书。
      • 嗯,没看到还没出,抱歉。但我很高兴它对你有用 =) 她的书很棒。
      • 当我问及 USB 设备协议时,这是我的技术主管推荐的书。
      【解决方案3】:

      我很好奇,你为什么选择 9S12?我在以前的工作中使用过它,但并不满意。

      • 它的 gcc 支持很差,所以我们使用 Metrowerks
        • 这对于 C 来说可能没问题,但经常会生成错误的 C++
        • 使用二进制项目文件的 IDE 很糟糕!
      • 9s12 也很慢,很多指令在 5 个周期内执行。
      • 也不是很节能。
      • 没有桶形移位器,使嵌入式代码中常见的操作变慢
      • 没那么便宜。

      我唯一不喜欢的是 8051。我目前的工作是使用 ARM CortexM3,它在各方面都比 9S12 好(更快的时钟,每个时钟完成的工作更多,功耗更低,更便宜,良好的 gcc 支持,32 位与 16 位)。

      【讨论】:

      • 您可以将项目文件从二进制文件切换为基于文本的 (XML),但总体而言,Codewarrior 仍然很糟糕。不过,他们目前正在开发基于 Eclipsed 的 IDE。
      【解决方案4】:

      我不知道您打算使用哪种硬件,但假设这很灵活,STMicro 提供了一系列支持 USB/SPI 的微控制器和一个可与其部件一起使用的 C 代码库。 -- 我多年来一直使用他们的 ARM7 系列微机并取得了巨大的成功。

      【讨论】:

        【解决方案5】:

        这是一个由德克萨斯大学教授 Jonathan Valvano 维护的优秀网站。他在那里教四门课程(三门本科,一门研究生),都是关于使用 9S12 微控制器的。他的网站包含他在所有课程中使用的所有讲义、实验室手册,更重要的是,还有入门文件。

        该网站看起来像是 90 年代的,但只要稍微挖掘一下,您就会找到所需的一切。

        users.ece.utexas.edu/~valvano/

        【讨论】:

        • 我检查了这个网站并查看了代码,但更多的是将数据从 RS-232 传输到 USB 接口。所以大部分代码都是与 UART 接口而不是 USB。
        【解决方案6】:

        考虑将 AVR 用于您的下一个 MCU 项目,因为它具有出色的 LUFAV-USB 库。

        【讨论】:

        • 我愿意,但通常是硬件和系统工程组决定平台的选择。我会选择编译器工具,通常是 Green Hills。我在这件事上确实有发言权,但它是有限的。
        【解决方案7】:

        我正在使用 Atmel V71 开展一个项目。该处理器非常强大,在芯片上提供的众多高端连接中,有一个 USB 引擎,它将为 480 Mhz 或 48 Mhz(不是 USB 3.0)执行设备或主机模式。这些工具是免费的,并附带许多主机和设备 USB 示例项目,其中包含所有 USB 堆栈代码。它支持 10 个端点,所有传输都通过 DMA 完成,因此您可以将大部分处理器马力用于其他任务。 Atmel USB 堆栈无需 RTOS 即可工作

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-18
          • 1970-01-01
          相关资源
          最近更新 更多