- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux2.6环境下USB设备的驱动实现
?? 2010年04月09日 ?? 来源:转载 ?? 作者:孙尧 ?? 收藏本文
-
Linux的USB设备端的源代码中主要有USB device的海量存储设备、串口设备、网络设备等设备驱动程序及各种USB device控制器芯片的驱动程序。市场上USB设备控制器芯片种类繁多,大多数用户需要针对特定应用来开发相关的USB设备控制器驱动程序,才能使设备正常工作在linux操作系统下。
0 引言
嵌入式linux系统环境以其易于移植裁减、内核小、效率高、完整、原代码开放及性能优异等特点,在嵌入式领域得到了非常广泛的应用。Linux的USB设备端的源代码中主要有USB device的海量存储设备、串口设备、网络设备等设备驱动程序及各种USB device控制器芯片的驱动程序。市场上USB设备控制器芯片种类繁多,大多数用户需要针对特定应用来开发相关的USB设备控制器驱动程序,才能使设备正常工作在linux操作系统下。
1 USB设备端驱动系统
Linux Gadget子系统主要分为三层:第一层为芯片驱动层,负责将各种USB device控制器抽象为统一的函数接口,以供上层驱动程序调用;第二层主要是对操作函数的简单封装;第三层为设备驱动层,可根据系统的需求实现所对应的功能。图1所示是Linux Gadget子系统的驱动层次。Linux Gadget子系统的设备驱动层主要根据各个类别的规范及协议实现各种设备的驱动,本设计需要使一个嵌入式设备拥有移动硬盘的功能,所以,可以根据海量存储类的规范及协议来实现该功能。
1.1 UDC驱动的基本构架
图 2所示是UDC驱动的基本构架图。在控制器驱动程序中,首先应注册platform驱动,调用其probe函数搜索设备,并在probe函数内初始化 usb_ep和usb_gadget等结构,然后注册设备,并申请中断,接着等待中断进入中断服务子程序,最后声明和实现 usb_gadget_register_driver注册函数并输出给上层驱动。在该过程中,联系它们的纽带是一些全局结构体变量。
.2 Gadget API
Gadget API为Gadget系统定义了统一的数据结构和接口函数,它和主机端的USB Core地位类似,但功能仅限于提供编程接口,如用结构体usb_gadget_ops和usb_ep_ops对设备控制器驱动操作函数和端点操作函数进行重新封装。比较特殊的是Gadget驱动程序注册函数usb_gadget_register_driver,它们是由设备控制器(UDC)驱动直接提供的,用于将UDC绑定到gadget driver。这增加了Gadget Driver和UDC之间的依赖性。
在设备端,Gadget系统虽然类似主机驱动系统分了三层结构,但Gadget API只定义了一些数据结构、宏和功能函数,并对UDC驱动程序进行了简单包装,而没有驱动管理等功能。
1.3设备应用驱动程序
设备端应用程序(Gadget Driver)用于控制USB设备功能的实现,使设备表现出“网络连接”、“打印机”或“大容量存储设备”等特性。本文以大容量移动存储设备为例来实现移动硬盘的功能。
BULK ONLY传输指的是主机和大容量存储设备之间的一种数据传输方式。
2设备端驱动调度
在嵌入式Linux操作系统中,Gadget driver和Gadget API可完成部分USB协议处理、BULK ONLY等传输协议以及指令的解析处理,用户只需要在设备控制器驱动程序中完成部分USB协议处理和Gadget API的衔接工作。
图 3所示的流程图给出了USB设备端驱动程序的基本调度思想。该方案的主要思路是被动的接受主机端的传输命令(任何类型的通信都由USB主机发起,USB设备间不能直接通信),然后通过中断触发的方式完成主机端的数据传输。当产生设备端中断时,设备控制器驱动程序首先判断中断类型。当其为批量传输端点IN中断时,驱动程序会将该EP下链接的REQ中的数据依次写入USB2.0 OTG IP的设备控制器的内存区;当其为批量传输OUT中断时,驱动程序会将设备控制器内存区的数据读入REQ中的buffer中;当其为端点0的控制传输中断时,驱动程序将读取端点缓冲区的数据,并解析当前的设备请求。如果主机传输给设备的设备请求为USB REO SEDRESS(设置设备地址)、USB_REQ_GET_STATUS(获取设备状态)、USB_REQ_SET_FEATURE(设置设备特性),设备控制器驱动程序会自行响应请求。但是,如果是其它设备请求,如GET_DESCRIPTOR(获取设备描述符)时,设备控制器驱动便会将该请求提交给 Gadg
文档评论(0)