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

Embedded 用于嵌入式设备的USB-设计设备驱动程序/协议栈,embedded,usb,device-driver,Embedded,Usb,Device Driver,我的任务是为嵌入式设备编写设备驱动程序,该设备将通过SPI接口与微控制器通信。最终,USB接口将用于从外部下载更新的代码,并在验证阶段使用 我的问题是,是否有人知道一个好的参考设计或文档或在线教程,其中涵盖了嵌入式系统中USB协议栈/设备驱动程序的实现/设计?我刚开始阅读650页的USBV2.0规范,目前有点让人望而生畏 仅供参考,我使用的微控制器是飞思卡尔9S12 标记 根据goldenmean(-AD)的评论,我想添加以下信息: 1) 嵌入式设备使用定制的执行器,不使用COTS或RTOS 2

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

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

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

标记

根据goldenmean(-AD)的评论,我想添加以下信息:

1) 嵌入式设备使用定制的执行器,不使用COTS或RTOS

2) 设备将使用中断来指示数据已准备好从设备检索

3) 我已经阅读了一些关于Linux的文档,但是由于我对Linux一点也不熟悉,所以目前它没有什么帮助(尽管我希望它会很快)

4) 至少目前的设计方法是为USB设备编写一个设备驱动程序,然后USB协议层(I/O)将驻留在设备驱动程序的顶部以解释数据。我认为这是最好的方法,尽管我可能错了

编辑-一年后

我只想在它们从我脑海中消失之前分享一些东西,以防我再也不使用USB设备了。我在开发代码并在第一次启动和运行时遇到了一些障碍

我遇到的第一个问题是,当USB设备连接到主机(在我的例子中是Windows)时,主机发出重置请求。USB设备将重置并清除中断启用标志。我没有阅读足够的文献来知道这正在发生,因此我从未收到设置请求中断。我花了很长时间才弄明白这一点

我遇到的第二个问题是没有正确处理Set_配置的设置请求。我正在处理它,但我没有正确处理请求,因为当这个设置请求传入时,USB设备没有发送ACK。我最终通过使用硬件USB协议分析仪发现了这一点

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

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


我倾向于大量使用结构,因此人们可能不喜欢它们,因为它们不像使用#定义(例如,MAX3420_SETUP_DATA_AVAIL_INT_REQR 0x20)那样是门户,但我喜欢它们,因为它使代码对我来说更具可读性。如果有人对此有任何疑问,请随时发送电子邮件,我可以尝试提供一些见解。《USB Complete:开发者指南》一书很有帮助,只要你知道应该关注哪些领域。这是一个简单的应用程序,仅使用低速USB。

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

如果它将是一个普通的固件代码(没有操作系统)来控制处理器/微控制器,那么情况就完全不同了。 因此,基于上述任一情况,你需要阅读并理解:-

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

2.)USB规格

3.)我很快找到了两个指针。谷歌应该是你的朋友! -Linux USB设备驱动程序


-AD

我不知道您计划使用哪种硬件,但假设这是灵活的,STMicro提供了一系列支持USB/SPI的微控制器,以及一个可用于其部件的C代码库。-多年来,我一直在使用他们的ARM7系列micros,并取得了巨大成功。

我使用的是早期版本的。确实很完整

编辑评论:

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


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

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

我唯一不喜欢的是8051。我在目前的工作中使用ARM CORTEXM3,它比9S12在各个方面都好(更快的时钟,每时钟做更多的工作,更少的功耗,更便宜的,好的GCC支持,32位vs 16位)。这是一个由德克萨斯大学教授Jonathan Valvano维护的优秀站点。他在那里教四门课程(三门本科,一门研究生),都是关于使用9S12微控制器的。他的网站包含了所有的课堂讲稿、实验手册,更重要的是,他在所有课程中使用的入门文件

我们