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

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

3天内不再提示

基于DWC2的USB驱动开发-抽丝剥茧再论SETUP完成标志DOEPINTn.SetUp

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-07-24 15:57 次阅读

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

前言

https://www.elecfans.com/outside?redirect=https://mp.weixin.qq.com/s/gm5OAutfnYv6H_5Ce8GEqA一文中我们介绍了控制传输,中断相关寄存器,尤其是DOEPINTn.XferCompl,DOEPINTn.SetUp,DOEPINTn.StsPhseRcvd几个状态的组合非常重要,因为由他们可以确定当前控制传输处于什么阶段。前文我们对此进行了介绍,但是个人觉得讲的还不够透彻,原理还没有讲清楚,知其然知其所以然是我们一开始就强调的,所以针对这个几个标志位我们再次更详细的介绍,先来介绍最关键的DOEPINTn.SetUp。

DOEPINTn.SetUp

Setup是DOEPINTn寄存器中的一个标志,用于表示Setup阶段是否完成。

我们这里可能要问DIEPINTn为什么没有SetUp标志,因为Setup总是HOST->DEV的,所以总是OUT传输,所以总是对应OUT端点的,IN端点的寄存器不可能有。这里强调一下我们一定要多问为什么,先思考猜测,然后再从手册规格书中查找答案,只有这样才能加深理解,USB开发中这是很重要的,当然任何技术性的工作这一点都重要。

我们从寄存器的描述中也可以看到,该位表示SetUP阶段完成,并且只有控制OUT端点有。

还有个信息是本次控制传输没有连续的SETUP,意味着软件可以开始解析SETUP的8字节的内容以决定下一步要干嘛了。如果有连续的SETUP则是最后一个SETUP完成才能进行。

那么究竟SETUP完成对应的一个什么状态呢? 硬件是怎么知道SETUP阶段完成的呢? 主机和设备判断SETUP完成有什么区别吗? 我们会抛出一连串问题,如果能抛出这些问题说明你很适合做底层和驱动开发!

后面我们会抽丝剥茧,从原理到实践,从猜测到手册中求证,一层层剖析。

这里我们要回顾下控制传输,

我们从规格书中的拓扑图可以看到,控制传输的SETUP阶段过程如下

或者换个表达方式如下

或者从USB分析仪抓包数据来看,更形象。

SETUP阶段对应3个包:SETUP令牌包;DATA0的数据包,始终是HOST->DEV;设备的响应ACK。

这里顺便提一下,SETUP的数据始终使用DATA0;而设备要么正常接收并接受ACK,要么接收错误或者没接收到不响应,只有这两种情况,不能接收了不接受而NAK或者STALL等。

这里还顺便提一下接收和接受的概念区别。接收通常指的物理层数据正确接收到了,而接受则指的软件能够处理,或者说愿意处理。 接收了也可能不接受。

这里协议层面我们可以看到SETUP阶段完成的标志是,设备ACK响应了。

如下所示

仔细思考下,这里只是协议上的定义,也就是对应的总线上的数据,至于SETUP完不完成是要由参与者HOST和DEV去确定的,换句话说总线上的状态并不意味参与者就是这个状态了,因为参与者还要正确接收到总线上的数据才算。

对于主机接收到了设备发送的ACK那么主机认为SETUP阶段完成,如果设备发了ACK但是主机没收到呢?那么主机认为SETUP没完成,会认为本次失败,从头发SETUP包重来。

同样的对于设备来说将ACK发送到总线上去后,设备并不知道HOST接收没接收到,设备并不知道主机的状态。所以主机和设备对SETUP完成的状态确认存在不同步。

那怎么办呢? 设备并不知道主机认为SETUP完成了没有,因为设备并不知道主机收没收到ACK。就好比子非鱼安知鱼之乐,有点绕了。

其实也没什么办法,设备确实现在不知道主机是不是认为SETUP完成了,但是设备可以根据主机下一步的行动来确定。因为主机如果接收到了ACK,认为SETUP完成了那么主机下一步就会发IN或者OUT令牌进入数据阶段(或者状态阶段),否则则会重发SETUP重新进入SETUP阶段。

设备可以据此来进行判断,如果收到了主机的IN或者OUT令牌,则确认主机认为SETUP已经完成了,于是设备也知道SETUP完成了,这里设备和主机判断SETUP完成的时间点是不一样的,这就是协议定义和实际判定存在的区别。所以对于协议设计一定要考虑这种区别,协议设计了要考虑如何实现,也就一直强调的理论要结合实践,对于驱动编写更需要考虑从这些细节。

以上恭喜你从头开始推导出了设备判断SETUP完成的原理,那么回到上面的标志位DOEPINTn.SetUp即表示SETUP阶段完成,DWC2控制也是这么判断的吗?所谓英雄所见略同,DWC2控制器还真是这么判断的。

上面寄存器的描述中只提了该标志的含义,并没提其具体置位的原理和时机,实际编程指导手册中是有说明的。

如下位置,手册就进行了说明当,SETUP令牌之后,接收到了IN或OUT令牌则置位DOEPINTn.SetU,和我们推导的完全一致。

为什么是IN或OUT呢,因为控制传输可能是控制写,控制读,还可能无数据阶段的控制传输,所以后面要不就是IN数据或者OUT数据或者IN状态,如下所示

控制写

控制读

无数据阶段的控制传输

驱动编写注意事项

从上面可以看到设备是延迟才能确认SETUP完成的,也就是在SETUP后设备收到了主机发的IN和OUT之后才确认,中断也是在此时产生。

对于控制写,上面设备确认SETUP完成产生中断,中断服务函数开始去解析8字节的SETUP内容,来确定数据阶段要干嘛,后面数据阶段是IN还是OUT或者还是没有数据阶段直接状态阶段,其实是数据阶段(状态阶段)已经启动,设备延迟了。

此时中断服务函数还未执行,软件还没根据解析准备IN或者OUT描述符,所以此时对于这个IN或者OUT,硬件只能自动NAK,如下所描述:

所以这种情况下,中断服务函数中进行了解析,并知道要准备OUT描述进行接收时,设置EPEna=1时还要同时设置CNAK=1,清除硬件的自动NAK状态,让硬件根据OUT描述符去接收数据。

对于控制读后面是IN数据阶段,或者无数据阶段的控制传输后面是IN状态,也是类似的。

总结

以上对DOEPINTn.SetUp进行了详细的解析,因为它太重要了,SETUP阶段是控制传输的核心,因为只有SETUP完成才能去解析8字节的内容,才能决定后续干嘛,对于驱动编写接收到8字节的SETUP数据是第一个关键步。以上也可以看出一定要从原理上去理解,这也是驱动编写的重要原则,必须知其然知其所以然,精确的知道各个时间点的各个时间,以及其条件等,注意精确两个字。

审核编辑:汤梓红

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

    关注

    30

    文章

    5036

    浏览量

    117763
  • usb
    usb
    +关注

    关注

    59

    文章

    7437

    浏览量

    258252
  • 驱动开发
    +关注

    关注

    0

    文章

    129

    浏览量

    12010
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    98
收藏 人收藏

    评论

    相关推荐

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2 USB2
    的头像 发表于 05-08 18:10 3174次阅读
    基于<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 6148次阅读
    基于<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描述符详解

    基于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>复位详解

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-USB连接详解 (qq.com) 一.前言   之前一直在阅读手册,规格书,练习招式
    的头像 发表于 07-07 08:46 2317次阅读
    基于<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>连接详解

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-设备类驱动框架 (qq.com) 一.前言 从软件顶层,从数据流的角度来看
    的头像 发表于 07-16 15:56 674次阅读
    基于<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驱动开发-数据不能发送问题分析案例

    本文转自公众号欢迎关注 基于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>-数据不能发送问题分析案例

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

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

    使用USB OTG端口作为以太网小工具无法工作是为什么?

    重新启动板的情况下恢复:[46.766872] dwc2 49000000.usb-otg: new device is high-speed[46.771014] dwc2
    发表于 12-09 07:01

    Setup_JlinkARM_V460a驱动程序

    电子发烧友网站提供《Setup_JlinkARM_V460a驱动程序.zip》资料免费下载
    发表于 08-12 11:39 44次下载

    Setup_Jlink_V496最新Jlink驱动

    电子发烧友网站提供《Setup_Jlink_V496最新Jlink驱动.zip》资料免费下载
    发表于 08-13 19:53 198次下载

    VCPDriver_V1.1_Setup

    VCPDriver_V1.1_Setup.exe双击,一路默认确定 安装的时候不要接上USB 装完后插上USB驱动路径选择刚才的安装路径,也可能是那个路径的子路径,那个确定可以点
    发表于 11-24 15:22 74次下载

    Setup_JlinkARM_V402d驱动

    Setup_JlinkARM_V402d v8 驱动 比较兼容 我自己用这个
    发表于 02-29 17:09 20次下载

    抽丝剥茧系列——一个T拓扑

    槽要吐,文章还是要写的。大家知道,做一些layout guide是信号完整性工程师的基本工作之一,layout guide可以说是一些SI规则的物理体现。 抽丝剥茧系列一次解谜经历 抽丝剥茧系列
    发表于 12-26 20:59 800次阅读
    <b class='flag-5'>抽丝剥茧</b>系列——一个T拓扑

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

    本文转自公众号系列文章,欢迎关注 基于DWC2USB驱动开发-USB包详解 (qq.com) 一.前言 前面我们对
    的头像 发表于 07-24 18:04 816次阅读
    基于<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>再论切换到状态阶段<b class='flag-5'>标志</b><b class='flag-5'>DOEPINTn</b>.StsPhseRcvd