嵌入式Linux下USBGadget驱动框架研究_图文_第1页
嵌入式Linux下USBGadget驱动框架研究_图文_第2页
嵌入式Linux下USBGadget驱动框架研究_图文_第3页
嵌入式Linux下USBGadget驱动框架研究_图文_第4页
嵌入式Linux下USBGadget驱动框架研究_图文_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Dec 12006 Vol 124, No . 6航 天 控 制 Aer os pace Contr ol嵌入式 L i n ux 下 USB Gadget 驱动框架研究3李传伟 胡金春清华大学智能技术与系统国家重点实验室 , 北京 100084 摘 要 为更好地应用嵌入式 L inux 系统下的 US B , 介绍了 US B 的相关概念及其设备驱动模型 US 构 , 以 Ethernet Gadget 驱动程序的整体思路 , 最后总结了 US B 。 关键词 L Gadget 驱动框架 设备驱动程序 . 89文献标识码 :A 10063242(2006 0620051205Study on

2、 USB Gadget D r i ver Fram ework i n Em bedded L i n uxL i Chuan wei Hu J inchunState Key Laborat ory of I ntelligent Technol ogy and Syste m s,Tsinghua University, Beijing 100084, ChinaAbstract To apply the US B Gadget driver F ram e w ork in e m bedded L inux syste m m uch better , US B basickno w

3、 ledge and its d riverm odel a re introduced, then the m ain data structures of Gadget d river are analyzed . A s a result, w riting Gadget driver HOW 2TO is de m onstrated by the E thernet Gadget driver . The li m itations of this fram e w ork are poin ted out and i m prove m ents are m ade finally

4、 .Key words L inux syste m US B Gadget driver fram e w ork D evice driver 3973资助项目 (51323010323 收稿日期 :2006205216作者简介 :李传伟 (1980- , 男 , 河南通许人 , 硕士研究生 , 主要研究方向为嵌入式系统 ; 胡金春 (1972- , 男 , 江苏淮 安人 , 副教授 , 主要研究方向为飞行控制 、 信号处理等 。1 引 言通用串行总线 (US B 是主机和外设之间一种重要的连接方式 , 它以单一类型总线连接各式各样的 设备 , 接口简单统一 、 支持热插拔 、 易于安装和

5、扩展 , 最多可连接 127个外设 , 目前 US B2. 0版本最高速 率可以达到 480Mbp s 。由于其众多优点 , US B 成为 主机与外设进行数据交换的必备接口 。L inux 以其开源 、 易于移植和可裁剪性 , 越来越多地被应用于嵌入式系统 。 L inux 内核支持 2种主要类型的 US B 驱动程序 :主机侧和设备侧驱动程 序 。 主机侧 US B 驱动程序 (US B Device D river 控制 与其连接的 US B 设备从而使用设备的功能 ; 设备侧 US B 驱动程序 (US B Gadget D river 控制设备如何与主机通信从而使其对主机表现出特定的

6、功能 1, 此 时的设备应理解为运行 L inux 的嵌入式系统 。迄今 为止对于 L inux 系统中 US B 设备驱动开发的研究非 常丰富 , 但是主要讨论主机侧驱动程序的实现机制 , 本文将着重分析设备侧 US B Gadget 驱动框架 。 15航 天 控 制 2006年2 USB 总线数据交换特点US B 采用树形拓扑结构 。主机侧和设备侧的 US B 控制器分别称为主机控制器 (Host Contr oller 和 US B 设备控制器 (UDC , 每条总线上只有一个主机控制器 , 负责协调主机和设备间的通信 , 而设备不 能主动向主机发送任何消息 。主机控制器通过 UDC 的

7、端点 (Endpoint 与设 备进行通信 , 端点由端点号和传输方向确定 , 仅能单 向传输数据 。 US B 端点有 4种类型 , 分别对应 数据传输方式 : 控制 (Contr ol :, 种可靠 、 批量 (Bulk :, 但时 间要求不严格 。中断 (I nterrup t :以固定速率传送少量数据 。 等时 (Is ochr onous :以恒定速率实时传输数据 流 , 但对正确性并无要求 。其中 0号端点是所有 US B 设备的缺省端点 , 支 持控制传输 。 在设备连接到 US B 总线 、 被供电并接 收到总线复位信号之后 , 主机侧驱动程序通过 0号 端点初始化并操纵 US

8、 B 设备 。在 US B 协议中 , 接口 (I nterface 由多个端点组 成 , 代表一个基本的功能 , 是 US B 设备驱动程序控 制的对象 , 一个功能复杂的 US B 设备可以具有多个 接口 。 配置 (Configurati on 是更高层的逻辑概念 , 由 多个接口组成 , 一个 US B 设备可以具有多个配置 ,不同的配置使设备表现出不同的功能组合 2。 US B 设备的逻辑组织如图 1所示。 图 1 US B 设备逻辑组织3 L i n ux 下 USB 驱动的整体框架L inux 对主机侧和设备侧 US B 驱动程序的开发都提供了良好的支持 , 整体框架如图 2所示

9、 。在主 机侧 , L inux 内核 US B Core 子系统负责 US B 驱动管 理和协议处理的主要工作 US B Core 子系统功能 包括 :、 宏和功能函数 , 向上 , US B 主机控制器 完成设备热插拔控制 、 总线数据传输3。图 2 L inux 下 US B 设备驱动整体框架L inux 内核中 US B 设备侧驱动程序分为 3个层次 :UDC 驱动程序 、 Gadget AP I 和 Gadget 驱动程序 。 UDC 驱动程序直接访问硬件 , 控制 US B 设备和主机间的底层通信 , 向上层提供与硬件相关操作的回调 函数 。 当前 Gadget AP I 是 UD

10、C 驱动程序回调函数 的简单包装 。 Gadget 驱动程序具体控制 US B 设备 功能的实现 , 使设备表现出“ 网络连接 ” 、 “ 打印机 ” 或 “ US B Mass St orage ” 等特性 , 它使用 Gadget AP I 控 制 UDC 实现上 述 功 能4。 Gadget AP I 把 下 层 的UDC 驱动程序和上层的 Gadget 驱动程序隔离开 , 使得在 L inux 系统中编写 US B 设备侧驱动程序时能够 把功能的实现和底层通信分离 。4 Gadget 驱动框架分析L inux 系统中 Gadget 驱动程序框架见图 3。设备侧驱动程序使用 struct

11、 usb_gadget描述 UDC, 使用 struct usb_ep描述端点 , Gadget AP I 通过这 2个结构实现对 UDC 硬件的抽象 。struct usb_gadgetconst struct usb_gadget_ops op s; /3UDC 操作函数集指针 3/25第 24卷 第 6期 李传伟等 :嵌入式 L inux 下 US B Gadget 驱动框架研究 struct usb_ep 3ep0; /30端点指针 3/struct list_head ep_list;/3其他端点链表 3/struct device dev;/3用于 L inux 驱动模型 , 暂不

12、讨论 3/3省略一些属性域 3/;struct usb_ep const struct usb_ep_ops 3op s; /3端点操作函数集指针 3/struct list_headep_list;/3/ ;struct usb_gadget_ops 是 UDC 操作函数集 , 参见图 3, 函数的主要功能为 :返回 UDC 当前数据帧 、 唤 醒与设备相连接的主机 、 设置或清除设备自供电特 征 、 UDC 电源管理等 。struct usb_ep_ops 是 UDC 端点操作函数集 , 参 见图 3, 函数的主要功能为 :配置端点是否可用 、 为 端点分配或释放缓冲区 、 为端点分配或释

13、放请求对 象 、 向端点提交或取消一个特定请求 、 设置端点的停 止特征等 。设备侧驱动程序使用 struct usb_request描述一 个 I/O请求 , 与主机侧的 URB (US B Request B l ocks 结构类似 :struct usb_requestvoid buf; /3数据缓冲区 3/unsigned length; /3数据长度 3/void (3comp lete (struct usb_ep3ep, struct usb_request3req ;/3usb_request被处理后的回调函数 3/struct list_head list;/3用于将 usb

14、_request组织成链表 3/int status;/3usb_request请求的状态 3/ ;编写 UDC 驱动程序的主要任务就是配置 struct usb_gadget结构 、 实现 struct usb_ep_ops 和 struct usb _gadget_ops 相关的函数。图 3 Gadget 驱动框架Gadget AP I 层为 Gadget 驱动程序开发定义了一组接口函数 , 和主机侧的 US B Core 地位类似 , 但功 能仅限于向上提供编程接口 , 这些接口基本上是对 上述 UDC 操作函数和端点操作函数的包装 , 分别是 usb_gadget _3和 usb _e

15、p _35。比 较 特 殊 的 是Gadget 驱动程序注册函数 usb_gadget_register_driv2er, 它由 UDC 驱动程序直接提供 , 用于将 Gadget 驱动程序绑定到 UDC (usb_gadget 。Gadget 驱动程序使用结构 struct usb _gadget_driver 描述 :struct usb_gadget_driverenu m usb_device_speed s peed; /3设备最高速度 3/int (3bind (struct usb_gadget3 ; /3将驱动与设备绑定 3/int (3setup (struct usb_ga

16、dget3, const struct usb_ctrlrequest3 ;void (3sus pend (struct usb_gadget3 ; struct device_driverdriver; ;函数 bind 负责完成 Gadget 驱动和下层设备控 制器的关联 , 并开启设备的功能 。 Gadget 驱动通过 上述 Gadget AP I usb_gadget_register_driver注册自己 对应的 usb_gadget_driver结构 , 而 usb_gadget_regis 2ter_driver函数是 UDC 驱动程序的重要组成部分 , 它调用参数 usb_g

17、adget_driver的 bind 函数 , 把 Gadget 驱动程序和 UDC 描述结构绑定在一起 。 Xxx_udc_35航 天 控 制 2006年irq 是 UDC 设备的中断处理函数 , 它处理设备及其 端点的中断请求 , 并调用各个端点上已完成传输请求 usb_request的回调函数 comp lete 。以下以 Ethernet Gadget 驱动程序为例展示编写 Gadget 驱动的要点 。5 Ethernet Gadget 驱动程序Ethernet Gadget 驱动程序使主机和 US B 设备可以通过 US B 总线实现 Ethernet 互连 。 L inux 主机侧

18、 的驱 动 属 于 Co mmunicati ons Device Class (W indo ws 主机侧的驱动遵循 RND I S 侧 , L inux Ethernet Gadget 为了简化讨论 , 系统的 情况 。, 两侧的驱动程序分别虚拟 出一个以太网络设备 , 主机和设备即可通过虚拟网 络设备建立连接 , 如图 4所示。 图 4 Ethernet Gadget 虚拟网络层次关系在 Ethernet Gadget 驱动程序中 , 使用自定义结 构 struct eth_dev完整地描述 Ethernet Gadget 设备 :struct eth_devstruct usb_gad

19、getgadget; /3Gadget 绑定的 UDC 3/struct usb_request3req;struct usb_ep3in_ep,3out_ep,3status_ep;struct list_headtx_reqs,rx_reqs;/3发送和接收请求 usb_request链表 3/struct net_device3net; /3网络设备描述结构 3/u8host_macET H_ALEN;/3网络设备 MAC 地址 3/ ;Ethernet Gadget 驱动程序被配置为 :static struct usb_gadget_drivereth_driver=. bind =

20、eth_bind,. setup =eth_setup,. sus pend =eth_suspend,;Gadget 驱 动 程 序 模 块 的 init 函 数 调 用 usb _gadget_register_driver( 完成驱动注册 。 函数调用 eth Gadget 驱动程Gadget 设备描述 并注册网络设备驱动程序 , 同时将 驱动程序 (usb_gadget_driver 和 UDC 描述结 构 (usb_gadget 关联起来 。int eth_bind(struct usb_gadget3gadget struct eth_dev3dev; struct net_dev

21、ice3net; struct usb_ep 3ep;net =all oc_etherdev(sizeof 3dev ; dev =net p riv; dev net =net;net hard_start_xm it =eth_start_xm it;net open =eth_open;net do_ioctl =eth_ioctl;/3为网络设备描述结构和 Gadget 设备描述结构分配内存并进行相关配置 3/dev gadget =gadget; set_gadget_data(gadget, dev ; gadget ep0 driver_data=dev; /3将 Gadget

22、 驱动和 UDC 描述结构绑定 3/register_netdev(dev net ; /3注册网络设备驱动程序 3/eth_start_xm it 是网络设备驱动程序的数据发送函数 , 它将从内核接收到的套接字缓冲区 struct sk_buff 3skb 中的数据组织成 US B 协议下的 struct usb _request,通过 Gadget AP I usb_ep_queue发送出去 。int eth_start_xm it (struct sk_buff3skb, struct net_device3net 45第 24卷 第 6期 李传伟等 :嵌入式 L inux 下 US B

23、 Gadget 驱动框架研究struct eth _dev 3dev =(struct eth _dev 3 net p riv;struct usb_request3req =NULL;req =container_of(dev tx_reqs . next, struct usb_request,list ;list_del(&req list ;req buf =skb data;req context =skb;req comp lete =tx_comp lete;/3数据发送完成后由 UDC数调用 co mp lete 函数 ,req, GFP_ATOM 2 I C ;/3向 I

24、N 端点提交数据发送请求 3/eth_open( 是网络设备的 open 函数 , 它调用 rx _submit 函数开始等待接收 US B 主机发送的数据 。 rx_subm it 为请求 usb_request分配接收缓冲区 , 并把 缓冲区组织成 struct sk_buff的形式 , 然后向 OUT 端 点 (主机 设备 提交接收请求 。int rx_subm it (struct eth _dev3dev, struct usb _re 2 quest 3req, int gf p_flagsstruct sk_buff3skb;size_tsize;size =(sizeof (s

25、truct ethhdr +dev net m tu +RX_EXTRA ;size +=dev out_ep maxpacket-1; size -=size %dev out_ep maxpacket;skb =all oc_skb(size, gfp_flags ;/3分配 struct sk_buff作为 struct usb_request的 接收缓冲区 3/req buf =skb data;req length =size;req comp lete =rx_complete;/3设置数据接收完成时的回调函数 3/req context =skb;usb_ep_queue(dev

26、 out_ep,req, gfp_flags ; 接收完成后即可通过 netif_rx ( 通知网络子系 统读取数据 , 这一工作是在回调函数 rx_complete 中 完成的 。void rx_complete (struct usb_ep3ep, struct usb_re 2 quest 3req struct sk_buff3skb =req context;struct eth_dev3dev ep driver_data;dev net;ocol =eth_type_trans(skb, dev ;/3将接收缓冲区配置为 struct sk_buff结构 3/ status =n

27、etif_rx(skb ;/3通知网络子系统读取接收到的数据 3/if (req rx_submit (dev, req, GFP_ATOM I C ;/3把刚完成的 usb_request 再次提交给特定端 点 , 以便不断地接收 US B 主机发送的数据 3/ 6 Gadget 驱动框架的不足与改进Gadget 框架是在 2. 4. 23版内核中才引入的 , 现 在仍不十分完善 。从整体上看 , 框架使用 struct usb _gadget描述 UDC 及其驱动程序 , 使用 struct usb _ gadget_driver 描述 Gadget 驱动 程序 , 通过 Gadget A

28、P I 为 Gadget 驱动提供编程接口并将其和 UDC 驱 动隔离 。 这种层次关系和主机侧 US B 驱动框架基 本相同 , Gadget AP I 层和主机侧的 US B Core 地位类 似 , 但仅对 UDC 驱动程序操作函数进行了简单的包 装 。 Gadget AP I 层并没有真正使 UDC 驱动程序和 Gadget 驱动程序隔离 , 无论在关键的描述结构上还 是在接口函数上都存在耦合 。首先 , struct usb_gadget_driver结构直接依赖于 struct usb_gadget结构的定义 , 这导致上层种类繁多 的 Gadget 驱动程序直接依赖于下层 UDC

29、 驱动程序 的模型 , UDC 驱动模型的改变必然要求 Gadget 驱动 程序大规模改写 。这使 Gadget AP I 的存在失去其 主要意义 。其 次 , Gadget 驱 动程 序注册 函数 usb _gadget_ (下转第 60页 5 560 Environment ( GATE A . 2005. I N GNSS 2005. O 航 天 控 制 Sep t . GPS/ GNSS 2003, Sep t 2003: 1953 1964. . 2006 年 6 Dellago R , Piep lu J M , Stalford R. The Galileo System A r

30、chitecture at the End of the Design Phase A . GPS/ GNSS 2003, Sep t 2003: 978 990. . 7 廖春发 . 2004 年欧洲伽利略计划的若干重要进展 J . I N O 4 B lomenhofer H , Ehret W , Leonard A , B lomenhofer E. GNSS/ Galileo Global and Regional Integrity Performance Analysis A . 2168. 5 Ganguly S, Jovancevic A , B rown A. Open A

31、 rchitecture Development System for GPS and Galileo A . I N O I N GNSS 17 th International Technical O M eeting of the Satellite D ivision, Sep t 2004: 2158 . 中国航天 , 2005 ( 3 : 29 30. 8 石卫平 . 国外卫星导航定位技术发展现状与趋势 J . 航天控制 , 2004 , 22 (4 : 30 35. (上接第 55 页 register_driver直接由 UDC 驱动程序导出 , 使得下层 UDC 驱动程序直接

32、依赖于上层的 Gadget驱动模型 . 7 结语 L inux系统中 USB Gadget驱动程序建立在 UDC 同时也意味着在 L inux设备侧驱动框架下每个 USB 设备只能有一个 UDC,虽然这能够满足当前大多数 设备的要求 ,但从发展的角度看 ,并不明智 . 为解决上述问题 ,减少 UDC 驱动程序和 Gadget 驱动程序之间的耦合 , 增强对复杂 USB 设备的支 持 ,需要对 Gadget驱动程序框架进行如下改进 : ( 1 将 Gadget AP I扩充为 Gadget Core 子系统 , 其功能包括 UDC 驱动和 Gadget 驱动的注册与管 理, 为编写 UDC 驱动和 Gadget驱动提供 AP I等 . ( 2 改写 struct usb_gadget_driver和 struct usb_ gadget使其仅依赖于 Gadget Core 子系统 . ( 3 依照 USB 协议 ,为 Gadget Core 子系统定义 标准的接口和配置描述结构 , 并提供管理和操纵这 些结构的 AP I . ( 4 在改进后的 Gadget驱动框架中 , Gadget驱 动程序仅依赖于其下层 Gadget Core 子系统 , UDC 驱 动程序仅向其上层 Gadget Core 子

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论