首页 文章

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

提问于
浏览
8

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

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

就像一个FYI,我使用的微控制器是飞思卡尔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数据格式(英特尔) .

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

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

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

7 回答

  • 0

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

    从编辑评论:

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

  • 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

    -广告

  • 3

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

    • 它有糟糕的gcc支持所以我们使用了Metrowerks

    • 这可能对C来说没问题,但经常会产生错误的C

    • 有一个糟糕的IDE与二进制项目文件!

    • 9s12也很慢,很多指令在5个周期内执行 .

    • 也不是很节能 .

    • 没有桶形移位器,使嵌入式代码中常见的操作变慢

    • 不那么便宜 .

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

  • 5

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

  • 0

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

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

    users.ece.utexas.edu/~valvano/

  • 0

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

  • 0

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

相关问题