USB 枚举
USB设备枚举一般会经过插入、供电、初始化、分配地址,配置,获取设备描述符、获取配置描述符、获取字符串描述符和配置设备这么几个过程。
USB设备的枚举过程如下:
- USB设备插入USB接口后,主机检测D+/D-线上的电压,确认有设备连接,USB集线器通过中断IN通道,向主机报告有USB设备连接。
- 主机接到通知后,通过集线器设备类请求GetPortStatus获取更多的信息。然后主机等待100ms等待设备稳定,然后发送集线器设备类请求SetPortStatus,对USB设备进行复位,复位后USB设备的地址为0,这样主机就可以使用地址0与USB设备进行通信,复位后的设备可以从USB总线上获取小于100mA的电流,用于使用默认地址对管道0控制事务响应。
- 主机向地址为0(即刚插入的USB设备)的设备端点0(默认端点)发送获取设备描述符的标准请求GetDescriptor。
- USB设备收到请求后,将其预设的设备描述符返回给主机。
- 主机收到设备描述符后,返回一个0长度的数据确认包。
- 主机对设备再次复位,复位后主机对地址为0的设备端点0发送一个设置地址SetAddress请求(新的设备地址在数据包中)。
- 主机发送请求状态返回,设备返回0长度的状态数据包。
- 主机收到状态数据包后,发送应答包ACK给设备,设备收到ACK后,启用新的设备地址。
- 主机再次使新的地址获取设备描述符GetDescriptor,设备返回地址描述符。
- 主机获取第一次配置描述符有前18个字节,设备返回配置描述符的前18个字节,其数据包中含有配置描述符的总长度。
- 主机根据配置描述符的总长度再次获取配置描述符,设备返回全总的配置描述符。
- 如果还有字符串描述符,系统还会获取字符串描述符。像HID设备还有报告描述符,它也需要单独获取。
USB设备的断开
USB设备从USB总线断开时,包括以下几个步骤:
- USB设备从集线器下行端口断开时,集线器禁止该端口,并通过中断IN通道向USB主机报告其端口变化。
- 主机收到端口变化后发送GetPortStatus获取详细信息,并做处理断开操作。
- 系统调用USB驱动程序的断开回调函数,释放该设备占用的所有系统资源。
如果断开的是一个USB集线器,USB主机会对该集线器和其所连接的所有设备进行断开操作。