USB简述(Linux驱动开发篇)_linux 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.0引入了全双工数据传输,。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个触点,也就是 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的小头有4线和5线的结构(多一根线是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 令牌包。
    批量写传输过程:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值