USB简述(Linux驱动开发篇)_linux usb驱动开发

  • 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 令牌包。
    批量写传输过程:
    ①、主机发出OUT令牌包,令牌包里面包含了设备地址、端点等信息。
    ②、如果OUT 令牌包正确的话,也就是设备地址和端点号匹配,主机就会向设备发送一个数据(DATA)包,发送完成以后主机进入接收模式,等待设备返回握手包,一切都正确的话设备就会向主机返回一个 ACK握手信号。
    批量读的过程刚好相反:
    ①、主机发出IN令牌包,令牌包里面包含了设备地址、端点等信息。发送完成以后主机就进入到数据接收状态,等待设备返回数据。
    ②、如果 IN 令牌包正确的话,设备就会将一个 DATA 包放到总线上发送给主机。主机收到这个DATA包以后就会向设备发送一个ACK 握手信号。

4、中断传输

  • 这里的中断传输并不是我们传统意义上的硬件中断,而是一种保持一定频率的传输,
  • 中断传输适用于传输数据量小、具有周期性并且要求响应速度快的数据,比如键盘、鼠标等。
  • 中断的端点会在端点描述符中报告自己的查询时间间隔,对于时间要求严格的设备可以采用中断传输。

4、usb枚举

  • 当 USB 设备与USB主机连接以后主机就会对 USB设备进行枚举,通过枚举来获取设备的描述符信息,主机得到这些信息以后就知道该加载什么样的驱动、如何进行通信等。
  • USB 枚举过程如下:
    ①、第一回合,当USB 主机检测到USB设备插入以后机会发出总线复位信号来复位设备。USB 设备复位完成以后地址为 0,主机向地址 0 的端点 0 发送数据,请求设备的描述符。设备得到请求以后就会按照主机的要求将设备描述符发送给主机,主机得到设备发送过来的设备描述符以后,如果确认无误就会向设备返回一个确认数据包(ACK)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值