读书笔记--USB枚举过程

来源:互联网 发布:多因子选股 知乎 编辑:程序博客网 时间:2024/05/29 04:03

USB2.0规范定义了6个设备状态。枚举过程中,设备会先后经历开机(powered)、缺省(Default)、地址(Address)和配置(Configured)状态(另外两个状态是连接(Attached)状态和挂起(Suspend)状态),在每个状态中,设备都定义了其性能和行为。

(1)系统拥有了新设备。用户将设备连接到USB端口,或者系统在连接有设备的情况下开机。端口可能处于主机的根集线器上,或者处于连接主机和下行设备的其他集线器上。集线器提供端口电源,设备将处在开机状态(Powered state)。设备可从总线获取100mA的电流。

(2)集线器检测设备。集线器会监视其上每个端口的信号线(D+和D-)电压。集线器在每条线上都有一个14.25K~24.8KΩ的下拉电阻。设备还有900~1575Ω的上拉电阻,对于全速设备该电阻在D+上,对于低速设备则在D-上。高速设备是以全速来连接的。在连接到某个端口时,设备的上拉电阻会将它的信号线电位抬高,使集线器检测到设备连接。检测到设备时,集线器会继续提供电源,但还不会对设备发出USB传输。

(3)主机获悉新设备。每个集线器都会使用它的中断端点来报告集线器上的事件。报告只表明是集线器还是端口(如果是端口,是哪一个端口)经历了事件。当获悉事件时,主机将发送给集线器一个get port status请求,以了解更多信息。get port status请求和其他集线器类请求都属于集线器所支持的标准请求。有新设备连接时,返回信息便会将此告知主机。

(4)集线器检测设备时低速还是全速。在复位(reset)设备之前,集线器通过检查两个信号线上的电压。确定设备时低速还是全速。集线器会确定闲置(idle)时哪条线有更高的电压,以此检测设备速度。然后,集线器将给主机发送信息,响应下一个get port status请求。USB1.x集线器可能会在总线复位之后检测设备速度。USB2.0则要求在复位之前进行速度检测,以便使集线器在复位期间就知道被检测设备是否有高速能力。

(5)集线器复位设备。当主机获悉一新设备时,主机将向集线器发送一个set port feature请求,此信号要求集线器复位端口。集线器会将设备的USB数据线置于复位情况下(至少10ms)。复位时一种特殊的情况,这是D+和D-都为逻辑低(logic low)(正常情况下,这两条线有相反的逻辑状态)。集线器只对新设备发送复位。总线上的其他集线器和设备都不会看到此复位信号。

(6)主机了解全速设备是否支持高速状态。检测设备是否支持高速状态使用两个特殊信号状态。在Chirp J状态只有D+线被驱动,而在Chirp K状态只有D-线被驱动。

复位期间,支持高速状态的设备会发送Chirp K信号。高速集线器检测到该Chirp K信号后,会响应一串交替的Chirp K与Chirp J。当检测到KJKJKJ的样式时,设备会移除它的全速上拉电阻,然后以高速状态执行接下来的通信。如果集线器没有对设备的Chirp K信号做出响应,设备便知道它必须以全速状态继续以后的通信。所有的高速设备都必须能够响应全速状态下的控制请求。

(7)集线器在设备和总线间建立一条信号路径。主机会通过发送get port status请求证明设备已经摆脱了复位状态。返回数据中的一个数据位将用于表明设备是否仍处于复位状态。若有必要,主机还会重复此请求知道设备离开复位状态。

      当集线器的复位信号被移除时,设备便处于缺省状态(Defualt state)。设备的USB寄存器都处于复位状态,且设备已准备好响应端点0处的控制传输。设备会使用缺省地址00h来与主机通信。

(8)主机发送 get descriptor请求以了解缺省管道的最大信息包尺寸(maximum packet size)。主机向设备地址00h,端点0发送此请求。由于主机每次只枚举一个设备,故也只有一个设备会响应发往设备地址00h的通信,即使此时有多个设备连接。

设备描述字的第8个字节含有端点0所支持的最大信息包尺寸。windows主机会请求64字节,但在收到信息包(无论它是否有64字节)后,主机便会开启传输的状态阶段。状态阶段完成时,windows主机会请求集线器复位设备,就如同第5步中介绍的一样。USB2.0规范并没有要求这里的复杂动作。复位是一个谨慎的操作,在复位结束时可保证设备处于一个已知状态。

(9)主机指定一个地址。复位完成时,主机控制器将通过发送set Address请求,为设备指定唯一的地址。设备将以缺省地址完成请求的状态阶段,之后才开始执行新地址。设备现在处于地址状态(Address state)。从这个端口所发出的所有通信都会指向新地址。地址会一直有效。知道设备断开连接、集线器复位端口或系统重启。下一次枚举时,主机可能会分给设备一个不同的地址。

(10)主机了解设备能力。主机向新地址发送get descriptor请求,读取设备描述字(device descriptor)。这一次主机会取回整个描述字。描述字含有端点0的最大信息包尺寸、设备支持的配置数量,以及其他的设备基本信息。

主机会通过请求一个或多个指定设备在设备描述字内的配置描述字,继续了解设备。对配置描述字的请求,实际上就是对配置描述字和其后跟着它多达请求字节数的全部附属描述字的请求。Windows主机一开始只请求配置描述字的9字节。这些字节中,包括了配置描述字的总长度以及它的附属描述字。

然后,Windows主机会再次请求配置描述字,而且使用所有取得的总长度来请求字节数。设备会通过发送配置描述字来做出响应,其后会跟有全部配置的附属描述字(包括借口描述字)。而接口描述字后都跟着接口的所有端点描述字。有些配置也会有类或厂商专属描述字。

(11)主机指定并加载设备驱动程序(符合设备除外)。在根据描述字了解完设备信息后,主机会寻找最匹配的驱动程序,来管理与设备的通信。Windows主机使用INF文件确认最优匹配。INF文件可能是USB类的系统文件,后者厂商提供的含有厂商ID和厂商产品ID的文件。

对于之前已被枚举过的设备,Windows操作系统会使用已存储信息,而不再寻找INF文件。在操作系统指定并加载完驱动信息后,驱动程序可能会向设备请求重新发送描述字和其他类专属描述字。

复合设备对这一顺序来说是个例外,它可在配置中含有指定到多个接口的不同驱动程序。主机只能在接口被使能后才可指定这些驱动程序,因此主机必须首先按下面所述的过程进行设备配置。

(12)主机设备驱动程序会选择配置。从描述字哪里了解完设备信息后,设备驱动程序会通过发送带有所需配置号的set configuration 请求,来请求这一配置。许多设备只支持一种配置。若设备支持多个配置,驱动程序便可根据驱动程序所含有的设备信息。决定请求哪一配置;或者驱动程序也可询问用户或直接选择其中的第一个配置(许多驱动程序只会选择一个配置)。接到请求时,设备会实现那个请求的配置。至此设备就进入(已)配置状态,设备的接口也就被使能了。

对于复合设备,主机现在就可以指定驱动程序了。而其他设备,主机使用从设备驱动的信息来为每一个在配置中被激活了的接口找到去驱动程序。之后,设备即为可用。

集线器也属于USB设备,且主机会以与其他设备相同的方式枚举新连接的集线器。如果集线器上还连续接有设备,主机会在集线器通知主机它的存在后,对这些设备进行枚举。

连接状态。如果集线器不给设备的Vbus线提供电源,设备便处于连接状态(Attached state)。若集线器检测到“过载电流”(over-current)情况,或者主机请求集线器从此端口移除电源,不供给电源的情况会发生。Vbus上没有电源,主机和设备就不能通行,因此从它们的角度看,这与设备没有连接的情况是一样的。

挂起状态。设备会在检测到至少3ms没有总线动作的情况下进入挂起状态(suspend state),这里的总线动作也包括帧开端标记(SOF marker)。在挂起状态,设备应限制它对总线功耗的使用。配置与没有配置过的设备都必须支持这种状态。


原创粉丝点击