Linux USB驱动框架
USB控制器
每个芯片内部都带有USB控制器,每个USB控制器可以支持128个地址,其中0是默认地址,只有在设备枚举的时候才会使用,地址0不会分配给任何一个设备。所以1个USB主控制器最多可以分配127个地址。
HS FS LS
HS:高速模式 FS:全速模式 LS:低速模式
USB接口
接口1:5V 接口2:D- 差分信号 接口3:D+ 差分信号 接口4:GND
接口1:5V 接口2:D- 差分信号 接口3:D+ 差分信号 接口4:ID 用于实现OTG功能,通过ID线来判断当前连接的主设备(host)还是从设备(slave) 接口5:GND
USB OTG
USB OTG既可以做Host又可以做Device。 ID线的高低电平表示USB口工作在Host还是Device模式。
USB协议
Device Descriptor 设备描述符 Configuration Descriptor 配置描述符 String Descriptor 字符串描述符 Interface Descriptor 接口字符串 Endpoint Descriptor 端点描述符
USB枚举
当 USB 设备与 USB 主机连接以后主机就会对 USB 设备进行枚举,通过枚举来获取设备的 描述符信息,主机得到这些信息以后就知道该加载什么样的驱动、如何进行通信等。USB 枚举过程如下: ①、第一回合,当 USB 主机检测到 USB 设备插入以后机会发出总线复位信号来复位设备。 USB 设备复位完成以后地址为 0,主机向地址 0 的端点 0 发送数据,请求设备的描述符。设备得到请求以后就会按照主机的要求将设备描述符发送给主机,主机得到设备发送过来的设备描述符以后,如果确认无误就会向设备返回一个确认数据包(ACK)。 ②、第二回合,主机再次复位设备,进入地址设置阶段。主机向地址 0 的端点 0 发送设置 地址请求数据包,新的设备地址就包含在这个数据包中,因此没有数据过程。设备进入状态过 程,等待主机请求状态返回,收到以后设备就会向主机发送一个 0 字节状态数据包,表明设备 已经设置好地址了,主机收到这个 0 字节状态数据包以后会返回一个确认包(ACK)。设备收到 主机发送的 ACK 包以后就会使用这个新的设备地址,至此设备就得到了一个唯一的地址。 ③、第三回合,主机向新的设备地址端点 0 发送请求设备描述符数据包,这一次主机要获 取整个设备描述符,一共是 18 个字节。 ④、和第③步类似,接下来依次获取配置描述符、配置集合、字符串描述符等等。
|