Linux-USB驱动笔记(三)
1、前言
前两篇笔记地址如下:
2、USB接口类型
从上面图片来看,usb 的接口类型众多,比如PC上主要用 USB A-Type 和 USB B-Type,手机上常见的有 USB C-Type 和 Micro-USB B 。这些接口在很多设备上都能见到,出现各种各样的USB接口,主要还是跟设备有关。
3、USB枚举
USB的设备有很多,当我们在PC上插上USB设备,PC是如何知道是什么设备,该使用哪个驱动程序呢?枚举的过程就是用来获取这些信息,以确定怎么通信,加载合适的驱动。
3.1、检测电压变化,报告Host
首先,USB设备插上后,Hub检测到有电压变化。集线器用中断传输方式上报集线器上的事件。
3.2、Host发送Get_Status请求
给Hub发送一个Get_Status请求来了解更多的信息。这个过程Hub会根据USB总线空闲时差分线的高低电压来判断所连接设备的速度类型,并把速度类型信息返回给Host。
3.3、Host发送Set_Feature请求复位端口
Host就向hub发出一个 Set_Feature请求让hub复位其管理的端口(刚才设备插上的端口)。该复位信号不会发送给其他端口的。
3.4、Hub建立设备和主机之间的信息通道
Host不停地向hub发送Get_Status请求,以查询设备是否复位成功。Hub返回的报告信息中有专门的一位用来标志设备的复位状态。
复位成功之后,设备和主机之间的通信通过控制传输,默认地址0,端点号0进行。
3.5、 Host获取默认管道的最大包长度
Host向端点0发送 Get_Descriptor请求获取设备描述符,然后读取设备描述符的bMaxPacketSize0字段。这样就获取到最大包长度。
3.6、Host给设备分配一个地址
主机控制器通过Set_Address请求向设备分配一个唯一的地址。在完成这次传输之后,设备进入地址状态,之后就启用新地址继续与主机通信。
3.7、Host获取设备的信息
主机向新地址重新发送Get_Descriptor请求,此次读取其设备描述符的全部字段,以了解该设备的总体信息,如VID,PID。
之后主机发送Get_Descriptor请求,读取配置描述符(Configuration Descriptor),字符串等,逐一了解设备更详细的信息。
3.8、Host给设备挂载驱动
主机通过解析描述符后对设备有了足够的了解,会选择一个最合适的驱动给设备。
3.9、设备驱动选择一个配置
驱动根据前面设备回复的信息,发送Set_Configuration请求来正式确定选择设备的哪个配置作为工作配置(之前说过,配置就是一个功能)。至此,设备处于配置状态,当然,设备也应该使能它的各个接口。
4、USB OTG
USB 分为 HOST(主机)和从机(或 DEVICE),有些设备可能有时候需要做HOST,有时候又需要做 DEVICE,配两个 USB 口当然可以实现,但是太浪费资源了。如果一个 USB 接口既可以做 HOST 又可以做 DEVICE 那就太好了,使用起来就方便很多。为此,USBOTG 应运而生,OTG 是 On-The-Go 的缩写,支持 USB OTG 功能的 USB 接口既可以做 HOST,也可以做 DEVICE。
OTG标准在完全兼容USB2.0标准的基础上,新增主机协商协议(HNP)和对话请求协议(SRP).
4.1、OTG硬件结构
一个完整的OTG连接由A-device和B-device组成。A设备(Micro-A)默认作为Host并供电,B设备(Micro-B)默认作为peripheral。
OTG比普通USB接口多了一条USB_OTG_ID连线。Micro-A插座的USB_OTG_ID接地,而Micro-B插座的USB_OTG_ID悬空。如图所示:
4.2、OTG支持协议
OTG支持HNP协议,SRP协议。
- HNP协议
HNP(即主机协商协议),实现在不调换Micro-A和Micro-B插座的情况下,Host和Peripheral两种角色在A-Device和B-Device上相互切换。
无论A-device扮演host还是peripheral角色,均由A-device向USB接口供电。
- SRP协议
A-device在总线空闲时关闭总线。当一个B-device想要工作时,可向A-device请求开启总线。