用于嵌入式设备的USB - 设计设备驱动程序/协议栈

时间:2009-02-05 18:22:45

标签: embedded usb device-driver

我的任务是为嵌入式设备编写设备驱动程序,该驱动程序将通过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协议分析仪找到了这个。

我遇到了其他问题,但这些是我花了很长时间才弄明白的两个最大问题。我不得不担心的另一个问题是big-endian和little-endian,分别是Freescale 9S12和USB数据格式(Intel)。

我最终建立的USB设备驱动程序类似于我过去所做的UART设备驱动程序。我已将代码发布到以下网址。

http://lordhog.wordpress.com/2010/12/13/usb-drive

我倾向于使用很多结构,所以人们可能不喜欢它们,因为它们不像使用#defines那样是门户(例如,MAX3420_SETUP_DATA_AVAIL_INT_REQR 0x20),但我喜欢它们,因为它使代码对我来说更具可读性。如果有人对此有任何疑问,请随时发送电子邮件,我可以尝试给它一些见解。只要您知道要关注哪些方面,“USB Complete:开发人员指南”这本书就很有帮助。这是一个简单的应用程序,只使用低速USB。

7 个答案:

答案 0 :(得分:5)

在为任何接口(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

答案 1 :(得分:3)

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

来自编辑评论:

  

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

该网站看起来像是从90年代开始,但只是挖掘一下,你应该找到你需要的一切。

users.ece.utexas.edu/~valvano/

答案 5 :(得分:0)

考虑AVR用于您的下一个MCU项目,因为它是非常棒的LUFAV-USB库。

答案 6 :(得分:0)

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