Linux驱动之DMA框架(一):DMA框架的基本轮廓

article/2025/11/5 10:31:16

DMA简介

DMA(Direct Memory Access,直接存储区访问),用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据,这样节省的 CPU 资源可供其它操作使用。现代的处理器或者是微控制器都内嵌了DMA控制器,主要负责管理DMA的行为。当我们进行数据传输时,处理器提供源地址、目的地址以及要传输数据的大小给DMA控制器,随后DMA便开始从源地址,不停地搬运数据到目的地址。直到要传输数据的大小为0时,DMA传输结束。
通常来讲,DMA 支持以下三种传输模式:(这里的外设一般指外设的数据寄存器或者FIFO的地址,存储器一般是指片内 SRAM、外部存储器、片内 Flash 等等)

  • 外设到存储器传输:将外设数据寄存器的内容,转移到特定的目标地址,比如使用DMA将摄像头采集的图像数据转移到显存的位置,实现液晶屏幕实时显示摄像头采集的图像;
  • 存储器到外设传输:将目的地址的内容转移至外设的数据寄存器中,常用于外设的发送通信,如串口DMA发送大量数据;
  • 存储器到存储器传输:把一个指定的存储区内容拷贝到另一个存储区空间。功能类似于 C 语言内存拷贝函数 memcpy,利用 DMA 传输可以达到更高的传输效率。

Linux DMA整体轮廓

DMA框架

DMA框架主要分为两个部分:DMA provider、DMA consumer以及DMA核心层。DMA provider,主要包括了各种SOC芯片的DMA控制器驱动代码,通常是由SOC芯片厂商提供;DMA consumer,“人”如其名,主要是用于消费(申请)DMA请求,对于SPI、I2C等控制器,SOC芯片厂商会在其驱动代码中去申请DMA通道,使能DMA传输;而DMA框架中,最为核心的一环,便是DMA核心层,它通过提供公共接口函数,减少了冗余代码之外,使得DMA consumer无须关心底层的变化,也就是说DMA consumer侧的驱动,只要使用了DMA核心层的API,无论你是移植到哪个平台,都能轻松实现DMA传输的功能。

DMA框架的大部分代码都是由Linux内核源码维护者以及芯片厂商进行维护,一般是不需要我们进行修改的。对于DMA控制器驱动,主要是由SOC芯片厂商编写,而DMA consumer中,涉及外设的主要是总线控制器驱动,这些驱动同样是由SOC芯片厂商提供,而存储器到存储器的传输模式,通常我们都使用C库函数memcpy、memset,并不会真的去实现使用DMA进行数据拷贝。

Linux DMA源码目录讲解(内核版本为5.4.47)

针对Linux DMA框架,我们可以把内核源码/driver/dma目录分为三个部分:DMA provider、DMA核心层以及DMA consumer。由于DMA consumer涉及到其它的驱动框架,这里就不一一列举。

DMA provider

目录/文件描述
drivers/dma/bestcomm/*Bestcomm DMA 控制器驱动源码
drivers/dma/dw/*Synopsys AHB DMA 控制器驱动源码
drivers/dma/dw-axi-dmac/*Synopsys AXI DMA 控制器驱动源码
drivers/dma/dw-edma/*Synopsys DesignWare eDMA 控制器驱动源码
drivers/dma/fsl-dpaa2-qdma/*NXP QDMA 控制器驱动源码
drivers/dma/hsu/*hsu(High Speed UART) DMA 核心代码
drivers/dma/ioat/*Intel I/OAT DMA 控制器驱动源码
drivers/dma/ipu/*飞思卡尔 IPU 核心代码
drivers/dma/mediatek/*MediaTek DMA 控制器驱动源码
drivers/dma/ppc4xx/*PPC440SPE ADMA 控制器驱动源码
drivers/dma/pxp/*NXP Pixel Pipeline(图形加速器) 驱动源码
drivers/dma/qcom/*Qualcomm DMA 控制器驱动源码
drivers/dma/sh/*Renesas SuperH DMA 控制器驱动源码
drivers/dma/ti/*Texas Instruments(TI) DMA 控制器驱动源码
drivers/dma/xilinx/*Xilinx DMA 控制器驱动源码
drivers/dma/sh/*Renesas SuperH DMA 控制器驱动源码
drivers/dma/sh/*Renesas SuperH DMA 控制器驱动源码
drivers/dma/imx-sdma.c飞思卡尔 SDMA 控制器核心代码
drivers/dma/stm32-dma.cSTMicroelectronics FDMA 控制器核心代码
drivers/dma/altera-msgdma.cAltera mSGDMA 控制器核心代码
drivers/dma/s3c24xx-dma.cS3C24XX DMA 控制器核心代码

表格中,列举了内核源码中部分目录以及文件的路径和说明,每个文件夹/文件都对应一个SOC芯片的DMA控制器驱动。这部分代码与硬件息息相关。每个文件都定义了对应的DMA控制器的寄存器地址,从设备树解析对应的节点(若支持设备树)、注册DMA 控制器驱动以及配置DMA传输等操作。

DMA核心层

文件描述
drivers/dma/dmaengine.cDMA框架的核心代码,提供硬件无关的接口函数
drivers/dma/of-dma.cDMA框架设备树相关的代码
include/linux/dmaengine.hDMA框架数据结构以及相关接口的头文件

DMA核心层,用于提供与硬件无关的接口函数。对于上层的DMA consumer,它提供了如何请求DMA传输的数据结构和接口;而对于下层的DMA 控制器驱动,则提供如何往Linux内核注册一个DMA设备的接口API,从而更好地实现DMA框架的分层。

总结

本文主要介绍了DMA的基本作用,以及内核源码中driver/dma目录的结构。尤其是DMA框架图,只是简单地介绍了整体的轮廓,对于DMA consumer、DMA provider和DMA核心层之间的相互联系、各个层所用到的数据结构,并没有过多的介绍。


http://chatgpt.dhexx.cn/article/PFpdTACM.shtml

相关文章

DMA概述

目录 传送原理工作方式 DMA即直接存储器存取(Direct Memory Access).用DMA传输数据时,在高速I/O设备与存储器之间直接开辟数据传输通道,此时CPU不再直接参与数据交换,而是通过DMA控制器来管理。 DMA数据传输示意如下: …

10、Random

利用Random类来产生5个20~ 50之间的随机整数。 提示: Random.nextInt(方法的作用是生成一个随机的int值 ,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n。 方法1:int nextInt(int n) import java. util. Rand…

让 RadAsm + masm32 环境支持 Irvine32.lib

学习《汇编语言:基于X86处理器》这本书(或者该书更早版本)的朋友都知道,Irvine32.lib 是该书作者 Kip Irvine 为了汇编初学者而自行设计的一个链接库,它提供了在控制台下简单的输入输出接口。但作者在该书中使用的学习…

RA-Depth

一、论文贡献 1、提出了一种任意尺度的数据增强方法,以促进模型从具有不同尺度的图像中学习深度尺度。 2、开发了一种双高分辨率网络,具有多尺度特征融合,使用新的跨尺度深度一致性损失训练。 二、相关工作 三、方法 3.1参照monodepth2 …

DMA简介

为什么要有 DMA 技术? dma主要是用于读写数据用的 在没有 DMA 技术前,I/O 的过程是这样的: CPU 发出对应的指令给磁盘控制器,然后返回;磁盘控制器收到指令后,于是就开始准备数据,会把数据放入到磁盘控制…

利用RadASM 写汇编程序

本文介绍利用RedASM写一个messageBox “hello world”. RadAsm 是我用过最爽的一个汇编Ide了, 代码高亮,智能提示…… RadASM支持多种不同的汇编编译器,这里我们选择MASM.既然是IDE了,创建工程就很简单了, 文件->Win32 App(no …

srand和rand详细讲解

srand 使用srand引用头文件#include<stdlib.h> 在rand调用之前设置srand&#xff0c;若不设置当rand调用时随机数种子默认为1&#xff0c;随机数种子一样则每次打印出来的值也是一样的。 设置srand srand( (unsigned int )time(NULL) ) 如上所示&#xff0c;我们给一个持…

RadASM with Masm32

1.下载RadASM 从http://www.oby.ro/rad_asm/ 处下载 或http://www.assembly.com.br/ //这个是官网 1.RadASM 2.2.1.6 (09-April-2009) 2.RadASM Assembly programming (07-08-2008) 第一个是编译器 第二个是官网自带的编译配置辅助文件 2.下载MASM 从…

windows10_64位环境下RadAsm的8086汇编语言程序

前言&#xff1a; 当我们在win10环境下使用RadAsm编写汇编时&#xff0c;发现并不能够运行&#xff0c;因为Win64已经废弃了对16位程序的支持&#xff0c;甚至连debug都废除了。而且使用虚拟机太麻烦&#xff0c;有两种解决方案: 方法一&#xff1a;第一种是linux环境下使用命…

在64位系统下,使用 RadASM IDE 写 32 位及 16 位的汇编程序

一&#xff0e; 解压压缩包 二&#xff0e; 打开解压出的文件夹 三&#xff0e; 解压下图两个文件 四&#xff0e; 移动下图的文件夹&#xff08;DOSBox-0.74&#xff09;到你想放置的位置 五&#xff0e; 运行下图程序 下一步 我同意 下一步&#x…

汇编工具安装二:RadASM的安装!

已经配置好的汇编工具下载地址&#xff1a;http://download.csdn.net/detail/sunylat/9189543 RadASM也是一款汇编开发工具&#xff0c;网址&#xff1a;http://www.oby.ro/rad_asm/ 这个工具我也是偶然知道的&#xff0c;今天简单试用了一下&#xff0c;我觉得不错&#xff01…

图解RadASM使用初步

RadASM是一个主要用于Win32汇编的开发工具&#xff0c;也有对其他语言的支持&#xff1b; 此工具提供的方便相当多&#xff1b; 1 安装 2 自带例程 3 部分自带工具 ascii码表 颜色工具&#xff1b; 自带教程&#xff1b; 工具栏制作器&#xff1b; 自带代码片段&#xff1b;…

【汇编语言】汇编实验IDE(集成开发环境):RadASM的安装和使用说明

0 前言 本文适合8086CPU的指令集。 对于重要的专业基础课程&#xff0c;汇编语言&#xff0c;做实验是必不可少的&#xff0c;但是由于汇编语言本身的缺陷&#xff0c;现代计算机并不能直接运行汇编语言程序&#xff0c;因此&#xff0c;一般老师会要求我们 使用虚拟机&…

32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各种声明 那么现在有大神,已经帮我们做了一个IDE环境,就是RadAsm,首先简单介绍一下界面 (对于这…

python3——写文件默认的编码格式 GBK~cp936

用python3写文件的时候没有指定编码模式&#xff0c;其默认使用的是encoding‘cp936’ 微软的CP936通常被视为等同GBK&#xff0c;连 IANA 也以“CP936”为“GBK”之别名。不过实际上 GBK 定义的字符比 CP936 多出95个字&#xff0c;其中包括了15个非汉字及80个汉字。 所以小…

Configuration file contains invalid cp936 characters in C:\Users\xxx\pip\pip.ini.

在按照网上的教程配置过pip.ini之后&#xff0c;使用install命名进行导包&#xff0c;导包不成功&#xff0c;提示这个&#xff1a; Configuration file contains invalid cp936 characters in C:\Users\wangli66\pip\pip.ini. 这是我配置的文件&#xff1a; [global] index…

PL3369CE

PL3369CE是一款原边控制&#xff0c;用于反激式开关电源的恒流/恒压调节器。PL3369CE高度集成了功率开关&#xff0c;并通过去除光耦以及次级控制电路&#xff0c;在简化充电器/适配器等传统的恒流/恒压设计的同时实现了精确的电流和电压调节。PL3369CE的复合模式的应用使芯片能…

TexLive安装报错does not map to cp936

TexLive解压后安装&#xff0c;如果存放在有中文名的文件夹中&#xff0c;就会出现如下报错&#xff1a;xxx does not map to cp936 at xxx/install-menu-extl.pl line 111. in vars section 解决方法&#xff1a;直接将解压好的文件剪切到不含中文的文件夹中&#xff08;比如直…

Configuration file contains invalid cp936 characters in C:\Users\YWX\pip\pip.ini. 已解决!

项目场景&#xff1a; python pip安装国内镜像源报错问题&#xff01; 问题描述 在C:\Users\YWX\pip 配置好镜像源后 在cmd安装出现&#xff1a; 原因分析&#xff1a; 在pip.ini 配置文件里存在注释符号 解决方案&#xff1a; 把注释去掉&#xff0c;保存&#xff01; &g…

ubuntu 截图快捷键设置

转载于:https://www.cnblogs.com/WhiteHorseIsNotHorse/p/8554312.html