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

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

3天内不再提示

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

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

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

一.前言

前面我们对SETUP完成标志DOEPINTn.SetUp进行了详细的分析,该标志用于表明SETUP阶段的完成,数据阶段(无数据阶段则是状态阶段)的开始。我们知道控制传输有三个阶段SETUP阶段,数据阶段,状态阶段,现在我们知道了什么时候由SETUP阶段转数据阶段,那么什么时候数据阶段转状态阶段呢? 这个问题就引出了我们继续这篇文章的分析。

我们发现本系列文章很多都是自然而然地问题引出的,然后针对问题去查找答案,以此来进行USB的学习和开发,相信这种状态是一种很好的状态,甚至很多人会有意犹未竟,追剧的感觉,解决一个问题又冒出一个问题,又促使继续深挖,搞技术就是要如此。

二.DOEPINTn.StsPhseRcvd

之前我们就讲了手册中的如下表格,对应的不同的控制传输的状态,但是当时还是云里雾里不甚理解,上一篇我们抽丝剥茧了解了Setup的含义,这一篇继续来分析StsPhseRcvd,把每一个bit的精确含义理解了,再来理解这个表格就容易了。

还是老规矩我们先来看手册的描述

定义就是StsPhseRcvd表示控制传输切换到了状态阶段。

只有Scatter Gather DMA模式,控制OUT端点有,顺便提一下本系列文章没有单独说明则都是针对Scatter Gather DMA模式。

下面也说明了本标志产生的条件是:控制器接收了控制写传输的数据阶段,主机发过来的所有数据,并搬运到了缓冲区中(注意并不是用户空间中,搬运到用户空间还需要XferCompl来指明,即上述Case D和Case E的区别)。表明主机由数据阶段切换到了状态阶段。

该中断后设备程序可以进行状态阶段的响应了。

这里顺便提一下控制器处理时DOEPINTn.StsPhseRcvd优先级高于DOEPINTn.Setup。

以上的说明还是不够精确,还是协议层面的描述,比如数据阶段切换到状态阶段到底是对应的具体的哪个节点呢,对应的是谁发了什么包之后呢?

编程手册中如下有描述,实际是数据OUT阶段之后,设备收到了IN令牌之后置该位。

是不是很熟悉,原来和Setup的置位原理是差不多的,也是设备端延迟确认。

同样的是因为OUT数据阶段,设备回了ACK之后,主机收没收到ACK,设备并不知道,主机下一步是不是需要重新OUT还是进入状态阶段设备也不知道,所以只能等主机发了IN才知道主机切换到了状态阶段。

如下所示

这里我们还是同样的会有一个疑问,为什么只有控制写的OUT端点有这个标志,为什么控读IN端点没有?

前面我们知道判断Setup完成的标志是,设备在SETUP后收到了OUT或者IN,

如果收到了OUT则表示SETUP阶段完成,开始控制写数据阶段,

如果收到了IN则表示SETUP阶段完成,可能是开始读数据阶段或无数据,直接进入状态阶段。因为是硬件判断的对于IN存在两种情况,所以硬件实际不好判断 ,所以交给软件去判断。

所以对于这几种模式软件操作流程如下:

所以对于控制读操作,SETUP完成后,软件就需要同时准备好OUT描述符以接收状态包,同时准备IN描述符以发送数据。数据和状态同时处理。

SETUP阶段 -> 数据和状态

对于控制写操作,SETUP完成后,软件准备OUT描述符以接收数据,StsPhseRcvd中断后再准备IN描述符发送状态包。数据阶段和状态阶段分开处理。

SETUP阶段-> 数据阶段 -> 状态阶段

对于无数据控制传输

SETUP完成后,准备IN描述符准备发送状态包。

SETUP阶段- -> 状态阶段

三.DOEPINTn.XferCompl/DIEPINTn.XferCompl

分别表示IN和OUT描述符已经被DMA处理,即RxFIFO的内容搬运到了用户空间,或者用户空间数据搬运到了TxFIFO。

注意这里DMA处理完和实际总线上数据发送和接收是两码事。

比如对于IN端点,XferCompl完成,只是表示用户数据搬运到了TxFIFO中,

下一次IN令牌,硬件才从TxFIFO中取出数据发送到总线上去。

这里注意如果TxFIFO中还有残留的之前的数据,则本次搬运到TxFIFO的数据还不会发送,要等后续的IN才会发送。

所以一般这里需要先Flush掉TxFIFO,保证下一次IN发送的就是本次的数据。

四. **DIEPINTn.INTknTX****FEmp /DOEPINTn.OUTTknEPdis **

五.驱动编写注意事项

设备软件必须等到StsPhseRcvd中断即主机发了IN才能切换到状态阶段,准备IN描述符准备发0长包。因为如果主机不发IN则主机可能还在数据阶段,此时设备并不能确认下一包就是IN。

同样的因为设备确认有滞后,实际是在IN令牌后才能进该中断,确认主机进入了状态阶段,所以对于该IN硬件是自动NAK的,

所以中断服务函数中软件除了EPEna之外还要CNAK,以在后续IN中硬件根据新设置的IN描述符响应状态包(0长包)。

注意IN端点,及时Flush掉TxFIFO,保证下一次IN,传输的是本次设置的IN描述符对应的数据。

六.总结

以上对DOEPINTn.StsPhseRcvd进行了详细的解析,和Setup原理基本类似,同时也介绍了其他一些相关中断位。

审核编辑 黄宇

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

    关注

    60

    文章

    7907

    浏览量

    264124
  • 驱动开发
    +关注

    关注

    0

    文章

    130

    浏览量

    12067
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    120
收藏 人收藏

    评论

    相关推荐

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

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2 USB2
    的头像 发表于 05-08 18:10 4523次阅读
    基于<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 9149次阅读
    基于<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 5.3w次阅读
    基于<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 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 3600次阅读
    基于<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-10 17:12 1343次阅读
    基于<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 1288次阅读
    基于<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,对应IN端点,和发送数据相关,这一篇先介绍和
    的头像 发表于 07-16 16:42 1596次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-发送相关的寄存器DMA寄存器详解

    基于DWC2USB驱动开发-USB包详解

    不管什么通讯协议,比如UART,SPI,USB等等,不管是并口还是串口,不管是同步还是异步,我们从抽象的角度去看,其本质都是一样的。都是先定义物理信号,物理信号可能是差分,单端,电流驱动电压驱动等等
    的头像 发表于 07-23 17:11 2500次阅读
    基于<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驱动开发-抽丝剥茧SETUP完成标志DOEPINTn.SetUp

    Setup是DOEPINTn寄存器中的一个标志,用于表示Setup阶段是否完成。
    的头像 发表于 07-24 15:57 1754次阅读
    基于<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'>论</b>SETUP完成<b class='flag-5'>标志</b><b class='flag-5'>DOEPINTn</b>.SetUp

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

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-数据不能发送问题分析案例 (qq.com)   一.前言        对于驱动
    的头像 发表于 08-08 09:43 2173次阅读
    基于<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的连接方式和配置说明

    判断切换为何种模式,ID脚的电平变化触发控制器ID脚中断,然后由软件切换到对应模式。目前使用两种驱动版本,一个是upstream 版,驱动dwc2
    发表于 05-12 17:46

    如何实现rk3288 otg模式切换的设计呢

    的电平来切换模式的,OTG_ID 脚电平变化触发控制器的ID脚中断,然后由软件来切换模式。由这个描述,可以认为之前修改思路是可以的。二、软件是如何切换的?rk3288的SDK中提供了两套驱动
    发表于 05-24 10:54

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

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

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

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