当前位置: 首页 > news >正文

Linux驱动学习day27天(USB驱动理论部分)

一、USB原理及硬件知识

回答几个问题:

1、为什么USB设备一插入就可以识别到USB设备?

在接上USB设备的时候,5v的电压会形成一个通路,我们可以算出15K电阻的电压(接近5v),这时候为高电平,就可以执行接下来枚举等等操作了。

2、为什么一接入USB设备的时候,PC机就能识别到是哪一种设备?

USB有相关的协议,接上USB设备的时候PC机相当于会发送“你是什么设备”,然后USB设备会回复“我是xxx设备”,格式已经固定。要遵守规范。

3、PC机上接有很多USB设备,如何分辨?

当每一个USB接入PC时,USB总线驱动会为其分配一个编号,PC想访问某个USB设备时,发送的命令都带有编号地址。

4、USB刚接入PC时,还没有编号,那么PC怎么把分配的编号告诉USB设备?

新接入的USB设备编号为0,在未分配编号之前,均使用0编号与其通信。

CPU通过USB host(USB host driver)访问到下面的hub和func。 APP调用USB dev driver再调用USB host driver来访问到usb host , 通过usb host 访问到USB dev。

按照下图可知:一个USB host最多可以有6级hub,第7级一定是USBfunction。

二、软件工程师中的USB电气信号

对于USB hub中有一个下拉电阻15K,对于USB dev 有一个上拉电阻1.5K。

Full-speed/High-speed 的D+有一个上拉电阻。Low-speed的D-有一个上拉电阻,刚好相反。

一个USB设备只能Full-speed/Low-speed,或者是Full-speed/High-speed,High-speed和Low-speed不能兼容。

USB数据信号:SOP(Start of Packet) and EOP(End of Packet)

SOP信号

对于Full-speed/Low-speed设备,SYNC信号是三对KJ信号加两个K信号,即KJKJKJKK。J可以对应idle信号,K相反。

同步信号的作用:

  • SYNC信号用于同步接收端和发送端的时序,是每个数据包的起始标志。

  • 它让接收端能够准确地判定比特周期 T,实现无时钟线的数据同步

  • 类似UART通过约定波特率实现同步,USB通过这个SYNC序列来隐含地提供时钟信息,从而避免了I2C、SPI那样的专门时钟线。

USB设备使用的是反向不归零编码(NRZI)来传输数据:电平不发生变化表示下一个周期传输的是1,发生变化表示下一个周期传输的数据是0。再传输很多相同的数据,比如10个1的时候,会在发生6个1之后强制反转信号发送一个0,USB中使用的bit-stuffing位填充方法。

三、USB协议层的数据格式

3.1 USB设备拓扑结构图

host想去读写数据的时候,需要发送一个包(包含目的addr,endpoint,方向)。

3.2 包数据格式

PID含有包的类型,带有包的方向。用到4位来表示16中包。

host想要发送数据,需要先发送PID令牌包(令牌类0001),其中包含想要发送对象的信息(含有7位地址和4位端口号),接下来继续发送包,其PID类型为数据类0011。

发送完数据之后,需要接收方发送握手类信号,PID为0010(ACK , 收到并且保存信息),由设备将信号发送给host(握手包)。

根据上述的流程,我们可以很清楚的理解,当host想要发送信号给dev,需要涉及三种包,分别是:令牌包,数据包,握手包。其流程也称为事务(数据传输的完整流程)。三种包分别对应着三种阶段:token phase , data phase , hand shake phase。

事务(transaction)由包组成,包由field域组成,field由bit组成。

事务分为:token phase(传输 token packet)、data phase(传输 data packet)、hand shake phase(传输 hand shake packet)。所有的包都含有SOP、SYNC、PID(根据PID的不同,所带的数据就不同)、CRC、EOP。

3.3 传输

有四类传输(Transfer):

  • 批量传输bulk:就是使用批量事务实现数据传输,比如U盘。(可靠,非实时)
  • 中断传输int:就是使用中断事务实现数据传输,比如鼠标。(可靠,实时)(中断传输并没有中断的效果,它只不过是会周期性的发起数据的传输 , 周期性的读取)
  • 实时传输iso:就是使用实时事务实现数据传输,比如摄像头。(非可靠(偶尔花屏),实时)
  • 控制传输:由建立事务、批量事务组成,所有的USB设备都必须支持控制传输,用于"识别/枚举"

一个bulk/int/iso 传输由一个事务组成。一个控制传输由多个事务实现。

所有的usb传输均由host主动发起连接,dev无法主动告诉host是否有数据等等。

3.3.1 bulk传输

所谓批量传输就是批量事务的一次或者多次重复。bulk传输可以发送一种特殊的包:ping packet。询问是否有数据产生。

从上图可以看出,我要批量读取数据,要发送很多的事务,每个事务都含有完整的token phase、data phase、handshake phase。

批量传输 = 1个/多个批量事务。

3.3.2 int 传输

中断传输和批量传输的区别是:host每隔一段时间通过中断事务去访问dev。就拿鼠标举例,我们使用鼠标的时候,主机host需要按照周期不断的去访问鼠标,发送输入令牌包,去读取鼠标的数据。

3.3.3 iso传输

对于实时传输,不要求数据的准确性,故其没有握手过程,只有token phase 和 data phase .

3.3.4 Control传输

一个控制传输分为3个stage,分别是setup stage ,data stage , status stage。

建立过程(setup stage)发出建立事务,分为三个阶段:token phase(发送SETUP令牌包) , data phase(DATA数据包,要含有方向,表示是要读取数据还是写数据,想写什么数据或者读什么数据,这是有固定格式的,host和dev均可以理解这个格式),handshake phase。

批量过程(data stage)含有多个批量事务。第一次发送的PID为data0,下一次就为data1,依次交替。

状态过程 是一个批量事务,下图是可接受到的状态,状态均有dev发送给host,host读dev的数据也是如此,虽然说host发送data给dev,其本意是获得dev发送ACK给host来表示成功。

下面这幅图是host写dev的时候的状态stage ,host去读dev,收到dev发来的data len = 0 的数据包即表示成功,之后发送ACK握手包。

如果是读数据,状态过程中发送out令牌,host写给dev数据,收到ACK握手包。

stage ≈ 事务 ==》由多个phase组成 《==》多个packet

3.4 总结(using usbprotocolsuite)

3.4.1 控制传输

3.4.2 批量传输

四、USB描述符

USB描述符用来描述设备、配置、接口、端点

4.1 设备、配置、接口、端点

在SETUP事务的数据里,表示了要访问的是什么:Device?Interface?Endpoint?

对于一个USB设备,它可以多种配置(Configuration)。比如4G上网卡就有2种配置: U盘、上网卡。第1次把4G上网卡插入电脑时,它是一个U盘,可以按照里面的程序。装好程序后,把它再次插入电脑,它就是一个上网卡。驱动程序可以选择让它工作于哪种配置,同一时间只能有一种配置。大多数的USB设备只有一种配置。

 一个配置下,可以有多个接口(lnterface 这里要注意不是硬件上的接口),接口等同于功能(Function)。比如USB耳机有两个接口(功能): 声音收发、按键控制。

一个接口,可能有多个设置(Setting),比如默认设置下它使用较低的带宽,可以选择其他设置以使用更高带宽。

一个接口,由一个或多个端点(Endpoint)组成。端点0属于整个设备的,端点0是双向的(既可以读也可以写)。接口还可以有其他端点,这些端点是单向的,要么是批量(Bulk)端点、要么是中断(interrupt)端点、要么是同步(lsochronous)端点。

一个设备只有一个设备描述符:用来表示设备的ID、它有多少个配置、它的端点0一次最大能传输多少字节数据;

可能有多个配置描述符:用来表示它有多少个接口、供电方式、最大电流

一个配置描述符下面,可能有多个接口描述符:用来表示它是哪类接口、有几个设置(Setting)、有几个端点

一个接口描述符符下面,可能有多个端点描述符:用来表示端点号、方向(IN/OUT)、类型(批量/中断/同步)

在Linux下可以使用lsusb -v列出所有的usb描述符信息。

http://www.dtcms.com/a/326795.html

相关文章:

  • SSR-code 项目复刻与3D模型生成实现
  • nomachine的安装和使用
  • 华清远见25072班C语言学习day6
  • 操作系统1.5:操作系统引导
  • 101. 孤岛的总面积
  • 下一代防火墙组网
  • 晓知识: 动态代理与静态代理的区别
  • Android模块化架构深度解析:从设计到实践
  • 强联通分量(重制版)
  • 环境配置-拉取NVIDIA Docker镜像时出现401Unauthorized错误
  • 数据填报是什么?数据填报工具有哪些?
  • 黑马程序员mysql基础篇笔记
  • 自定义switch with icon
  • 使用Pytest进行接口自动化测试(三)
  • 深入了解torch框架
  • 数据类型 string
  • 算法题——IP地址分类与子网掩码
  • CobaltStrike安装和使用教程
  • Cobalt Strike的搭建和使用
  • JDK21虚拟线程和 Golang1.24协程的比较
  • STM32——system文件夹
  • Empire--安装、使用
  • 集团型企业如何统一管控子公司权限?
  • 奈飞工厂:算法优化实战​
  • 视频播放器哪个好用?视频播放器PotPlayer,KMP Player
  • 多轮会话记忆的核心挑战
  • 8.11下一代防火墙组网方案笔记
  • 使用MAS(Microsoft Activation Scripts)永久获得win10专业版和office全套
  • C++算法·前缀和
  • DCN之AP IGMP Snooping 原理与配置