- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内核USB驱动程序框架
PAGE PAGE 825.2? USB驱动程序框架Linux内核提供了完整的USB驱动程序框架。USB总线采用树形结构,在一条总线上只能有唯一的主机设备。Linux内核从主机和设备两个角度观察USB总线结构。本节介绍Linux内核USB驱动程序框架。25.2.1? Linux内核USB驱动框架图25-2是Linux内核从主机和设备两个角度观察USB总线结构的示意图。从图25-2中可以看出,Linux内核USB驱动是按照主机驱动和设备驱动两套体系实现的,下面介绍两套体系的结构和特点。1.基本结构图25-2的左侧是主机驱动结构。主机驱动的最底层是USB主机控制器,提供了OHCI/EHCI/UHCI这3种类型的总线控制功能。在USB控制器的上一层是主机控制器的驱动,分别对应OHCI/EHCI/UHCI这3种类型的总线接口。USB核心部分连接了USB控制器驱动和设备驱动,是两者之间的转换接口。USB设备驱动层提供了各种设备的驱动程序。USB主机部分的设计结构完全是从USB总线特点出发的。在USB总线上可以连接各种不同类型的设备,包括字符设备、块设备和网络设备。所有类型的USB设备都是用相同的电气接口,使用的传输协议也基本相同。向用户提供某种特定类型的USB设备时,需要处理USB总线协议。内核完成所有的USB总线协议处理,并且向用户提供编程接口。图25-2? Linux内核USB总线结构图25-2右侧是设备驱动结构。与USB主机类似,USB设备提供了相同的层次结构与之对应。但是在USB设备一侧使用名为Gadget API的结构作为核心。Gadget API是Linux内核实现的对应USB设备的核心结构。Gadget API屏蔽了USB设备控制器的细节,控制具体的USB设备实现。2.设备每个USB设备提供了不同级别的配置信息。一个USB设备可以包含一个或多个配置,不同的配置使设备表现出不同的特点。其中,设备的配置是通过接口组成的。Linux内核定义了USB设备描述结构如下:struct usb_device_descriptor {??? __u8? bLength;? ??? ??? ??? // 设备描述符长度??? __u8? bDescriptorType;? ??? // 设备类型??? __le16 bcdUSB;? ??? ??? ??? // USB版本号(使用BCD编码)??? __u8? bDeviceClass; ??? ??? // USB设备类型??? __u8? bDeviceSubClass;? ??? // USB设备子类型??? __u8? bDeviceProtocol;? ??? // USB设备协议号??? __u8? bMaxPacketSize0;? ??? // 传输数据的最大包长??? __le16 idVendor;??? ??? ??? // 厂商编号??? __le16 idProduct;?? ??? ??? // 产品编号??? __le16 bcdDevice;?? ??? ??? // 设备出厂号??? __u8? iManufacturer; ??? // 厂商字符串索引??? __u8? iProduct; ??? ??? ??? // 产品字符串索引??? __u8? iSerialNumber; ??? // 产品序列号索引??? __u8? bNumConfigurations;?? // 最大的配置数量} __attribute__ ((packed));从usb_device_descriptor结构定义看出,一个设备描述符定义了与USB设备有关的所有信息。3.接口在USB体系中,接口是由多个端点组成的。一个接口代表一个基本的功能,是USB设备驱动程序控制的对象。一个USB设备最少有一个接口,功能复杂的USB设备可以有多个接口。接口描述定义如下:struct usb_interface_descriptor {??? __u8? bLength;? ??? ??? ??? // 描述符长度??? __u8? bDescriptorType;? ??? // 描述符类型??? __u8? bInterfaceNumber; ??? // 接口编号??? __u8? bAlternateSetting; // 备用接口编号??? __u8? bNumEndpoints; ??? // 端点数量??? __u8? bInterfaceClass;? ??? // 接口类型??? __u8? bInterfaceSubClass;?? // 接口子类型??? __u8? bInterfaceProtocol;?? // 接口使用的协议??? __u8? iInter
文档评论(0)