当前位置: 首页 > 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.lryc.cn/news/617815.html

相关文章:

  • 修改学生信息管理系统以及查询
  • Ansys Mechanical中的声学分析
  • Nestjs框架: RBAC基于角色的权限控制模型初探
  • java内部类-匿名内部类
  • 适用于高质量核磁共振(NMR)的溶剂推荐
  • Apache ECharts 6 核心技术解密 – Vue3企业级可视化实战指南
  • 每日五个pyecharts可视化图表-line:从入门到精通 (3)
  • 编程技术杂谈4.0
  • SQL复杂查询
  • 论文学习22:UNETR: Transformers for 3D Medical Image Segmentation
  • TCGA数据集下载工具gdc-client下载慢解决方案
  • 掘金数据富矿,永洪科技为山东黄金定制“数智掘金”实战营
  • JavaScript let的使用
  • macos彻底删除vscode
  • 2025年农业工程与环境预防国际会议(ICAEEP 2025)
  • k8s 部署mysql主从集群
  • 用AListLite让安卓手机成为NAS实现文件共享
  • 基于开源模型构建医疗疾病大模型:从理论到实践
  • 2025牛客多校第八场 根号-2进制 个人题解
  • USB 基本描述符
  • TRL - Transformer Reinforcement Learning SFTTrainer 和 SFTConfig
  • AI(2)-神经网络(激活函数)
  • 当生产环境卡成 PPT:Spring Boot 线程 Dump 捉妖指南 - 第544篇
  • 【09-神经网络介绍2】
  • 数据结构-排序(2)
  • 【排序算法】⑦归并排序
  • 用Python从零开始实现神经网络
  • 【08-神经网络介绍】
  • STM32 HAL库 HAL_TIM_OC_Start函数解读
  • maven项目打包成sdk后在别的项目使用