物理层怎么传输
USB采用差分信号传输,使用的是NRZI编码方式:数据为0时,电平翻转;数据为1时,电平不翻转。如果出现6个连续的数据1,则插入一个数据0,强制电平翻转,以便时钟同步。上面的一条线表示的是原始数据序列,下面的一条线表示的是经过NRZI编码后的数据序列。
同步信号的抓包如下
怎么检测插入
在USB集线器的每个下游端口的D+和D-上,分别接了一个15千欧的下拉电阻到地,当集线器的端口悬空(即没有设备插入)时,输入端就被这两个下拉电阻拉到了低电平,而在USB设备端,在D+和D-上接了一个1.5千欧的上拉电阻到3.3V的电源,1.5千欧的上拉电阻是接在D+和D-哪个,由设备的速度来决定,对于全速设备和高速设备,上拉电阻是接在D+上的,而低速设备的上拉电阻则是接在D-上。
怎么枚举
设备插入端口,hub检测各个端口的D+/D-的电压判断是何种速度的设备,并返回给主机,主机得知新设备连上后等待100ms,发出Set_Port_Feature请求让hub复位刚插上设备的端口(hub驱动D+/D-都为低电平),主机继续向hub发送Get_Port_Status以查询是否复位成功,当hub撤销复位信号,设备处于默认状态,地址为0;主机发送Get_Descriptor获取默认管道的最大包长度,系统会要求hub再复位一次,主机通过Set_Address向设备分配一个地址,进入地址状态,主机发送Get_Descriptor读取设备描述符,并详细解析并读取配置/接口/端点描述符等;通过device_add将设备加入到usb总线并match驱动,匹配后调用device_bind_driver并将控制权交给设备驱动;驱动发送Set_Configuration来确定选择设备的那个配置来工作
软件框架
软件的基本框架如下,
传输基本单位
USB总线上传输数据是以包为基本单位的,一个包被分成不同的域,根据不同类型的的包,包含的域是不一样的,但不同的包有个共同的特点,就是要以同步域开始,紧跟着一个包标识符PID,最终以包结束符EOP来结束这个包
令牌包 token:PID + ADDR(设备地址,端点地址) + CRC5
帧首包 SOF(Start of frame):PID + 帧号 + CRC5;
数据包 DATA:PID + 数据 + CRC16;
握手包 Handshake:PID
PID类型如下
事务是什么
事务通常有两个或者三个包组成。令牌包,数据包和握手包;令牌包用来启动一个事务,总是有主机发送。数据包传送数据可以从主机到设备,也可以从设备到主机方向,由令牌包来指定;握手包的发送者通常为数据接收者,当数据接收正确后,发送握手包
示例如下
传输是什么
不同传输类型每 帧(Frame)
占用带宽的特性不同。同步传输,每帧占用固定带宽;
中断传输,每帧都占用带宽,但所占带宽不固定;
控制传输和批量传输,在需要时才占用帧带宽,批量传输将会占用帧的所有剩余带宽。
除同步传输外,一个事务(Transaction)由一个令牌包,若干个数据包,一个握手包构成。
而同步传输没有握手包,所以接收端接收完同步传输数据包,计算出 CRC,即使发现数据有错,也不能发送握手包给发送端,让发送端重发。
控制传输(Control Transfer)
控制传输用于主机枚举设备时从设备获取信息或配置信息。控制传输由 建立阶段(SETUP),数据阶段(DATA),状态阶段(STATUS) 组成。其中数据阶段是可选的,数据阶段可以包含多个 IN 事务或 OUT 事务,且在一次控制传输中,只能包含 IN 事务或 OUT 事务,不能既包含 IN 事务也包含 OUT 事务
示例如下
批量传输(Bulk Transfer)
用于传输突发的大量数据,要求数据不能出错,但对时间没有要求,适用于存储设备、打印机等。批量传输是可靠的传输,需要握手包来表明传输的结果。若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的 PID 按照 DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步
中断传输(Interrupt Transfer)
中断传输每一帧(Frame)最多 传输 1 次事务,而批量传输可以在总线空闲时在帧内传输多次事务,中断传输不支持 PING,优先级更高,最大包长与批量传输不同,其他的与批量传输相同。主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。中断传输是一种保证查询频率的传输。中断端点在端点描述符中要报告它的查询时间,主机会保证在小于这个时间间隔的范围内安排一次传输。
同步传输(Isochronous Transfer)
同步传输是不可靠传输,它没有握手包,也没有 PID 翻转,不支持重传。主机在安排事务传输时,同步传输具有最高优先级。同步传输适用于固定速率抵达或指定时刻抵达的场合,可以容忍偶然错误的数据上。一般用于喇叭,麦克风,摄像头等实时性要求高的设备。它由令牌包和数据包组成,没有握手包