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

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

3天内不再提示

基于DWC2的USB驱动开发-控制传输中断相关寄存器

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

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

一.前言

本篇讲解Scatter/Gather DMA模式下控制传输相关的寄存器。控制传输是USB驱动的核心部分,控制传输调通了驱动就完成了一大半,而驱动的核心又是中断的处理。

二.控制传输相关的DMA描述符

Scatter/Gather DMA模式的优点是可以提供一个描述符链表,一次处理更多的数据,控制器自动去索引描述符链表,进行相应的DMA处理。而Buffer DMA模式一次只能处理一个DMA操作。

来简单回顾下控制传输,控制传输包括

Setup,Data,Status三个阶段,不是所有情况都需要包括三种阶段,存在无数据阶段的控制传输。

存在三种可能

控制写

控制读

无数据的控制传输,2阶段控制传输。

控制传输需要准备以下几种描述符

2.1.SETUP

为了接收最多可能存在的3个连续的SETUP包,所以需要准备一个描述符链表包括3个描述符。该描述符也可以用于接收控制读传输主机发送的状态包(0长包)。

该描述符链表的前面两个还可以作为ping-pong提高接收效率。

第三个描述符,初始化为空,最终设置为以接收在数据和状态阶段主机又异常发了SETUP。

图片

2.2IN

图片

2.3OUT

图片

三.控制传输相关的中断处理

3.1相关寄存器

首先我们来看和中断相关的一些寄存器,控制传输对应的就是端点0所以和其他端点其实是一样的,只不过其多了一些比如SETUP等状态而已。

首先我们来看相关的寄存器

首先全局的:GAHBCFG寄存器的bit0 GlblIntrMsk作为全局中断的总开关,置位使能总中断。

然后寄存器GINTMSK/2的bit19,bit18,OEPIntMsk和IEPIntMsk作为所有的OUT和IN端点的中断使能,对应的状态寄存器是GINTSTS/2。

然后DIEPMSK和DOEPMSK控制所有的OUT和IN端点的中断类型,哪些使能。

对应的状态寄存器是DIEPINTi 和DOEPINTi。

最后DAINTMSK控制某一个端点是否使能中断。对应的状态寄存器是DAINT。

注意

DIEPMSK和DOEPMSK是对所有端点的配置,不能对某一个端点使能某些类型中断,对另外一个端点使能其他类型的中断。

以上形成了金字塔式的总分式,层层控制的中断开关控制

而中断的处理顺序是层层解析的方式,先通过

DAINT查看是哪个端点产生的中断,然后通过DIEPINTi 和DOEPINTi确认对应端点具体的中断类型。

DAINT的标志的置位和清除是跟着DIEPINTi 和DOEPINTi变化的,该寄存器软件只读。对应DIEPINTi 和DOEPINTi寄存器有标志置位则该寄存器对应位置位,DIEPINTi 和DOEPINTi寄存器所有标志位清除则该寄存器对应位清除。

而GINTSTS.OEPInt和GINTSTS.IEPInt是跟着DAINT的状态走的,软件也是只读的,DAINT对应位有置为则该位置位,DAINT中对应所有寄存器都清零,则该位也清零。

DIEPINTi 和DOEPINTi寄存器的标志都是写1清零。所以对于IN和OUT中断的标志清除,只需要对这两个寄存器对应位写1清零即可。DAINT和GINTSTS.OEPInt和GINTSTS.IEPInt是根据上述寄存器状态硬件清除无需软件手动清。

对比DIEPMSK和DIEPINTi可知,DIEP的NYET,Bble,PktDrp,TxFEmp是不受MASK控制的。

图片

对比DOEPMSK和DOEPINTi可知,DOEP的StupPktRcvd,PktDrpSts是不受MASK控制的。

图片

对比如IN和OUT中断类型有一些相同的,有一些不一样的,比如OUT多了Setup等。

图片

拓扑结构如下

图片

3.2中断处理

前面提到控制传输对应端点0,和其他端点没什么本质区别。其中断状态主要关注

DIEPINTn和DOEPINTn两个寄存器以确定具体的中断类型。

前面回顾了控制传输有3个阶段,所以对于驱动编写来说重点要知道当前处于什么阶段以决定下一步软件要怎么做,所以软件一般使用状态机记录当前状态然后根据中断标志确定下一个阶段。从上面可以看到DIEPINTn和DOEPINTn两个寄存器有很多的中断类型,并不是所有的都和控制传输的阶段有关的,控制器设计时就考虑到了这一点,尽量精简标志的逻辑,通过尽可能少的标志组合可以确定当前阶段。

手册《10.3.1 Interrupt Handling》中做了一个总结,

软件只需要关心以下标志即可

DIEPINTn.XferCompl 如果描述符中IOC设置,表示IN端点对应的描述符处理完

DIEPINTn.InTknTxfEmp TxFIFO空时收到了主机发的IN令牌,此时设备没有数据可回

DOEPINTn.XferCompl 如果描述符中IOC设置,表示OUT端点对应的描述符处理完

DOEPINTn.SetUp 表示控制器在Setup包后收到了IN和OUT令牌。

DOEPINTn.StsPhseRcvd 控制写传输主机切换到了状态阶段,此时设备需要发状态包(0长包)

当控制器看到需要为OUT端点设置多个中断位时,控制器会对这些中断设置进行一些优化,减少中断的有效组合的数量,以简化应用程序处理。

控制器对中断处理的优先级如下

DOEPINTn.XferCompl>DOEPINTn.StsPhseRcvd(SI)>DOEPINTon.SetUp.

基于此,应用程序只需要解码下表中所示的OUT端点的中断组合:

场景StsPhseRcvd (SI)SetUp (SPD)XferCompl (IOC)说明
A001控制器更新了描述符,软件需要查询描述符的SR位以确定数据是SETUP包还是OUT传输的数据。
B010前面收到了SETUP包且Setup阶段完成,即收到了Setup包的内容。
C011控制器更新了描述符,对应Setup包。且Setup阶段完成。
D100控制OUT传输,主机切换到了状态阶段。
E101在A的基础上且主机切换到了控制写的状态阶段,即D+A.

总结一下就是B和C确定当前处于Setup完成阶段,根据Setup包内容软件决定后面是发数据还是读数据,还是回状态包(无数据)。

D和E确定当前处于控制写的状态阶段,设备需要回0长包。

A需要根据描述符的SR位以确定当前是收到的SETUP包还是OUT数据包。

四.总结

本篇重点介绍了中断相关寄存器,以及OUT端点相关中断的组合以确定当前处于控制传输的什么阶段。两者都是驱动编写的重点需要理解的内容。下一篇我们继续介绍控制传输,软件的编写。

审核编辑:汤梓红

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

    关注

    31

    文章

    5308

    浏览量

    119975
  • usb
    usb
    +关注

    关注

    60

    文章

    7888

    浏览量

    263914
  • 编程
    +关注

    关注

    88

    文章

    3587

    浏览量

    93576
  • 中断
    +关注

    关注

    5

    文章

    895

    浏览量

    41382
  • 开发板
    +关注

    关注

    25

    文章

    4933

    浏览量

    97157
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68319
  • 单板计算机
    +关注

    关注

    0

    文章

    74

    浏览量

    15610
  • 编译
    +关注

    关注

    0

    文章

    652

    浏览量

    32799
  • 驱动开发
    +关注

    关注

    0

    文章

    130

    浏览量

    12061
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    119
收藏 人收藏

    评论

    相关推荐

    基于DWC2USB驱动开发-0x06 DWC2 USB2.0 IP 头文件与寄存器的读写操作

    上一篇我们介绍了控制器寄存器,而驱动的编写底层无非就是配置各种寄存器,所以第一步先要准备寄存器的头文件,对
    的头像 发表于 05-16 14:04 2363次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x06 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP 头文件与<b class='flag-5'>寄存器</b>的读写操作

    基于DWC2USB驱动开发-IN端点发送相关寄存器详解

    上一篇我们介绍了IN端点,发送,DMA相关的两个寄存器,这一篇继续讲另外的几个寄存器
    的头像 发表于 07-17 07:41 1725次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-IN端点发送<b class='flag-5'>相关</b>的<b class='flag-5'>寄存器</b>详解

    基于DWC2USB驱动开发-DOEP接收相关的其他寄存器详解

    前面介绍了DOEP的DMA相关寄存器,这一篇继续来讲剩下的寄存器
    的头像 发表于 07-19 10:50 1442次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-DOEP接收<b class='flag-5'>相关</b>的其他<b class='flag-5'>寄存器</b>详解

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

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

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

    DWC2即新思(Synopsys )的DesignWare® Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。从linux的内核源码驱动
    的头像 发表于 05-09 10:09 9031次阅读
    基于<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驱动开发-0x05 DWC2 USB2.0 IP 寄存器介绍

    本文对控制器寄存器有了一个整体上的概览,先了解个大概,了解寄存器的组织结构,大致了解一下常用的寄存器。后面编程时再一个个对照每一个寄存器
    的头像 发表于 05-16 12:50 3160次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x05 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP <b class='flag-5'>寄存器</b>介绍

    基于DWC2USB驱动开发-0x0D PHY寄存器读写代码编写与测试

    我们前面重点介绍了ULPI接口和PHY的寄存器,这一篇来进行PHY寄存器读写的代码编写与测试。从这一篇开始就正真进入了驱动编写的过程了。
    的头像 发表于 06-06 13:03 2143次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x0D PHY<b class='flag-5'>寄存器</b>读写代码编写与测试

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

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-USB复位详解 (qq.com) 一.前言          上一篇我们详细介绍了
    的头像 发表于 07-07 11:18 5.7w次阅读
    基于<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 3550次阅读
    基于<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 1276次阅读
    基于<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
    的头像 发表于 07-16 16:42 1575次阅读
    基于<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>DMA<b class='flag-5'>寄存器</b>详解

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

    前面我们详细介绍了发送即DIEP相关的一些寄存器,这一篇我们来看看接收即DOEP相关的一些寄存器。形式上DOEP和DIEP寄存器是类似的。不
    的头像 发表于 07-19 09:00 1202次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-DOEP接收<b class='flag-5'>相关</b>的DMA<b class='flag-5'>寄存器</b>详解

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

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

    51单片机与中断相关寄存器

    51单片机与中断相关寄存器简介中断控制寄存器IE中断
    发表于 11-12 11:36 8次下载
    51单片机与<b class='flag-5'>中断</b><b class='flag-5'>相关</b>的<b class='flag-5'>寄存器</b>