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

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

3天内不再提示

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

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

本文转自公众号,欢迎关注
基于DWC2的USB驱动开发-DOEP接收相关的DMA寄存器详解 (qq.com)

前言

前面我们详细介绍了发送即DIEP相关的一些寄存器,这一篇我们来看看接收即DOEP相关的一些寄存器。形式上DOEP和DIEP寄存器是类似的。不过我们看寄存器列表会发现DOEP会少一个寄存器DTXFSTSi ,

什么会少这个寄存器呢?

因为接收是所有端点共享一个接收缓冲区的,所以这里就没有DRXFSTSi 这个对应的寄存器来表示每个端点对应的接收缓冲区剩余可用空间了。发送是可以配置为每个端点独占一个缓冲区的所以有对应的寄存器。

虽然POEP少了一个寄存器,但是寄存器偏移地址上,还是和PIEP保持对应关系的,缺的位置还是预留了空间的,这对软件来说比较方便,所以一般IP的设计也要考虑软件的实现是否方便。

图片

这一篇先来介绍DMA相关的寄存器,后面再讲剩余的寄存器,为什么DMA寄存器要单独讲,因为其很重要,了解其是如何设置,如何更新,什么阶段谁拥有等很重要,可以协助调试分析问题,并且DOEP和DIEP的DMA寄存器的行为有些许差异这点调试时是很重要的,所以这里重点讲。

DOEPDMAi

该寄存器的偏移地址是

0xB14 + i*20,虽然端点0的寄存器手册有单独描述,但是其偏移地址还是符合该表达式的,实际描述内容也是重复的。

这样所有的寄存器我们可以使用同样的宏来寻址

#define DOEP_DMA(n) (OTG_BASE + (0xb14 + (n)*0x20))

这也是IP设计寄存器地址设置要考虑的,方便软件编程

我们来看手册的描述
图片

如果是 Scatter/Gather DMA模式则该寄存器设置为描述符链表的地址,否则则设置接收缓冲区的地址,DMA接收到数据自动从RxFIFO搬运到该处。

注意该寄存器必须8字节对齐。

该值在OUT DONE,接收到数据产生中断后,软件可以回读其值,回读的值为设置的值偏移已经处理的描述符或者已经接收的字节数。

注意该寄存器写完后并不能立即回读,此时回读值为之前的值或者默认值,只有OUT DONE中断接收到数据之后才能回读,此时EPena硬件清零,回读的值已经是按照上述描述更新的值。

在软件设置该值(注意此时哪怕EPEna没有置位也是一样的)到OUT DONE中断之前该寄存器由控制器所有,此时软件不能再次写,回读也不能回读出写入的值。只有OUT DONE中断之后EPEna硬件自动清零后才能读会硬件更新的值,注意不是写入值,时硬件根据处理了多少描述符或者接受了多少数据递增后的值。

以下是实例

如下使用OUT端点2 设置

0x81012a0到DOEPDMAi ** ,** 0x81012a0是8字节对齐的,时描述符地址

执行完REG_DOEP_DMA(epnum) = (uint32_t)(pep->dma_addr);后回读DOEPDMAi****的值并没有更新,此时软件不能再写,回读也不能读出设置值

图片

CTL寄存器的EPEna置位,SNAK变为了0表示不再NACK了,准备接收数据了

图片

进入OUT DONE中断再来看

CTL寄存器的EPEna位硬件清零0.表示接收到了数据
图片

此时DOEPDMAi 0x81012a0变为了0x81012a8,因为只有以一个描述符,所以处理完后偏移了8字节。

DOEPDMABi

该寄存器的偏移地址是

0xB1C + i*20

从上面可以看到

0x0000000变为了

0x8100d58

之前是0x0000000是因为设置完后并不能回读,实际的描述中对应的缓冲区是

0x8100d38,0x8100d58-0x8100d38正好是接收到的数据的长度。

图片

总结

DMA相关的两个寄存器非常重要,可以帮助调试,但是要注意写入之后并不能马上回读,也不能再写,需要OUT DONE之后才能回读和重新写,写入该寄存器到OUT DONE中断之前该寄存器都是控制器所有。

审核编辑:汤梓红

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

    关注

    30

    文章

    5037

    浏览量

    117763
  • usb
    usb
    +关注

    关注

    59

    文章

    7437

    浏览量

    258255
  • dma
    dma
    +关注

    关注

    3

    文章

    536

    浏览量

    99068
  • 驱动开发
    +关注

    关注

    0

    文章

    129

    浏览量

    12010
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    98
收藏 人收藏

    评论

    相关推荐

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

    上一篇我们介绍了控制器的寄存器,而驱动的编写底层无非就是配置各种寄存器,所以第一步先要准备寄存器的头文件,对寄存器的操作进行封装。 我们这
    的头像 发表于 05-16 14:04 2006次阅读
    基于<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 952次阅读
    基于<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><b class='flag-5'>详解</b>

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

    前面介绍了DOEPDMA相关寄存器,这一篇继续来讲剩下的寄存器
    的头像 发表于 07-19 10:50 971次阅读
    基于<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'>DOEP</b><b class='flag-5'>接收</b><b class='flag-5'>相关</b>的其他<b class='flag-5'>寄存器</b><b class='flag-5'>详解</b>

    基于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驱动开发-0x05 DWC2 USB2.0 IP 寄存器介绍

    本文对控制器的寄存器有了一个整体上的概览,先了解个大概,了解寄存器的组织结构,大致了解一下常用的寄存器。后面编程时再一个个对照每一个寄存器的描述去编写代码。
    的头像 发表于 05-16 12:50 2049次阅读
    基于<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 1246次阅读
    基于<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驱动开发-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 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>连接<b class='flag-5'>详解</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驱动开发-发送相关寄存器DMA寄存器详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-发送相关寄存器
    的头像 发表于 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>-发送<b class='flag-5'>相关</b>的<b class='flag-5'>寄存器</b><b class='flag-5'>DMA</b><b class='flag-5'>寄存器</b><b class='flag-5'>详解</b>

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

    本篇讲解Scatter/Gather DMA模式下控制传输相关寄存器。控制传输是USB驱动的核心部分,控制传输调通了
    的头像 发表于 07-24 00:07 1308次阅读
    基于<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>

    基于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