您的位置  > 互联网

USB总线结构见成效,你知道几个?

枚举就是从设备中读取一些信息来知道它是什么类型的设备以及如何通信,以便主机根据这些信息加载合适的驱动程序。 在调试USB设备时,非常重要的一点就是USB枚举过程。 只要枚举成功,就基本成功了。

在USB架构中,集线器负责检测设备的连接和断开,并利用其中断IN端点(IN)向主机(Host)报告。 当系统启动时,主机会轮询其根集线器()的状态以查看是否有任何设备(包括子集线器和子集线器上的设备)连接。 USB总线拓扑如下图所示(最上面是主机):

USB总线拓扑

一旦得知有新设备连接,主机就会向该设备挂载的集线器发送一系列请求(),然后集线器就会在主机(Host)和设备()之间建立通信通道。 然后主机通过端点0(0)以控制传输()的形式向设备发送各种请求。 设备收到主机的请求后,回复相应的信息,并执行()操作。 所有 USB 设备必须支持标准 ()、控制传输()和端点 0(0)。

在解释枚举之前,我们先简单说一下USB控制传输的一种传输方式。 这种传输方式在USB中非常重要。 必须保证数据的正确性。 控制传输用于设备的枚举过程。 控制传输分为三个阶段:①建立阶段。 ②数据阶段。 ③确认阶段。

设置阶段:由USB主机发起。 它是一个设置包,包含一些数据请求命令和一些数据。 如果建立阶段是输入请求,那么数据阶段必须输入数据; 如果建立阶段是输出请求,那么数据阶段必须输出数据。 如果在数据阶段,即使不需要传输数据,也必须发送0长度的数据包。 数据阶段之后就是确认阶段。 确认阶段与数据阶段正好相反。 如果是输入请求,则为输出数据包; 如果是输出请求,则为输入数据包。 确认阶段用于确认数据传输的正确性。

1.1 通信传输流程

1.2 设备状态图

1.3 详细状态说明

1)连接()

设备可以连接到 USB 或从 USB 拔出。 规范中没有定义 USB 设备从总线拔出后的状态,仅定义了 USB 连接到总线后所需的操作和属性。

2) 开机()

USB 设备的电源可以来自外部电源或 USB 接口集线器。 从外部电源获取电力的 USB 设备被称为自供电。 尽管自供电 USB 设备可以在连接到 USB 端口之前进行供电,但在连接到 USB 端口之前,它们并不被视为处于通电状态。 此时VBUS已经在设备上生效了。

设备可以具有自供电和总线供电配置。 有些支持其中之一,而其他设备配置只能与独立电源一起使用。 设备支持电源的能力是通过配置描述表( )来体现的。 当前的供电形式反映为设备状态的一部分。 设备可以随时更改其电源,例如从独立电源更改为基于总线的电源。 如果配置支持两种模式,则此状态的最大功率要求是器件在两种模式下从 VBUS 获取功率。 电能的最大值。 无论设备处于何种状态,都必须参考该最大电源。 如果配置仅支持一种电源模式,则更改电源模式将导致设备丢失其当前配置和地址并返回到开机状态。 如果设备是自供电的并且当前配置需要大于 100mA,则当设备转为总线电源时,它必须返回地址状态。 自包含电源集线器使用VBUS向集线器控制器(Hub)提供电源,因此即使自包含电源停止供电,它们仍然可以维持配置状态(state)。

3)默认状态()

设备上电后,不会响应任何总线处理,直到总线收到复位信号。 收到复位信号后,可以使用默认地址对设备进行寻址。

当重置过程完成时,USB设备以正确的速度运行(即低速/全速/高速)。 低速和全速的数据选择由器件的终端电阻决定。 能够高速操作的设备判断其是否在复位处理部分执行高速操作。

能够高速运行的设备在全速电气环境中运行时必须能够成功地全速复位。 设备成功重置后,设备必须成功响应设备和配置描述符请求并返回适当的信息。 当全速运行时,设备可能支持也可能不支持预定义的功能。

4)地址()

所有USB设备在上电复位后都使用默认地址。 连接或重置后,主机会为每个设备分配一个唯一的地址。 当USB设备处于挂起状态时,它保持该地址不变。

USB 设备仅响应默认通道 (Pipe) 请求,无论设备是否已分配地址或正在使用默认地址。

5) 配置状态( )

在 USB 设备正常工作之前,必须正确配置该设备。 从设备的角度来看,配置包括将非零值写入设备的配置寄存器的操作。 配置设备或更改可变设备设置会导致与接口关联的端点的所有状态和配置值设置为其默认值。 这包括将正在使用的终点(日期)设置为 DATA0。

6) 暂停状态

为了节省电量,USB 设备在未检测到总线传输时会自动进入暂停状态。 挂起时,USB 设备保留其内部状态,包括其地址和配置。

当在指定时间段内没有检测到总线活动时,所有设备必须进入暂停状态。 无论设备是否被分配非默认地址或配置,连接的设备都必须准备好在通电时随时终止。 总线活动的暂停可能是由主机本身进入暂停状态引起的。 此外,当连接的集线器端口出现故障时,USB 设备必须进入挂起状态。 这称为选择性 abort()。

当总线活动到达时,USB 设备退出挂起状态。 USB设备还可以使用远程唤醒电流信号来请求主机退出挂起状态或选择性挂起状态。 特定设备的远程唤醒功能是可选的。 也就是说,如果设备具有远程唤醒能力,则该设备必须允许主机控制该能力是否有效。 当设备重置时,必须禁用远程唤醒功能。

2. 枚举步骤

USB 协议定义了设备的 6 种状态。 仅在枚举过程中,设备就会经历4次状态转换:上电状态()、默认状态()、地址状态()和配置状态()(另外两个状态是连接状态和挂起状态())。

2.1 用户将USB设备插入USB端口或在系统启动时给设备上电

这里所说的USB端口是指主机下的根集线器或者主机下游端口上的集线器端口。 Hub为端口供电,连接设备上电。 此时USB设备处于通电状态,所连接的端口无效。

2.2 Hub监控其各端口数据线(D+/D-)上的电压

在集线器侧,数据线D+和D-上有一个下拉电阻Rpd,阻值为14.25k至24.8k,而在设备侧,D+上有一个1.5k的下拉电阻(全速、高速)和D-(低速)。 拉电阻Rpu。 当设备插入集线器端口时,带有上拉电阻的数据线会被上拉至 90% 的电压(大约 3V)。 当集线器检测到自己的其中一根数据线为高电平时,就认为有设备插入,并可以根据D+是否为D+来判断端口(全速、高速设备)插入了什么设备(全速/低速)。或D-被拉高。 我将在以后的文章中描述其区别)。 如下所示。

USB全速/高速设备开机连接

检测到设备后,集线器继续向设备供电,但不急于与设备执行 USB 传输。

USB接口定义如下图所示:

2.3 主机了解所连接的设备

每个集线器都使用自己的中断端点向主机报告其各个端口的状态(对于这个过程,设备看不到也不需要关心)。 上报内容仅为Hub端口的设备连接/断开事件。 如果发生连接/断开事件,主机将向集线器发送 () 以了解此状态更改的确切含义。 此类请求属于集线器类标准请求(hub-class),所有集线器都需要支持。

2.4 Hub检测插入的设备是高速设备还是低速设备

集线器在USB总线空闲时通过检测差分线的高低电压来判断所连接设备的速度类型。 当主机发送请求时,集线器可以用设备的速度类型信息回复主机。 USB 2.0 规范要求在复位操作之前进行速度检测。

2.5 集线器复位装置

一旦主机得知有新设备已连接,它会等待至少 100ms 才能完成插入操作并等待设备电源稳定。 然后主机控制器向集线器发送请求,要求集线器重置其管理的端口(设备刚刚插入的端口)。 集线器将数据线驱动至复位状态(D+和D-均为低电平)至少10ms。 当然,集线器不会向连接其他设备的端口发送这样的复位信号,因此连接到集线器的其他设备自然不会看到该复位信号,不会受到影响。

2.6 Host检测连接的全速设备是否支持高速模式

因为根据USB 2.0协议,高速(High Speed)设备最初运行在全速(Full Speed)状态,所以对于支持USB 2.0的高速集线器,当它发现其端口连接到一个全速设备,它会进行高速测试,看看该设备当前是否支持高速传输。 如果是,则切换到高速信号模式,否则将一直全速工作。

同样,从设备角度来看,如果是高速设备,在第一次连接bub或者上电时只能运行在全速信号模式下(根据USB 2.0协议,高速设备必须向后兼容 USB 1.1 的全速模式)。 然后集线器将进行高速检测,然后设备将切换到高速模式工作。 如果连接的集线器不支持USB 2.0,即不是高速集线器,无法进行高速检测,设备将始终全速工作。

2.7 Hub在设备和主机之间建立信息通道

主机不断向集线器发送请求以检查设备是否已成功重置。 Hub返回的报告信息中有一个特殊的位来标记设备的复位状态。

当集线器停用复位信号时,设备处于默认/空闲状态,准备接收来自主机的请求。 设备和主机之间通过控制传输进行通信,默认地址0,端点号0。此时设备可以从总线吸取的最大电流为100mA。 (所有USB设备在总线复位后地址都为0,这样主机就可以通过地址0与刚刚插入的设备进行通信。)

2.8 主机发送请求获取默认管道的最大数据包长度

默认管道(Pipe)是设备端的端点0。 此时主机发送的请求是默认地址0,端点0。虽然所有没有分配地址的设备都是通过地址0获取主机的请求,但是枚举过程并不是由多个设备并行处理,而是被枚举立刻。 这是使用一台设备完成的,因此多个设备不会同时响应主机的请求。

设备描述符的字节8代表设备端点0的最大数据包大小。虽然设备返回的设备描述符()的长度只有18字节,但系统并不关心。 这时候描述符的长度信息对它来说是最重要的,其他的东西一看就可以通过。 第一次控制传输完成后,即完成控制传输的状态阶段,系统会要求集线器再次重置设备(USB规范中没有这样的要求)。 再次复位的目的是使设备进入某种状态。

2.9 主机给设备分配地址

主机控制器根据请求为设备分配唯一的地址。 完成此传输后,设备进入地址状态,然后启用新地址继续与主机通信。 该地址对于设备而言是终生有效的。 当设备存在时,地址仍然存在; 当设备消失(拔出、重置、系统重启)时,地址将被回收。 当再次枚举同一个设备时,获取到的地址不一定与上次相同。

2.10 主机获取设备信息

主机向新地址发送请求以读取设备描述符。 这次主机真诚地发送请求,它会仔细解析设备描述符的内容。 设备描述符中的信息包括端点0的最大数据包长度、设备支持的配置数()、设备类型、VID(ID,由USB-IF分配)、PID(ID,由制造商定制)和其他信息。 请求(类型)和设备描述符(删除了VID、PID等信息)如下图所示:

标准要求

设备描述符 ( )

之后,主机发送请求,读取配置描述符()、字符串等,一一获知设备更详细的信息。 事实上,有时一个配置描述符的标准请求会大于实际的配置描述符长度(9个字节),比如255。其效果是,当主机发送请求时,设备会返回接口描述符、端点描述符和其他后续描述符发送给主机,主机将根据描述符头中的标志来判断请求的具体类型。 描述符。

接下来,主机将获取配置描述符。 配置描述符总共9个字节。 主机获取到配置描述符后,根据里面配置集的总长度来获取配置集。 配置集合包括配置描述符、接口描述符、端点描述符等。

如果有字符串描述符,则还必须获取字符串描述符。 另外,HID设备还有HID描述符等。

2.11 主机挂载设备的驱动(复合设备除外)

解析完描述符后,主机对设备有了足够的了解,就会为设备选择最合适的驱动程序。 然后告诉world()表示找到了设备,最后调用设备模型提供的接口将该设备添加到USB总线的设备列表中。 然后USB总线会遍历驱动列表中的每个驱动,并调用自己的match()函数。 查看它们是否与您的设备或界面匹配。 如果它们匹配,则调用该函数。 现在控制权已移交给设备驱动程序。

对于复合设备,通常应该为不同的驱动程序配置不同的()。 因此,需要等到设备配置完毕并启用接口后才能挂载驱动程序。

设备-配置-接口-端点关系如下图所示:

USB设备-配置-接口-端点关系

实际情况并不像上述关系那么复杂。 一般来说,一台设备有一种配置和一个接口。 如果设备是多功能设备,则其具有多个接口。 一般有几个端点。 例如,Mass 设备通常有两个端点(控制端点 0 除外)。

2.12 设备驱动程序选择配置

驱动程序(注意,这里是驱动程序,以后驱动程序会接管与设备的通信)根据之前设备回复的信息,发送请求,正式确定设备()的哪个配置被选择为工作配置(对于大多数设备来说,一般只定义一种配置)。 此时设备处于配置状态()。 当然,设备还应该启用其各种接口()。

对于复合设备,此时主机会根据设备接口信息为其挂载驱动程序。

3、控制传输

控制传输是最重要、最复杂的传输类型,它使用8字节的DATA0数据包。 这个8字节的数据包被主机用来在控制阶段发送请求命令,而这些请求命令是主机配置USB设备的关键。

1) (向谁提出要求)

D7:传输方向

0=主机到设备; 1=设备到主机

D6..5:命令类型

D6D5=00:标准请求命令; D6D5=01:等级请求命令;

D6D5=10:用户自定义命令; D6D5=11:保留。

D4..0:接收器类型

0=设备; 1=接口;

2=端点; 3=其他

4..31 保留

该字段表示该请求的特征。 特别地,该字段指示第二相控制传输的方向。 如果该字段设置为0,表示没有数据传输阶段,它将被忽略。

USB 规范定义了所有设备都必须支持的一系列标准请求。 这些请求如下表所示。 此外,一个设备类可以定义更多的请求。 设备供应商还可以定义设备支持请求。

请求可以定向到设备、设备接口或设备端点 ()。 该请求字段还指定接收者。 当指定接口或()时,该字段指示该接口或。

2)(什么要求)

该字段标识特定请求。 域的Type字段可以修改该域的含义。 本文仅定义了Type字段为0的含义,即标准设备请求时域值。

3)域名

该字段用于传输当前请求的参数,根据请求的不同而不同。

4) 域名

当该字段是接口或端点时,该字段用于指示它是哪个接口或端点。

5) 域名

该字段指示第二阶段数据传输的长度。 传输方向由字段的位指示。 字段为 0 表示没有数据传输。 在输入请求时,设备返回的数据不应多于(但可能小于)长度。 在“输出请求”下,指示主机发送的确切数据量。 如果主机发送更多数据,设备的响应是不确定的。

3.1 标准设备要求

3.2 标准请求码(值)

3.3 描述符类型

3.4(读描述符)

该请求返回一个现有的描述符。

区域:

高一字节:标识描述表类型(Types)

低字节:表示描述符的索引。 当多个相同类型的描述符应用于设备时,描述符索引用于选择特定描述符(仅配置和字符串描述符)。

例如:一个设备可以使用多个配置描述符。 对于其他可以通过()请求获取的标准描述符,描述符索引必须为0。描述符索引值的范围是从0到设备使用的该类型的描述符数量减1。

区域:

标识字符串描述表的语言(ID)。 如果是其他语言,则设置为0。

区域:

指示要返回多少字节。 如果描述表长度大于字段值,则仅返回描述表的初始部分。 如果描述表小于字段值,则发送一个短数据包以标记传输结束。 短数据包被定义为长度小于最大有效负载长度或空(NULL)数据包。

该标准请求包括三种类型的描述符:设备(即设备的限定符)、配置(即其他速度配置)和字符串。 能够进行高速操作的设备支持设备限定描述符,该描述符返回有关设备不支持的速度的信息(包括默认端点的数量和其他速度配置)。

其他速度配置以与配置描述符相同的结构返回信息,但如果设备以其他速度运行,则返回配置信息。 请求配置描述符将返回该请求中所有接口的配置描述符、所有接口描述符和端点描述符。

对第一个接口描述符的设备请求将立即返回配置描述符、所有接口描述符以及所有接口的结束节点描述符。 第一个接口描述符后面是配置描述符,后面是第一个接口的结束节点的描述符。 如果还有其他接口和端节点,它们的描述符应位于第一个接口和端节点描述符之后。 与类相关的描述符和/或供应商定义的描述符遵循标准描述符。

所有设备都必须提供设备描述符和至少一个配置描述符。 如果设备不支持所请求的描述符,则返回请求错误。

•默认状态:该请求合法。

•地址状态:该请求是合法的。

•配置状态:该请求合法。

3.5(获取接口)

该请求将选定的备份设备返回到指定的接口。

某些 USB 设备具有互斥的接口设置配置。 该请求允许主机确定当前选择的备用设置。 如果 或 的值与上面指定的不一致,则设备的行为未定义; 如果指定的接口不存在,设备将响应请求错误。

•默认状态:当设备处于默认状态时收到此请求,设备的行为未定义

•地址状态:设备给出请求错误

•配置状态:当设备处于配置状态时,这是一个有效的请求