USB host 工作流程.doc_第1页
USB host 工作流程.doc_第2页
USB host 工作流程.doc_第3页
USB host 工作流程.doc_第4页
USB host 工作流程.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

.USB枚举步骤USB协议定义了设备的6种状态,仅在枚举过程种,设备就经历了4个状态的迁移:上电状态(Powered),默认状态(Default),地址状态(Address)和配置状态(Configured)(其他两种是连接状态(Attached)和挂起状态(Suspend)。Attached和Powered状态不难理解:当一个设备被正确插入到主机的USB接口时,就处于Attached(连接)的状态。设备连接好了,USB主机识别了设备,同时没有对设备进行请求,USB设备就处于Suspended(挂起)状态。下面步骤是Windows系统下典型的枚举过程,但是固件不能依此就认为所有的枚举操作都是按照这样一个流程行进。设备必须在任何时候都能正确处理所有的主机请求。1. 用户把USB设备插入USB端口或给系统启动时设备上电这里指的USB端口指的是主机下的根hub或主机下行端口上的hub端口。Hub给端口供电,连接着的设备处于上电状态。2. Hub监测它各个端口数据线上(D+/D-)的电压在hub端,数据线D+和D-都有一个阻值在14.25k到24.8k的下拉电阻Rpd,而在设备端,D+(全速,高速)和D-(低速)上有一个1.5k的上拉电阻Rpu。当设备插入到hub端口时,有上拉电阻的一根数据线被拉高到幅值的90%的电压(大致是3V)。hub检测到它的一根数据线是高电平,就认为是有设备插入,并能根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口(全速、高速设备的区分在后面的章节中描述)。检测到设备后,hub继续给设备供电,但并不急于与设备进行USB传输。3. Host了解连接的设备每个hub利用它自己的中断端点向主机报告它的各个端口的状态(对于这个过程,设备是看不到的,也不必关心),报告的内容只是hub端口的设备连接断开的事件。如果有连接断开事件发生,那么host会发送一个 Get_Port_Status请求(request)以了解更多hub上的信息。Get_Port_Status等请求属于所有hub都要求支持的hub类标准请求(standard hub-class requests)。4. Hub检测所插入的设备是高速还是低速设备hub通过检测USB总线空闲(Idle)时差分线的高低电压来判断所连接设备的速度类型,当host发来Get_Port_Status请求时,hub就可以将此设备的速度类型信息回复给host。(USB 2.0规范要求速度检测要先于复位(Reset)操作)。5. hub复位设备当主机获悉一个新的设备后,主机控制器就向hub发出一个 Set_Port_Feature请求让hub复位其管理的端口。hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms。当然,hub不会把这样的复位信号发送给其他已有设备连接的端口,所以其他连在该hub上的设备自然看不到复位信号,不受影响。6. Host检测所连接的全速设备是否是支持高速模式因为根据USB 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed )状态运行,所以对于一个支持USB 2.0的高速hub,当它发现它的端口连接的是一个全速设备时,会进行高速检测,看看目前这个设备是否还支持高速传输,如果是,那就切到高速信号模式,否则就一直在全速状态下工作。同样的,从设备的角度来看,如果是一个高速设备,在刚连接bub或上电时只能用全速信号模式运行(根据USB 2.0协议,高速设备必须向下兼容USB 1.1的全速模式)。随后hub会进行高速检测,之后这个设备才会切换到高速模式下工作。假如所连接的hub不支持USB 2.0,即不是高速hub,不能进行高速检测,设备将一直以全速工作。7. Hub建立设备和主机之间的信息通道主机不停得向hub发送 Get_Port_Status请求,以查询设备是否复位成功。Hub返回的报告信息中有专门的一位用来标志设备的复位状态。当hub撤销了复位信号,设备就处于默认空闲状态(Default state),准备着主机发来的请求。设备和主机之间的通信通过控制传输,默认地址0,端点号0进行。在此时,设备能从总线上得到的最大电流是100mA。8.主机发送Get Descriptor请求获取默认管道的最大包长度默认管道(Default Pipe)在设备一端来看就是端点0。主机此时发送的请求是默认地址0,端点0,虽然所有位分配地址的设备都是通过地址0来获取主机发来的信息,但由于枚举过程不是多个设备并行处理,而是一次枚举一个设备的方式进行,所以不会发生多个设备同时响应主机发来的请求。设备描述符的第8字节代表设备端点0的最大包大小。对于Windows系统来说,Get Descriptor请求中的wLength一项都会设为64,虽然说设备所返回的设备描述符(Device Descriptor)长度只有18字节,但系统也不在乎,此时,描述符的长度信息对它来说是最重要的,其他的瞄一眼就过了。Windows系统还有个怪癖,当完成第一次的控制传输后,也就是完成控制传输的状态阶段,系统会要求hub对设备进行再一次的复位操作(USB规范里面可没这要求)。再次复位的目的是使设备进入一个确定的状态。9.主机给设备分配一个地址(Address)主机控制器通过Set_Address请求向设备分配一个唯一的地址。在完成这次传输之后,设备进入地址状态(Address state),之后就启用新地址继续与主机通信。这个地址对于设备来说是终生制的,设备在,地址在;设备消失(被拔出,复位,系统重启),地址被收回。同一个设备当再次被枚举后得到的地址不一定是上次那个了。10.主机获取设备的信息主机发送 Get_Descriptor请求到新地址读取设备描述符,这次主机发送Get_Descriptor请求可算是诚心,它会认真解析设备描述符的内容。设备描述符内信息包括端点0的最大包长度,设备所支持的配置(Configuration)个数,设备类型,VID(Vendor ID,由USB-IF分配), PID(Product ID,由厂商自己定制)等信息。Get_Descriptor请求(Device type)和设备描述符(已抹去VID,PID等信息)。之后主机发送Get_Descriptor请求,读取配置描述符(Configuration Descriptor),字符串等,逐一了解设备更详细的信息。事实上,对于配置描述符的标准请求中,有时wLength一项会大于实际配置描述符的长度(9字节),比如255。这样的效果便是:主机发送了一个Get_Descriptor_Configuration 的请求,设备会把接口描述符,端点描述符等后续描述符一并回给主机,主机则根据描述符头部的标志判断送上来的具体是何种描述符。11.主机给设备挂载驱动(复合设备除外)主机通过解析描述符后对设备有了足够的了解,会选择一个最合适的驱动给设备。在驱动的选择过程中,Windows系统会和系统inf文件里的厂商ID,产品ID,有时甚至用到设备返回来的产品版本号进行匹配。如果没有匹配的选项,Windows会根据设备返回来的类,子类,协议值信息选择。如果该设备以前在系统上成功枚举过,操作系统会根据以前记录的登记信息而非inf文件挂载驱动。当操作系统给设备指定了驱动之后,就由驱动来负责对设备的访问。对于复合设备,通常应该是不同的接口(Interface)配置给不同的驱动,因此,需要等到当设备被配置并把接口使能后才可以把驱动挂载上去。实际情况没有上述关系复杂。一般来说,一个设备就一个配置,一个接口,如果设备是多功能符合设备,则有多个接口。端点一般都有好几个,比如Mass Storage设备一般就有两个端点(控制端点0除外)。12. 设备驱动选择一个配置驱动(注意,这里是驱动,之后的事情都是有驱动来接管负责与设备的通信)根据前面设备回复的信息,发送Set_Configuration请求来正式确定选择设备的哪个配置(Configuration)作为工作配置(对于大多数设备来说,一般只有一个配置被定义)。至此,设备处于配置状态,当然,设备也应该使能它的各个接口(Interface)。对于复合设备,主机会在这个时候根据设备接口信息,给它们挂载驱动。13. 设备可使用HID人机接口级方案CDC通信设备级方案MSC海量存储级方案USB的描述符及各种描述符之间的依赖关系USB是个通用的总线,端口都是统一的。但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了。USB的描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符等等。关于报告描述符,请看:USB HID报告及报告描述符简介 http:/group.*.com/93/198.aspx。一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。每种描述符都有自己独立的编号,如下:#define DEVICE_DESCRIPTOR 0x01 /设备描述符#define CONFIGURATION_DESCRIPTOR 0x02 /配置描述符#define STRING_DESCRIPTOR 0x03 /字符串描述符#define INTERFACE_DESCRIPTOR 0x04 /接口描述符#define ENDPOINT_DESCRIPTOR 0x05 /端点描述符下面分别详细介绍一下各描述符。1.设备描述符/定义标准的设备描述符结构typedef struct _DEVICE_DCESCRIPTOR_STRUCTBYTE blength; /设备描述符的字节数大小BYTE bDescriptorType; /设备描述符类型编号WORD bcdUSB; /USB版本号BYTE bDeviceClass; /USB分配的设备类代码BYTE bDeviceSubClass; /USB分配的子类代码BYTE bDeviceProtocol; /USB分配的设备协议代码BYTE bMaxPacketSize0; /端点0的最大包大小WORD idVendor; /厂商编号WORD idProduct; /产品编号WORD bcdDevice; /设备出厂编号BYTE iManufacturer; /设备厂商字符串的索引BYTE iProduct; /描述产品字符串的索引BYTE iSerialNumber; /描述设备序列号字符串的索引BYTE bNumConfigurations; /可能的配置数量DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT; /实际的设备描述符示例code DEVICE_DESCRIPTOR_STRUCT device_descriptor= /设备描述符sizeof(DEVICE_DESCRIPTOR_STRUCT), /设备描述符的字节数大小,这里是18字节DEVICE_DESCRIPTOR, /设备描述符类型编号,设备描述符是010x1001, /USB版本号,这里是USB01.10,即USB1.1。由于51是大端模式,所以高低字节交换0x00, /USB分配的设备类代码,0表示类型在接口描述符中定义0x00, /USB分配的子类代码,上面一项为0时,本项也要设置为00x00, /USB分配的设备协议代码,上面一项为0时,本项也要设置为00x10, /端点0的最大包大小,这里为16字节0x7104, /厂商编号,这个是需要跟USB组织申请的ID号,表示厂商代号。0xf0ff, /该产品的编号,跟厂商编号一起配合使用,让主机注册该设备并加载相应的驱动程序0x0100, /设备出厂编号0x01, /设备厂商字符串的索引,在获取字符串描述符时,使用该索引号来识别不同的字符串0x02, /描述产品字符串的索引,同上0x03, /描述设备序列号字符串的索引,同上0x01 /可能的配置数为1,即该设备只有一个配置;2.配置描述符/定义标准的配置描述符结构typedef struct _CONFIGURATION_DESCRIPTOR_STRUCTBYTE bLength; /配置描述符的字节数大小BYTE bDescriptorType; /配置描述符类型编号WORD wTotalLength; /此配置返回的所有数据大小BYTE bNumInterfaces; /此配置所支持的接口数量BYTE bConfigurationValue; /Set_Configuration命令所需要的参数值BYTE iConfiguration; /描述该配置的字符串的索引值BYTE bmAttributes; /供电模式的选择BYTE MaxPower; /设备从总线提取的最大电流CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;3.接口描述符/定义标准的接口描述符结构typedef struct _INTERFACE_DESCRIPTOR_STRUCTBYTE bLength; /接口描述符的字节数大小BYTE bDescriptorType; /接口描述符的类型编号BYTE bInterfaceNumber; /该接口的编号BYTE bAlternateSetting; /备用的接口描述符编号BYTE bNumEndpoints; /该接口使用的端点数,不包括端点0BYTE bInterfaceClass; /接口类型BYTE bInterfaceSubClass; /接口子类型BYTE bInterfaceProtocol; /接口遵循的协议BYTE iInterface; /描述该接口的字符串索引值INTERFACE_DESCRIPTOR_STRUCT, * pINTERFACE_DESCRIPTOR_STRUCT;4.端点描述符/定义标准的端点描述符结构typedef struct _ENDPOINT_DESCRIPTOR_STRUCTBYTE bLegth; /端点描述符字节数大小BYTE bDescriptorType; /端点描述符类型编号BYTE bEndpointAddress; /端点地址及输入输出属性BYTE bmAttributes; /端点的传输类型属性WORD wMaxPacketSize; /端点收、发的最大包大小BYTE bInterval; /主机查询端点的时间间隔ENDPOINT_DESCRIPTOR_STRUCT, * pENDPOINT_DESCRIPTOR_STRUCT;下面是一个配置描述符集合的定义typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCTCONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;INTERFACE_DESCRIPTOR_STRUCT interface_descritor;ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptorENDPOINT_NUMBER;CON_INT_ENDP_DESCRIPTOR_STRUCT;配置描述符集合的示例code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor= /配置描述符集合/configuration_descriptor /配置描述符sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), /配置描述符的字节数大小,这里为9CONFIGURATION_DESCRIPTOR, /配置描述符类型编号,配置描述符为2(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)*256+(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)/256, /配置描述符集合的总大小0x01, /只包含一个接口0x01, /该配置的编号0x00, /iConfiguration字段0x80, /采用总线供电,不支持远程唤醒0xC8 /从总线获取最大电流400mA,/interface_descritor /接口描述符sizeof(INTERFACE_DESCRIPTOR_STRUCT), /接口描述符的字节数大小,这里为9INTERFACE_DESCRIPTOR, /接口描述符类型编号,接口描述符为30x00, /接口编号为40x00, /该接口描述符的编号为0

温馨提示

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

评论

0/150

提交评论