Linux驱动学习day27天(USB驱动)

发布于:2025-08-12 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、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 总结


网站公告

今日签到

点亮在社区的每一天
去签到