0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DWC2的USB驱动开发-USB包详解

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-07-23 17:11 次阅读

本文转自公众号欢迎关注
基于DWC2的USB驱动开发-USB包详解 (qq.com)

一.前言

不管什么通讯协议,比如UART,SPI,USB等等,不管是并口还是串口,不管是同步还是异步,我们从抽象的角度去看,其本质都是一样的。都是先定义物理信号,物理信号可能是差分,单端,电流驱动电压驱动等等,不管是什么样的物理信号,我们从抽象角度看就是不同的物理状态和数字1和0的对应, 这里的状态不一定是电压(虽然数字通讯大部分就是电压),也可能是频率,相位等等,这里的状态也不一定是电平状态也可能是跳变状态,只要是有不同状态可以区分的都可以,甚至你可以自由发挥自我创造。这里的数字1和0即bit,至此我们就到了数字的世界,一切都是1和0的世界了,这个转化是由PHY的收发器完成的。bit再按照一定规则组成帧或者包,然后在包的基础上定义各层协议。任意的通信协议都不外呼上述的过程,USB也是如此。这样一看USB也没有那么可怕了,和我们用的UART等协议本质是一样的,只是物理层信号不一样,协议不一样而已。这一篇我们就来介绍协议层,底层相关的一些内容,这一篇主要关注USB的包,不涉及物理层信号,也不管位填充等等。

二.协议的一般约定

上面提到,协议都是建立在bit之上的,bit组成byte然后组成包或者帧。那么对于bit和byte在总线上的出现就有一个顺序的约定,对于bit先发低位即 LSb ,对于byte先发低字节即 LSB 。对于协议中的多字节数据域都是 小端模式 ,即低字节在低地址,总线上先发送。

三.包组成

前面提到了包就是一系列的1,0序列组成,但是为了协议能解析,包需要分成一些特定的区域以代表不同的功能。比如一些常见的协议一般都有同步域,头,负载,校验等部分。

USB也类似,下面就介绍USB包的组成部分,不同包类型可能由不同的部分扭组合而成。

3.1SYNC同步域

所有USB的数据包以一个SYNC同步区域开始,接收电路可以利用该区域进行时钟对齐。类似的CAN协议也有硬同步机制都差不多。所谓的硬对齐即通过一个特殊的状态(区别于正常的数据,比如一个长串的1,长串的0,任何可以区别于其他状态的都可以)来表示开始,然后以该开始状态后的一个时钟边沿作为对齐。

SYNC的最后两位用于标志SYNC的结束,承接PID的开始。

我们看到SYNC就是KJ对,所以有,边沿这样接收端就可以根据这些边沿进行和北部时钟同步,注意有意第一个KJ对有失真,所以不能用于同步。

SYNC是包的同步机制,不含协议层的有效信息,所以一般协议分析中就不会体现这部分了,只有硬件分析时才可能关注该部分,比如要示波器抓包则可以设置触发条件来触发到包头触发。

另外图中SYNC开始,即从Idle到K也叫SOP,表示包的开始。

3.1.1全速/低速

8位:3个KJ对加两个K,KJKJKJKK

如下所示

图片

3.1.2高速

32位:15个KJ对加两个K,KJKJKJKJ KJKJKJKJ KJKJKJKJ KJKJKJKK .

当重复数据包时,集线器允许从SYNC开始最多丢弃4位,但不能破坏SYNC字段的任何重复位。因此,在被5个集线器重复之后,SYNC字段可以短至12位。

但是注意对于接收方不一定要接收8位或者32位,对于高速接收到至少12位就算(KJKJKJKJKJKK)

3.2包ID区域

SYNC后面就是PID区域,可以看到和我们通常的协议都是一个套路,比如我们使用串口自定义应用层协议,一般前面会用几个特殊字节作为同步域用于标志包的开头,如果用AA,55这种还可以用于时钟同步,波特率自适应。然后定义一个TYPE字段表示该包的作用和类型,这样看来USB也不过如此,这种套路我们早就用过很多了。

USB的PID定义如下,用于表示包的类型,

低4位为包类型编码,高四位为其取反用于校验,接收方如果校验低4位不是高4位的取反则为PID错误。对于编码类型位定义或者PID校验错误的包丢弃。

对于PID合法但是不符合预期的比如对IN端点收到了OUT令牌则不响应。

图片

PID的编码如下,注意如下是按照高位在左,实际传输是低位先传输,注意观察下表

可以看到PID分为了4组,通过PID<0:1> 区分。

图片

比如,以下为一个控制传输的实例,和上表对应,高低4位相加都是0xF

SETUP是0x2D

DATA0 是0xC3

ACK是0xD2

IN是0x69

NAK是0x5A

图片

3.3地址域

地址域包括功能地址域和端点域。地址域必须完全独立匹配,不容许重名(别名),不符合的SETUP必须忽略,访问未初始化的端点的SETUP也要忽略。

一个设备对应一个地址,地址有7位,所以可以寻址128个设备。

一个设备地址对应一个功能,默认设备地址是0,在枚举阶段,标准请求设置地址。

设备地址0即做枚举使用,不能分配给其他使用。

IN,STEUP,OUT,PING,SPLIT都需要带ADDR以表明是和哪个设备通讯。

图片

ADDR后面是端点域,4位可以表示16个端点。所以可以到设备最多16个端点。

端点0用于控制传输是必须支持的,所以很多控制端点是默认使能的,不需要手动使能,

其他端点是功能相关。

SETUP,IN,OUT,PING都要带端点,表示和哪个端点通讯。

低速设备支持最多3个端点,控制端点0+两个端点(两个控制端点,控制端点+中断端点,或者两个中断端点)。

注意控制端点不一定要是端点0,也可以是其他端点,但是必须要有端点0的控制端点。

全速和高速设备支持最多16个IN和OUT端点。

图片

3.4帧序号域

帧序号区域11位,由主机每1mS递增1.

到达最大值0x7FFH时绕回,只有SOF包中有。

SOF包在低速全速时是1mS发一次,

高速则是125uS发一次,注意只有1mS才子等一次,即一个微帧内不递增,也就是8个SOF才递增一次。

3.5数据域

数据域范围从0到1024字节,不同速度不同端点类型长度不一样,低字节先发

图片

不同速度不同端点类型包长如下表

控制中断批量同步
高速64≤1024 x 3512≤1024 x 3
全速8, 16, 32, 64≤648, 16, 32, 64≤1023
低速8≤8

3.6校验域

校验区域采用CRC校验,保护非PID区域,这里为什么不包括PID呢? 因为PID自带校验了。

注意:CRC是在bit填充之前生成的,带CRC的结果之后才是bit填充,接收是先bit填充恢复,然后才是CRC计算。这个很好理解bit填充是硬件层对于信号编码的处理,所以是最后一步,CRC是协议层的内容肯行在前。

对于CRC错误的丢弃该部分数据,一般就是整个包。

Token的CRC

对IN,SETUP和OUT包的ADDR ENDP部分

SOF包的时间戳部分

PING和SPLIT包的ADDR ENDP部分

进行5位CRC校验。

G(X) = X5+ X **2 ** + 1

数据的CRC

数据包使用16位CRC,对数据域进行校验

G(X) = X16+ X15+ X **2 ** + 1

四.各种包格式

4.1令牌包

图片

PID可以是IN,OUT,SETUP,PING

只有主机才能发令牌包,为什么呢? 因为USB架构是主从架构的,只有主机发起通讯,即由令牌包开始,从机才能会响应,否则这么多设备一起启动发送就会乱套了。哪怕是设备要发送数据也是必须要主机发IN令牌包,从机才能响应。

令牌和SOF包由数据之后三字节的EOP间隔。如果一个数据包解码为非有效的令牌或SOF没有有效的EOP终止,则它必须被视为无效包被忽略。

4.2SOF包

全速时1.00 ms ±0.0005 ms 发一次SOF包

高速则125 µs ±0.0625 µs 发一次

SOF包不需要响应。

SOF包由主机或者HUB发送

图片

图片

注意高速的微帧内帧序号是不递增的,只有下一个ms才递增,可以通过判断帧号的递增来同步到该微帧是1ms内的第一个微帧,接下来的是剩余的7个。

4.3数据包

图片

数据包有以下几种

DATA0,DATA1,DATA2,MDATA

DATA1 DATA1 DATA0用于高带宽ISO传输,即一个微帧传3包则按照DATA2-DAT1-DATA0传输。

DATA1-DATA0用于传输翻转差错控制

不同速度的不同传输类型包长不一样进前面的说明。

4.4握手包

握手包用于数据传输时报告状态, 反应数据命令是否成功接收或接受,流控,halt等。

注意不是所有的包都需要握手,比如ISO数据是不需要握手的,因为其注重实时性,不管可靠性,IN和OUT数据之后对方收没收到不管,好比UDP和TCP的区别。

例如如下的ISO的IN,设备返回数据后主机是不需要回ACK的

图片

握手包格式如下,只有PID域:

图片

握手包有如下几种类型,具体什么情况回什么包,可以参考规格书的第8章的不同传输的拓扑图,比如对于中断传输的IN设备可能回NAK和STALL。

图片

4.4.1ACK

ACK由数据的接收方回,表示数据被接收且没有任何错误。

4.4.2NAK

NAK用于流控,由设备回,注意主机不能回NAK。

表示数据没有准备好,或者不能接收数据。

4.4.3STALL

STALL由设备回,表示不能收发数据,或者指定的请求不支持。

主机不能回STALL。

在端点相关的特征Halt之后,再请求端点相关的特征则回STALL。

还有就是控制传输时可能回STALL,具体参考规格书中各种传输的拓扑图。

4.4.4NYET

只有高速有,

PING协议中对数据包回NYET表示本包接收,不能继续接收下一包。

HUB在split传输时也可能回NYET表示split船速和未完成或者不能处理split传输。

4.4.5ERR

只有高速HUB使用

用于报告全速/低速总线上的错误。

规格书8.4.6章节对响应有一个总结,

IN传输设备的响应

图片

IN传输主机的响应,可以看到主机不能NAK要不就是ACK要不就是不响应。

图片

OUT传输设备响应

图片

设备对SETUP的响应

设备不能对SETUP和其数据做STALL和NAK响应,要么就是ACK要么就是不响应。

4.5SPLIT相关令牌包

这部分内容也比较多,后面单独一篇讲。

五.总结

熟悉USB包的格式,是后面查看协议分析仪,示波器抓波形分析等基础,所以需要了解。USB报的格式没有什么特殊,和其他协议套路都是一样的,要从抽象的结构去理解。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    59

    文章

    7438

    浏览量

    258264
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1615

    浏览量

    89669
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92421
  • 开发板
    +关注

    关注

    25

    文章

    4437

    浏览量

    94084
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66814
  • 单板计算机
    +关注

    关注

    0

    文章

    68

    浏览量

    15507
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32397
  • 驱动开发
    +关注

    关注

    0

    文章

    129

    浏览量

    12010
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    98
收藏 人收藏

    评论

    相关推荐

    基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2 USB2.0控制器简介

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2 USB2
    的头像 发表于 05-08 18:10 3175次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x01开篇介绍与新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器简介

    基于DWC2USB驱动开发-0x02 DWC2 USB2.0 IP功能特征介绍

    DWC2即新思(Synopsys )的DesignWare® Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。从linux的内核源码驱动中就带
    的头像 发表于 05-09 10:09 6152次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介绍

    基于DWC2USB驱动开发-IAD描述符详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-IAD描述符详解 (qq.com) 一.  前言 IAD描述符用于一个设备功能关联多
    的头像 发表于 06-27 08:45 1.2w次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-IAD描述符<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-USB复位详解

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-USB复位详解 (qq.com) 一.前言
    的头像 发表于 07-07 11:18 1.6w次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>USB</b>复位<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-USB连接详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-USB连接详解 (qq.com) 一.前
    的头像 发表于 07-07 08:46 2319次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>USB</b>连接<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-高速设备枚举为全速设备问题案例分析

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-高速设备枚举为全速设备问题案例分析 (qq.com) 一.前言   本文分享一个高速设备被枚举为全速的问题。     高速设备速
    的头像 发表于 07-10 17:12 770次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-高速设备枚举为全速设备问题案例分析

    基于DWC2USB驱动开发-设备类驱动框架

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-设备类驱动框架 (qq.com) 一.前言 从软件顶层,从数据流的角度来看
    的头像 发表于 07-16 15:56 675次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-设备类<b class='flag-5'>驱动</b>框架

    基于DWC2USB驱动开发-发送相关的寄存器DMA寄存器详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-发送相关的寄存器DMA寄存器详解 (qq.com) 前言 如下寄存器DIEPxxx,
    的头像 发表于 07-16 16:42 888次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-发送相关的寄存器DMA寄存器<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-数据不能发送问题分析案例

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-数据不能发送问题分析案例 (qq.com)   一.前言        对于驱动
    的头像 发表于 08-08 09:43 1139次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-数据不能发送问题分析案例

    RK3399平台上USB控制器和PHY的连接方式和配置说明

    USB2.0 OTG对应的控制器是DWC2USB2.0 OTG使用的是Synopsys 方案,即使用DWC2控制器同时实现Host和Device功能,
    发表于 05-12 17:46

    如何对基于hal库的DWC2 USB IP进行调试呢

    背景之前适配 DWC2 USB IP 的时候,主要是基于 st 的 hal 库来走的,当时我就对他们的 hal 库代码不满,只是无奈,迫于时间就没重构,果不其然,usb bug 一堆,随意举例,这还
    发表于 06-14 15:23

    无法让USB主机正常工作是我做错了什么吗?

    cdc_ncm[ 1.793050] dwc2 49000000.usb-otg: mapped PA 49000000 to VA 7975fc9b[ 1.793872] ehci_hcd: USB 2.0
    发表于 12-02 06:06

    《Linux设备驱动开发详解》第20章、USB主机与设备驱动

    《Linux设备驱动开发详解》第20章、USB主机与设备驱动
    发表于 10-27 11:04 8次下载
    《Linux设备<b class='flag-5'>驱动</b><b class='flag-5'>开发</b><b class='flag-5'>详解</b>》第20章、<b class='flag-5'>USB</b>主机与设备<b class='flag-5'>驱动</b>

    基于DWC2USB驱动开发-高速设备速度握手详解

    前面我们分析了USB连接和复位的过程, 也知道低速和全速/高速的USB设备分别是上拉DM和DP,主机通过不同的上拉区分接的是低速还是全速/高速设备的。但是怎么区分全速和高速呢? 这就需要额外的一些握手过程,本篇就来详细介绍该过程。
    的头像 发表于 07-08 08:40 1499次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-高速设备速度握手<b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-抽丝剥茧再论切换到状态阶段标志DOEPINTn.StsPhseRcvd

    本文转自公众号系列文章,欢迎关注 基于DWC2USB驱动开发-USB详解 (qq.com)
    的头像 发表于 07-24 18:04 817次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-抽丝剥茧再论切换到状态阶段标志DOEPINTn.StsPhseRcvd