USB简述(Linux驱动开发篇)
时间:2022-09-19 18:00:00
一、USB简述
- USB 全称为 Universal Serial Bus,翻译是通用串行总线。
1.按版本划分:
USB 目前可分为 USB1.0、USB2.0、USB3.0 即将到来的USB4.0
- USB1.0:
- USB2.0: USB2.0 的480Mbps为半双工。目前,大多数单片机和低端单片机 Cortex-A 芯片配置的都是 USB2.0 接口,比如 STM32和ALPHA使用开发板I.MX6ULL。USB2.0 全面兼容USB1.0标准。USB2.0 分为两个版本:Full-Speed(12Mbps)和High-Speed(480Mbps)
- USB3.0:USB3.最大理论传输速度为0 5.0Gbps, USB3.引入全双工数据传输,USB3.0中两条用于发送数据,另外两条用于接收数据.
- USB4.0: 还在标准定制中,目前还没有配备设备。USB4.0 的速度将提升到了 40Gbps,最高支持 100W 供电能力,数据传输和供电只需一根线就可以完成
2.按接口类型划分:
- USB A 插头(左)和插座(右) (大头)
- USB B 插头(左)和插座(右) (大头)
- Mini USB插头(左)和插座(右) (小头)
- Micro USB 插头(左)和插座(右) (小头)
- USB Typec插头(左)和插座(右) (小头)
3、电气特性 - USB A 插头从左到右的顺序依次排列 1,2,3,4,
第 1 根线为 VBUS电压为5V(TTL电平),
第 2 根线为 D-,
第 3 根线为 D ,
第 4 根线为 GND。 - Mini USB插头,发现Mini USB 插头有五个触点,即 5根线,
第 1根线为VCC(5V),
第 2 根线为D-,
第 3根线为D ,
第 4 根线为ID,
第 5 根线为 GND - 可以看出 Mini USB 插头相比 USB A 多了一个插头 ID 线,这个 ID 线用于实现OTG功能,通过 ID判断当前连接是主设备(HOST)还是从设备(SLAVE)。
ID=1:OTG 从机模式下设备工作。
ID=0:OTG 主机模式下设备工作。 - USB 因此,使用差分信号传输数据D-和D 两条差分信号线
3.拓扑结构
- USB 主从结构,即主机和从机两部分,一般称为主机Host(大头,比如电脑等。),从机上Device(小头,主要用于设备、鼠标、键盘等。
- 如果不够,我们可以买 USB 扩展计算机的集线器
USB 插口,USB也叫集线器USB HUB。
- 主机一般带几个原生主机。USB 例如,主控制器 I.MX6ULL有两个原生的 USB主控制器。但是两个接口肯定不够,这个时候要通过 USB HUB 芯片扩展。虽然我们可以原生 USB 口数扩大了,但,但我们不能对原生口进行扩大 USB 扩大口的带宽。
- USB 数据通信只能在主机和设备之间进行, USB 主机和主机、设备和设备不能通信。因此,两个正常通信 USB接口之间必定有一个主机,一个设备比如主机提供 USB A 从机提供插座 Mini USB、Micro USB 等插座
- 在一个USB 只有一个系统 USB 但是可以有多个主机USB 设备,包括USB功能设备和USB HUB,最多支持127个设备,所以一个USB主控制器最多可以分配 127 整个地址 USB 拓扑结构是一个分层的金字塔形
- 一共有 7 层,金字塔顶部 Root Hub,这个是USB 控制器内部。 Hub就是连接的USB 集线器,Func就是具体的USB设备
USB 主机和从机之间的通信通过管道(Pipe)为了完成,在主机端管道实际上是一组缓冲区,用于存储主机数据,在设备端管道对应特定的端点。
4.usb OTG
- 上面已经说过了,usb严格遵守主从结构。
- 支持USB OTG 功能的USB 可以做接口 HOST,也可以做 DEVICE。这其中使用ID线是主机还是从机。
ID=1:OTG 从机模式下设备工作。
ID=0:OTG 主机模式下设备工作。
二、USB协议简述
- 上面已经提到过,usb小头有四五线结构(多一条线是ID线,支持OTG模式)
- 主要的传输数据是依靠D 和D-实现两条差分信号线。
1、USB 描述符
USB 描述符是用来描述的 USB 信息的,USB 设备使用描述符向主机报告其相关属性信息,常用描述符如下:
1)设备描述符:设备描述符用于描述 USB 设备一般信息,USB 设备只有一个设备描述符
2)配置描述符:配置描述符描述了设备可提供的接口(Interface)数量、配置编号、供电信息等,
3)字符串描述符:字符串描述符是可选的。字符串描述符用于描述制造商、设备名称等方便人们阅读的信息
4)接口字符串:界面描述符一般记录界面编号、界面对应的端点数量、界面描述的类别等.配置描述符指定了配置下的接口数量,配置可提供一个或多个接口,接口描述符用于描述接口属性。
5)端点描述符:端点描述符描述了树传输类型、方向、数据包大小、端点号等信息.端点是设备和主机之间数据传输的逻辑接口,除了端点 0是双向端口,其他端口是单向的。
2、数据包类型
- USB 是串行通信,需要一位一位的去传输数据, USB 传输的时候先将原始数据进行打包,所以 USB 中传输的基本单元就是数据包。根据用途的不同,USB 协议定义了 4 种不同的包结构:
1.令牌(Token)包、
2.数据(Data)包、
3.握手(Handshake)包
4.特殊(Special)包 - 这四种包通过包标识符 PID 来区分,PID 共有8位,USB协议使用低 4位PID3~PID0,另外的高四位 PID7PID4是PID3PID0的取反,传输顺序是 PID0、PID1、PID2、PID3…PID7。
1.令牌包的PID1~0为 01,
2.数据包的 PID1~0 为 11,
3.握手包的 PID1~0 为 10,
4.特殊包的 PID1~0 为 00 - 其中每种包又有具体的包。他们之间的区分就是包标识符PID
1、令牌包
- 首先是 SYNC 同步域,包同步域为 00000001,也就是连续7个0,后面跟一个1,如果是高速设备的话就是31个0后面跟一个1。紧跟着是PID,
- 这里是SETUP包,为 0XB4,大家可能会好奇为什么不是 0X2D(00101101), 0XB4 的原因如下:
①、SETUP 包的 PID3~PID0为1101,因此对应的 PID7~PID4 就是 0010。
②、PID 传输顺序为 PID0、PID1、PID2…PID7,因此按照传输顺序排列的话此处的PID 就是 10110100=0XB4,并不是 0X2D。 - PID后面跟着地址域(ADDR)和端点域(ENDP),为目标设备的地址和端点号。
- CRC5 域是 5位 CRC 值,是ADDR和ENDP这两个域的校验值。最后就是包结束域(EOP),标记本数据包结束。其他令牌包的结构和 SETUP 基本类似,只是 SOF 令包中间没有 ADDR 和 ENDP 这两个域,而是只有一个11 位的帧号域
2、数据包
3、握手包
3、传输类型
在端点描述符中 bmAttributes 指定了端点的传输类型,一共有 4 种传输类型。
控制传输
同步传输
批量传输
中断传输
1、控制传输
-
控制传输一般用于特定的请求,比如枚举过程就是全部由控制传输来完成的,比如获取描述符、设置地址、设置配置等
-
控制传输分为三个阶段:
1)建立阶段(SETUP):建立阶段使用 SETUP 令牌包,SETUP 使用DATA0 包。
2)数据阶段(DATA)(可选):
数据阶段是 0 个、1 个或多个输入(IN)/输出(OUT)事务
数据阶段的第一个数据包必须是 DATA1,每次正确传输以后就在 DATA0和DATA1 之间进行切换
3)状态阶段(STATUS):
状态阶段的传输方向要和数据阶段相反,比如数据阶段为 IN 的话状态阶段就要为 OUT,状态阶段使用DATA1包。 -
读控制传输阶段
2、同步传输
- 同步传输用于周期性、低时延、数据量大的场合,比如音视频传输。
- 这些场合对于时延要求很高,但是不要求数据 100%正确,允许有少量的错误。
- 因此,同步传输没有握手阶段,即使数据传输出错了也不会重传。
3、批量传输
- 批量传输就是用于大批量传输大块数据的,这些数据对实时性没有要求,比如 MSD类设备(存储设备),U 盘之类的。
- 批量传输分为批量读(输入)和批量写(输出),如果是批量读的话第一阶段的 IN 令牌包,如果是批量写那么第一阶段就是OUT 令牌包。
批量写传输过程:
①、主机发出OUT令牌包,令牌包里面包含了设备地址、端点等信息。
②、如果OUT 令牌包正确的话,也就是设备地址和端点号匹配,主机就会向设备发送一个数据(DATA)包,发送完成以后主机进入接收模式,等待设备返回握手包,一切都正确的话设备就会向主机返回一个 ACK握手信号。
批量读的过程刚好相反:
①、主机发出IN令牌包,令牌包里面包含了设备地址、端点等信息。发送完成以后主机就进入到数据接收状态,等待设备返回数据。
②、如果 IN 令牌包正确的话,设备就会将一个 DATA 包放到总线上发送给主机。主机收到这个DATA包以后就会向设备发送一个ACK 握手信号。
4、中断传输
- 这里的中断传输并不是我们传统意义上的硬件中断,而是一种保持一定频率的传输,
- 中断传输适用于传输数据量小、具有周期性并且要求响应速度快的数据,比如键盘、鼠标等。
- 中断的端点会在端点描述符中报告自己的查询时间间隔,对于时间要求严格的设备可以采用中断传输。
4、usb枚举
-
当 USB 设备与USB主机连接以后主机就会对 USB设备进行枚举,通过枚举来获取设备的描述符信息,主机得到这些信息以后就知道该加载什么样的驱动、如何进行通信等。
-
USB 枚举过程如下:
①、第一回合,当USB 主机检测到USB设备插入以后机会发出总线复位信号来复位设备。USB 设备复位完成以后地址为 0,主机向地址 0 的端点 0 发送数据,请求设备的描述符。设备得到请求以后就会按照主机的要求将设备描述符发送给主机,主机得到设备发送过来的设备描述符以后,如果确认无误就会向设备返回一个确认数据包(ACK)。②、第二回合,主机再次复位设备,进入地址设置阶段。主机向地址 0 的端点0 发送设置地址请求数据包,新的设备地址就包含在这个数据包中,因此没有数据过程。设备进入状态过程,等待主机请求状态返回,收到以后设备就会向主机发送一个 0 字节状态数据包,表明设备已经设置好地址了,主机收到这个 0 字节状态数据包以后会返回一个确认包(ACK)。设备收到主机发送的ACK 包以后就会使用这个新的设备地址,至此设备就得到了一个唯一的地址。
③、第三回合,主机向新的设备地址端点 0 发送请求设备描述符数据包,这一次主机要获取整个设备描述符,一共是 18个字节。
④、和第③步类似,接下来依次获取配置描述符、配置集合、字符串描述符等等。