dma

What is the difference between DMA-Engine and DMA-Controller?

可紊 提交于 2020-01-21 05:03:25
问题 As mentioned above, what is the difference between a dma engine and a dma-controller (on focus on linux)? When does the linux dma engine come into place? Is this a special device or always part of all periphery devices, which support dma? When browsing the linux source, I found the driver ste_dma40.c. How does any driver uses this engine? 回答1: DMA - Direct memory access. The operation of your driver reading or writing from/to your HW memory without the CPU being involved in it (freeing it to

linux 简单的DMA例程

Deadly 提交于 2020-01-20 03:05:20
一个简单的使用 DMA 例子 示例:下面是一个简单的使用DMA进行传输的驱动程序,它是一个假想的设备,只列出DMA相关的部分来说明驱动程序中如何使用DMA的。 函数dad_transfer是设置DMA对内存buffer的传输操作函数,它使用流式映射将buffer的虚拟地址转换到物理地址,设置好DMA控制器,然后开始传输数据。 int dad_transfer(struct dad_dev *dev, int write, void *buffer, size_t count) { dma_addr_t bus_addr; unsigned long flags; /* Map the buffer for DMA */ dev->dma_dir = (write ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE); dev->dma_size = count; //流式映射,将buffer的虚拟地址转化成物理地址 bus_addr = pci_map_single(dev->pci_dev, buffer, count, dev->dma_dir); dev->dma_addr = bus_addr; //DMA传送的buffer物理地址 //将操作控制写入到DMA控制器寄存器,从而建立起设备 writeb(dev->registers.command

《Linux Device Drivers》第十五章 内存映射和DMA——note

微笑、不失礼 提交于 2020-01-20 03:04:37
简单介绍 很多类型的驱动程序编程都须要了解一些虚拟内存子系统怎样工作的知识 当遇到更为复杂、性能要求更为苛刻的子系统时,本章所讨论的内容迟早都要用到 本章的内容分成三个部分 讲述mmap系统调用的实现过程 讲述怎样跨越边界直接訪问用户空间的内存页 讲述了直接内存訪问(DMA)I/O操作,它使得外设具有直接訪问系统内存的能力 Linux的内存管理 地址类型 Linux是一个虚拟内存系统,这意味着用户程序所使用的地址与硬件使用的物理地址是不等同的 有了虚拟内存,在系统中执行的程序能够分配比物理内存很多其它的内存,甚至一个单独的进程都能拥有比系统物理内存很多其它的虚拟地址空间 以下是一个Linux使用的地址类型列表 用户虚拟地址 这是在用户空间程序所能看到的常规地址 物理地址 该地址在处理器和系统内存之间使用 总线地址 该地址在外围总线和内存之间使用,通常它们与处理器使用的物理地址同样 内核逻辑地址 内核逻辑地址组成了内核的常规地址空间 在大多数体系架构中。逻辑地址和与其相关联的物理地址不同,只在它们之间存在一个固定的偏移量 kmalloc返回的内存就是内核逻辑地址 内核虚拟地址 和内核逻辑地址的同样之处在于。它们都将内核空间的地址映射到物理地址上 内核虚拟地址与物理地址的映射不必是线性的一对一的 全部的逻辑地址都是内核虚拟地址。可是非常多内核虚拟地址不是逻辑地址

第十五章 内存映射和DMA

拜拜、爱过 提交于 2020-01-20 03:03:29
1、mmap设备操作 映射一个设备意味着将用户空间的一段内存与设备内存关联起来。无论何时当程序在分配的地址范围内读写时,实际上访问的就是设备。不是所有的设备都能进行mmap抽象。比如像串口和其他面向流的设备就不能。mmap的另一个限制是:必须以PAGE_SIZE为单位进行映射。 mmap方法是file_operation结构的一部分,并且执行mmap系统调用时将调用该方法。为了执行mmap,驱动程序只需要为该地址范围建立合适的页表,并将vma->vm_ops替换为一系列的新操作即可。 有两种建立页表的方法:使用remap_pfn_range函数一次全部建立,或者通过nopage方法每次建立一个页。 2、执行直接IO访问 如果需要传递的数据量非常大,直接进行数据传输,而不需要额外的从内核空间拷贝数据操作的参与,这将会大大提高速度。使用直接IO并不在任何情况下都能提高性能。设置直接IO的开销很大,而又没有使用IO缓存的优势。比如,使用直接IO需要write系统调用同步执行;否则应用程序将会不知道什么时候能再次使用他的IO缓冲区。在每个写操作完成之前不能停止应用程序,这样会导致关闭程序缓慢,这就是使用直接IO的应用程序也使用异步IO的原因。 在字符设备中执行直接IO是不行的,也是有害的。只有确定设置缓冲IO的开销特别大,才使用直接IO。块设备和网络设备不担心实现直接IO的问题

(原创)DMA在FPGA的应用之我见

坚强是说给别人听的谎言 提交于 2020-01-20 03:02:54
  首先,来做一个简单的实验,利用DMA来实现on-chip-memory和SRAM之间的传输,同时也在做一个关于SRAM不同地址之间的传输。 一、硬件设计   1、首先设计自己的SOPC结构,包括CPU、jtag_uart、sram、sysid、onchip-memory,时钟就用50M即可。都不需要任何的设置。如下图所示:   2、对于QuartusII上顶层文件就不需要有什么可讲的,主要代码如下。 1 Reset_Delay delay1 (.iRST(KEY[0]),.iCLK(CLOCK_50),.oRESET(CPU_RESET)); 2 3 dma_system u0 ( 4 // 1) global signals: 5 .clk_0(CLOCK_50), 6 .reset_n(CPU_RESET), 7 8 // the_sram_0 9 .SRAM_ADDR_from_the_sram_0(SRAM_ADDR),10 .SRAM_CE_N_from_the_sram_0(SRAM_CE_N),11 .SRAM_DQ_to_and_from_the_sram_0(SRAM_DQ),12 .SRAM_LB_N_from_the_sram_0(SRAM_LB_N),13 .SRAM_OE_N_from_the_sram_0(SRAM_OE_N),14 .SRAM_UB

PCIE_DMA实例三:Xilinx 7系列(KC705/VC709)FPGA的EDK仿真

梦想的初衷 提交于 2020-01-20 03:01:17
一:前言 好久没写博客了,前段时间有个朋友加微信请教关于PCIe的一些学习方法。本人也不是专家,只是略知一些皮毛。对于大家反馈的问题未必能一一解答,但一定知无不言。以后我会常来博客园看看,大家可以把问题直接在评论区提出来。这篇博客是应部分网友的要求写的,Xilinx升级到7系列后,原来的pcie ip核trn接口统统转换成了axis接口,这可愁坏了之前用xapp1052的朋友,一下子不好用了,该怎么办?对此我的想法是:如果您两年左右的verilog代码经验,建议您直接使用axis接口,如果您觉得使用不方便,大可在外面再包一层您自己觉得好用的接口。博主公司有这方面的技术积累,但涉及到商业利益,我不能在此出售源代码,如有私下合作,可谈。PCIe_to_RapidIO, PCIe_to_FC, PCIe_to_Enet等各类接口转换都没问题。如果您刚接触PCIe,想要更清楚得理解axis接口的PCIe IP核是如何工作的,那么这篇系统级的博客对您将会非常有用,同时博主也会给出一个用Block_design搭的带有DMA功能的简易EP,大家只要自己写个简单的控制逻辑就可以操作EP端的DMA,对于没有经验的工程师,是一个比较容易的技术迁移。 二:前期准备 1、pcie基础还是要有,尤其是协议部分。推荐一本电子书,很经典,请耐心读它(Addison.Wesley.PCI.Express

DMA、TCM与Cache介绍

末鹿安然 提交于 2020-01-17 12:46:10
【转】https://blog.csdn.net/qq_20880415/article/details/89036066 DMA DMA=Direct Memory Access。这是一种通过硬件实现的数据传输机制。简单的说,就是不在CPU的参与下完成数据的传输。 DMA是一种硬件设备。这种设备的工作原理是这样的: ——首先CPU告诉DMA设备,要有一堆数据需要传输,为了效率而请它出马。(DMA请求) ——DMA收到CPU的消息,开始准备。此时CPU把数据源地址、数据目标地址、传输数据量、传输模式等等参数告诉它。(DMA初始化) ——DMA初始化完,向CPU发送消息“借你的总线用一用,我要开始传输数据了!”(总线出借,DMA启动) ——CPU收到消息后,暂时切断自己与总线的联系。DMA开始传输数据。(DMA数据) ——DMA传输完数据之后,向CPU发送消息“搞定了!总线还给你。”(总线归还) ——CPU说:“干得好!老将出马一个顶俩!辛苦了,你先歇着吧。”DMA设备停止。CPU该干啥干啥。 由于是硬件实现的,所以DMA的速度非常快。快到什么程度呢?在DS上,尤其是数据量非常大的时候,相比于CPU当中介,效率能够提高一百万倍以上。 由于DMA的速度是如此之快,所以大量的数据传输,一般都要求使用DMA。 TCM TCM=Tightly Coupled Memory,是一种高速缓存

【STM32H7教程】第46章 STM32H7的ADC应用之DMA方式多通道采样

那年仲夏 提交于 2020-01-16 15:42:09
完整教程下载地址: http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第46章 STM32H7的ADC应用之DMA方式多通道采样 本章教程为大家讲解ADC+DMA方式的多通道数据采集,实际项目中有一定的使用价值,使用一路ADC就可以采集多个通道的数据。 46.1 初学者重要提示 46.2 ADC稳压基准硬件设计 46.3 ADC驱动设计 46.4 ADC板级支持包(bsp_adc.c) 46.5 ADC驱动移植和使用 46.6 实验例程设计框架 46.7 实验例程说明(MDK) 46.8 实验例程说明(IAR) 46.9 总结 46.1 初学者重要提示 学习本章节前,务必优先学习第44章,需要对ADC的基础知识和HAL库的几个常用API有个认识。 开发板右上角有个跳线帽,可以让ADC的稳压基准接3.3V或者2.5V,本章例子是接到3.3V。 STM32H7的ADC支持偏移校准和线性度校准。如果使用线性度校准的话,特别要注意此贴的问题: http://www.armbbs.cn/forum.php?mod=viewthread&tid=91436 。 ADC的专业术语诠释文档,推荐大家看看: http://www.armbbs.cn/forum.php?mod=viewthread&tid=89414 。

Linux动态DMA映射

爷,独闯天下 提交于 2020-01-16 08:53:33
1. 几种地址类型 虚拟地址   Linux内核使用的地址是虚拟地址,数据类型为void *。例如,kmalloc()和vmalloc()函数返回值就是虚拟地址。 物理地址   处理器真实地址总线上的地址,数据类型为phys_addr_t。   对I/O设备寄存器和内存统一编址的处理器,如ARM/PowerPC,参考手册一般会给出memory map,也就是各种I/O设备的寄存器在物理地址空间的分布。对I/O设备寄存器独立编址的处理器。如X86,访问I/O设备寄存器或内存时,向 地址总线发送地址,并通过控制信号来实现对I/O设备寄存器和内存的不同寻址。这些I/O设备寄存器的地址可以在/proc/iomem中查看,必须使用ioremap()映射到虚拟地址空间才可以使用。 总线地址   从I/O设备的角度看,I/O设备使用的地址是总线地址。DMA使用地址也是总线地址,数据类型为dma_addr_t。对一些简单的系统,设备通过DMA可以直接访问物理地址,但大多数系统都有IOMMU将总线地址转换为物理地址。 2. DMA寻址能力   默认情况下Linux认为设备DMA可以进行32位寻址。必须对DMA mask进行设置,将设备的DMA寻址能力通知内核。 int dma_set_mask_and_coherent(struct device *dev, u64 mask)  

DMA的经典解读

穿精又带淫゛_ 提交于 2020-01-15 16:30:34
Today all computers are architectured the same way: a central processor and a number of peripherals. In order to exchange data, these peripherals are interconnected by a bus over which all communications go. Figure outlines the layout of peripherals in a standard computer. 现在的计算机的架构大概都是下图这样的。 图片发自简书App The first user of the bus is the CPU. The CPU uses the bus to access system memory and other peripherals. However, the CPU is not the only one able to write andread data to the peripherals, the peripherals themselves also have the capability to exchange information directly. In particular, a