书城网站开发,新密做网站,万网网站流量,郑州做网站七彩科技在终端用户看来#xff0c;USB设备为主机提供了多种多样的附加功能#xff0c;如文件传输#xff0c;声音播放等#xff0c;但对USB主机来说#xff0c;它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成#xff1a;USB总线接口、USB逻辑设备和功能单元USB设备为主机提供了多种多样的附加功能如文件传输声音播放等但对USB主机来说它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成USB总线接口、USB逻辑设备和功能单元 a -- 这里的USB总线接口指的是USB设备中的串行接口引擎SIE b -- USB逻辑设备被USB系统软件看作是一个端点的集合 c -- 功能单元被客户软件看作是一个接口的集合。SIE、端点和接口都是USB设备的组成单元 为了更好地描述USB设备的特征USB提出了设备架构的概念。从这个角度来看可以认为USB设备是由一些配置、接口和端点组成即一个USB设备可以含有一个或多个配置在每个配置中可含有一个或多个接口在每个接口中可含有若干个端点。其中配置和接口是对USB设备功能的抽象实际的数据传输由端点来完成。在使用USB设备前必须指明其采用的配置和接口。这个步骤一般是在设备接入主机时设备进行枚举时完成的 这些单元之间的关系如下 设备通常有一个或多个配置 配置通常有一个或多个接口 接口通常有一个或多个设置 接口有零或多个端点。 这样的概念太抽象了可以这样看有一个设备如支持视频和音频的一个播放器。那么对于上面提到的4个描述符对它们设置的时候它们分别对于哪一个描述符呢 从我现在的理解来看这样一个设备对应一个设备描述符支持视频的功能对应一个接口描述符支持音频功能的对应一个接口描述符。为了支持视频在下层有多个端口同时工作为提供视频数据传输的支持所以有多个端点描述符。 USB设备使用各种描述符来说明其设备架构包括设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符他们通常被保存在USB设备的固件程序中。 1、设备描述符 设备代表一个USB设备它由一个或多个配置组成。设备描述符用于说明设备的总体信息并指明其所含的配置的个数。一个USB设备只能有一个设备描述符。 [cpp] view plaincopy struct usb_device_descriptor { _ _u8 bLength; //描述符长度 _ _u8 bDescriptorType; //描述符类型编号 _ _le16 bcdUSB; //USB版本号 _ _u8 bDeviceClass; //USB分配的设备类code _ _u8 bDeviceSubClass;// USB分配的子类code _ _u8 bDeviceProtocol; //USB分配的协议code _ _u8 bMaxPacketSize0; //endpoint0最大包大小 _ _le16 idVendor; //厂商编号 _ _le16 idProduct; //产品编号 _ _le16 bcdDevice; //设备出厂编号 _ _u8 iManufacturer; //描述厂商字符串的索引 _ _u8 iProduct; //描述产品字符串的索引 _ _u8 iSerialNumber; //描述设备序列号字符串的索引 _ _u8 bNumConfigurations; //可能的配置数量 } _ _attribute_ _ ((packed)); 2、配置描述符 一个USB设备可以包含一个或多个配置如USB设备的低功耗模式和高功耗模式可分别对应一个配置。在使用USB设备前必须为其选择一个合适的配置。配置描述符用于说明USB设备中各个配置的特性如配置所含接口的个数等。USB设备的每一个配置都必须有一个配置描述符。 [cpp] view plaincopy struct usb_config_descriptor { _ _u8 bLength; //描述符长度 _ _u8 bDescriptorType; //描述符类型编号 _ _le16 wTotalLength; //配置所返回的所有数据的大小 _ _u8 bNumInterfaces; // 配置所支持的接口数 _ _u8 bConfigurationValue; //Set_Configuration命令需要的参数值 _ _u8 iConfiguration; //描述该配置的字符串的索引值 _ _u8 bmAttributes; //供电模式的选择 _ _u8 bMaxPower; //设备从总线提取的最大电流 } _ _attribute_ _ ((packed)); 3、接口描述符 一个配置可以包含一个或多个接口例如对一个光驱来说当用于文件传输时使用其大容量存储接口而当用于播放CD时使用其音频接口。接口是端点的集合可以包含一个或多个可替换设置用户能够在USB处于配置状态时改变当前接口所含的个数和特性。接口描述符用于说明设备中各个接口的特性如接口所属的设备类及其子类等。USB设备的每个接口都必须有一个接口描述符 [cpp] view plaincopy struct usb_interface_descriptor { _ _u8 bLength; //描述符长度 _ _u8 bDescriptorType; //描述符类型 _ _u8 bInterfaceNumber; // 接口的编号 _ _u8 bAlternateSetting; //备用的接口描述符编号 _ _u8 bNumEndpoints; //该接口使用的端点数不包括端点0 _ _u8 bInterfaceClass; //接口类型 _ _u8 bInterfaceSubClass; //接口子类型 _ _u8 bInterfaceProtocol; //接口所遵循的协议 _ _u8 iInterface; //描述该接口的字符串索引值 } _ _attribute_ _ ((packed)); 4、端点描述符 端点是USB设备中的实际物理单元USB数据传输就是在主机和USB设备各个端点之间进行的。端点一般由USB接口芯片提供例如Freescale公司的MC68HC908JB8和MC9S12UF32。USB设备中的每一个端点都有唯一的端点号每个端点所支持的数据传输方向一般而言也是确定的或是输入IN或是输出OUT。也有些芯片提供的端点的数据方向是可以配置的例如MC68HC908JB8包含有两个用于数据收发的端点端点1和端点2。其中端点1只能用于数据发送即支持输入IN操作端点2既能用于数据发送也可用于数据接收即支持输入IN和输出OUT操作。而MC9S12UF32具有6个端点。 利用设备地址、端点号和传输方向就可以指定一个端点并与它进行通信。端点的传输特性还决定了其与主机通信是所采用的传输类型例如控制端点只能使用控制传输。根据端点的不同用途可将端点分为两类0号端点和非0号端点。 0号端点比较特殊它有数据输入IN和数据输出OUT两个物理单元且只能支持控制传输。所有的USB设备都必须含有一个0号端点用作默认控制管道。USB系统软件就是使用该管道与USB逻辑设备进行配置通信的。0号端点在USB设备上的以后就可以使用而非0号端点必须要在配置以后才可以使用。 根据具体应用的需要USB设备还可以含有多个除0号端点以外的其他端点。对于低速设备其附加的端点数最多为2个对于全速/高速设备其附加的端点数最多为15个。 [cpp] view plaincopy struct usb_endpoint_descriptor { _ _u8 bLength; //描述符长度 _ _u8 bDescriptorType; //描述符类型 _ _u8 bEndpointAddress; //端点地址03位是端点号第7位是方向(0-OUT,1-IN) _ _u8 bmAttributes; //端点属性bit[0:1] 的值为00表示控制为01表示同步为02表示批量为03表示中断 _ _le16 wMaxPacketSize; 本端点接收或发送的最大信息包的大小 _ _u8 bInterval;//轮询数据传送端点的时间间隔 //对于批量传送的端点以及控制传送的端点此域忽略 //对于同步传送的端点此域必须为1 _ _u8 bRefresh; _ _u8 bSynchAddress; } _ _attribute_ _ ((packed)); 5、字符串描述符 在USB设备中通常还含有字符串描述符以说明一些专用信息如制造商的名称、设备的序列号等。它的内容以UNICODE的形式给出且可以被客户软件所读取。对USB设备来说字符串描述符是可选的。 [cpp] view plaincopy struct usb_string_descriptor { _ _u8 bLength; //描述符长度 _ _u8 bDescriptorType; //描述符类型 _ _le16 wData[1]; } _ _attribute_ _ ((packed)); 6、管道 在USB系统结构中可以认为数据传输时在USB主机软件与USB设备的各个端点之间直接进行的它们之间的连接称为管道。管道是在USB设备的配置过程中建立的。管道是对USB主机与USB设备间通信流的抽象表示USB主机的数据缓冲区与USB设备的端点之间存在着逻辑数据传输而实际的数据传输是由USB总线接口层来完成的。 管道与USB设备中的端点一一对应。一个USB设备含有多少个端点其与USB主机进行通信时就可以使用多少条管道且端点的类型决定了管道中数据的传输类型例如中断端点对应中断管道且该管道只能进行中断传输。不论存在着多少条管道在各个管道中进行的数据传输都是相互独立的。 7、USB端点分类 USB 通讯的最基本形式是通过端点。一个USB端点只能向一个方向传输数据从主机到设备(称为输出端点)或者从设备到主机(称为输入端点)。端点可被看作一个单向的管道。 USB 端点有 4 种不同类型, 分别具有不同的数据传送方式 1) 控制CONTROL 控制端点被用来控制对USB设备的不同部分访问. 通常用作配置设备、获取设备信息、发送命令到设备或获取设备状态报告。这些端点通常较小。每个 USB 设备都有一个控制端点称为端点 0, 被 USB 核心用来在插入时配置设备。USB协议保证总有足够的带宽留给控制端点传送数据到设备. 2) 中断INTERRUPT 每当 USB 主机向设备请求数据时中断端点以固定的速率传送小量的数据。此为USB 键盘和鼠标的主要的数据传送方法。它还用以传送数据到USB设备来控制设备。通常不用来传送大量数据。USB协议保证总有足够的带宽留给中断端点传送数据到设备. 3) 批量BULK 批量端点用以传送大量数据。这些端点通常比中断端点大得多. 它们普遍用于不能有任何数据丢失的情况。USB 协议不保证传输在特定时间范围内完成。如果总线上没有足够的空间来发送整个BULK包它被分为多个包进行传输。这些端点普遍用于打印机、USB Mass Storage和USB网络设备上。 4) 等时ISOCHRONOUS 等时端点也批量传送大量数据, 但是这个数据不被保证能送达。这些端点用在可以处理数据丢失的设备中并且更多依赖于保持持续的数据流。如音频和视频设备等等。 控制和批量端点用于异步数据传送而中断和等时端点是周期性的。这意味着这些端点被设置来在固定的时间连续传送数据USB 核心为它们保留了相应的带宽。 [cpp] view plaincopy struct usb_host_endpoint{ struct usb_endpoint_descriptor desc;//端点描述符 struct list_head urb_list;//此端点的URB对列由USB核心维护 void *hcpriv; struct ep_device *ep_dev; /* For sysfs info */ unsigned char*extra;/* Extra descriptors */ int extralen; int enabled; }; 当调用USB设备驱动调用usb_submit_urb提交urb请求时将调用int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)把此urb增加到urb_list的尾巴上。(hcd: Host Controller Driver,对应数据结构struct usb_hcd )