dma

ARM数据/地址总线架构简析

霸气de小男生 提交于 2019-12-21 20:01:20
ARM架构简析 1,ARM概述 现在大家讲的ARM的概念实际上是很模糊的,他可能指的是一类芯片,或者指的是ARM公司,亦或者是精简指令集,还是千万人手中的饭碗。下面引用一段关于百度百科关于ARM的准确描述 ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)处理器架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的OMAP系列。 ARM家族占比所有32位嵌入式处理器的75%,成为占全世界最多数的32位架构。 在1980年代晚期,苹果电脑开始与Acorn合作开发新版的ARM核心,由于这专案非常重要,Acorn甚至于1990年将设计团队另组成一间名为安谋国际科技(Advanced RISC Machines Ltd.)的新公司。也基于这原因,使得ARM有时候反而称作Advanced RISC Machine而不是Acorn RISC Machine。由于其母公司ARM Holdings plc于1998年的伦敦交易市场和NASDAQ挂牌上市[1],使得Advanced RISC Machines成了ARM Ltd旗下拥有的产品。 这个专案到后来进入了ARM6,首版的式样在1991年释出,然后苹果电脑使用ARM6架构的ARM

Allocating a large DMA buffer

ぐ巨炮叔叔 提交于 2019-12-21 12:23:18
问题 I want to allocate a large DMA buffer, about 40 MB in size. When I use dma_alloc_coherent() , it fails and what I see is: ------------[ cut here ]------------ WARNING: at mm/page_alloc.c:2106 __alloc_pages_nodemask+0x1dc/0x788() Modules linked in: [<8004799c>] (unwind_backtrace+0x0/0xf8) from [<80078ae4>] (warn_slowpath_common+0x4c/0x64) [<80078ae4>] (warn_slowpath_common+0x4c/0x64) from [<80078b18>] (warn_slowpath_null+0x1c/0x24) [<80078b18>] (warn_slowpath_null+0x1c/0x24) from [<800dfbd0>]

Linux kernel device driver to DMA into kernel space

为君一笑 提交于 2019-12-20 12:39:10
问题 LDD3 (p:453) demos dma_map_single using a buffer passed in as a parameter. bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count, dev->dma_dir); Q1 : What/where does this buffer come from? kmalloc ? Q2 : Why does DMA-API-HOWTO.txt state I can use raw kmalloc to DMA into? Form http://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt L:51 If you acquired your memory via the page allocator kmalloc() then you may DMA to/from that memory using the addresses returned from those routines

How to get linux kernel page size programmatically

走远了吗. 提交于 2019-12-20 09:28:18
问题 I am working on a Linux module for IA64. My current problem is that the driver uses the PAGE_SIZE and PAGE_SHIFT macros for dma page allocation. The problem I am having is that the machine compiling the driver is not the ones that needed to run the driver. So, if the PAGE_SIZE on the compiling machine is 2^14K and the destination machine is 2^16K then the driver fails. I don't want to turn this question into a 'best practice' issue about compiling modules on machines which are not the ones

DMA控制器

拜拜、爱过 提交于 2019-12-20 08:58:33
DMA控制器依赖于平台硬件,这里只对i386的8237 DMA控制器做简单的说明,它有两个控制器,8个通道,具体说明如下: 控制器1: 通道0-3,字节操作, 端口为 00-1F 控制器2: 通道 4-7, 字操作, 端口咪 C0-DF - 所有寄存器是8 bit,与传输大小无关。 - 通道 4 被用来将控制器1与控制器2级联起来。 - 通道 0-3 是字节操作,地址/计数都是字节的。 - 通道 5-7 是字操作,地址/计数都是以字为单位的。 - 传输器对于(0-3通道)必须不超过64K的物理边界,对于5-7必须不超过128K边界。 - 对于5-7通道page registers 不用数据 bit 0, 代表128K页 - 对于0-3通道page registers 使用 bit 0, 表示 64K页 DMA 传输器限制在低于16M物理内存里。装入寄存器的地址必须是物理地址,而不是逻辑地址。 对于0-3通道来说地址对寄存器的映射如下: A23 ... A16 A15 ... A8 A7 ... A0 (物理地址) | ... | | ... | | ... | | ... | | ... | | ... | | ... | | ... | | ... | P7 ... P0 A7 ... A0 A7 ... A0 | Page | Addr MSB | Addr LSB |

arm smmu 学习(1)

南笙酒味 提交于 2019-12-19 16:03:45
文章linux 4.14 代码分析smmu 流程 linux 在驱动找到对应的设备后会执行driver_probe_device 函数,具体dev和drv 匹配参考文章 链接 driver_probe_device->really_probe->dma_configure->of_dma_configure int of_dma_configure(struct device *dev, struct device_node *np) { const struct iommu_ops *iommu; 省略部分代码 iommu = of_iommu_configure(dev, np); if (IS_ERR(iommu) && PTR_ERR(iommu) == -EPROBE_DEFER) return -EPROBE_DEFER; dev_dbg(dev, "device is%sbehind an iommu\n", iommu ? " " : " not "); arch_setup_dma_ops(dev, dma_addr, size, iommu, coherent); return 0; } 通过of_iommu_configure 获取到了iommu 的操作函数集,arch_setup_dma_ops 设置了dev->dma_ops 决定了dma api

STM32 DMA传输笔记(HAL库版)

拟墨画扇 提交于 2019-12-19 07:26:56
DMA,全称为:Direct Memory Access,即直接存储器访问。 DMA传输方式无需CPU 直接控制传输 ,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。 一、DMA请求映像   STM32F10x有两个DMA控制器,使用DMA控制器可使数据从存储器到存储器、存储器到外设、外设到存储器。每个控制器有若干通道,参考《STM32参考手册》,各通道请求一览如下图: 二、DMA初始化    1、使能DMA时钟 __HAL_RCC_DMA1_CLK_ENABLE(); //DMA1时钟使能    2、关联DMA与UART1 DMA_HandleTypeDef UART1TxDMA_Handler; //DMA句柄 __HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler); //将DMA与USART1联系起来(发送DMA)    3、配置DMA句柄 //Tx DMA配置 UART1TxDMA_Handler.Instance=chx; //通道选择 通道4指的是UART1Tx UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设 /*由于是从存储器读数据给外设

Memory alignment of arrays

不羁的心 提交于 2019-12-18 07:43:36
问题 I am having trouble aligning memory for DMA transfer on the Cell processor. I need the last 4 bits of an address to be 0. I have 4 arrays of unsigned int where each element must be aligned in memory so that its (hex) adress ends with a zero. E.g. int main() { size_t i; static unsigned int a[2] __attribute__ ((aligned (16))); static unsigned int b[2] __attribute__ ((aligned (16))); static unsigned int c[2] __attribute__ ((aligned (16))); static unsigned int d[2] __attribute__ ((aligned (16)));

【计算机组成原理】 输入/输出系统

依然范特西╮ 提交于 2019-12-18 02:35:31
I/O 系统基本概念 I/O 系统中的几个基本概念如下: 外部设备。包括输入/输出设备及通过输入。输出接口才能访问的外存储结构。 接口。在各个外设与主机之间传输数据时进行各种协调工作的逻辑部件。协调包括传输过程中速度的匹配、电平和格式转换等。 输入设备,用于向计算机系统输入命令和文本、数据等信息的部件。键盘和鼠标是最基本的输入设备。 输出设备。用于将计算机系统中的信息输出到计算机外部进行显示、交换等的部件。显示器和打印机是最基本的输出设备。 外存设备。指除计算机内存及 CPU 缓存等外的存储器。硬磁盘、光盘等是最基本的外存设备。 一般来说,I/O 系统由 I/O 软件和 I/O 硬件两部分构成: I/O 软件。包括驱动程序、用户程序、管理程序、升级补丁等。通常采用 I/O 指令和通道指令实现 CPU 与 I/O 设备的信息交换。 I/O 硬件。包括外部设备、设备控制器和接口、I/O 总线等。通过设备控制器来控制 I/O 设备的具体动作:通过 I/O 接口与主机(总线)相连。 在输入/输出系统中,经常需要进行大量的数据传输,而传输过程中有各种不同的 I/O 控制方式,基本的控制方式有以下 4 种: 程序查询方式。由 CPU 通过程序不断查询 I/O 设备是否已经做好准备,从而控制 I/O 设备与主机交换信息。 程序中断方式。只在 I/O 设备准备就绪并向 CPU

DMA详解

佐手、 提交于 2019-12-18 00:27:47
1、DMA由来 DMA(Direct Memory Access,直接存储器访问)。在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式、中断传送方式。CPU是通过系统总线与其他部件连接并进行数据传输。 1.1程序传送方式 程序传送方式是指直接在程序控制下进行数据的输入/输出操作。分为无条件传送方式和查询(条件传送方式)两种。 1.1.1无条件传送方式 微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备好接收CPU送来的数据,这样,在CPU需要同外设交换信息时,就能够用IN或OUT指令直接对这些外设进行输入/输出操作。由于在这种方式下CPU对外设进行输入/输出操作时无需考虑外设的状态,故称之为无条件传送方式。 1.1.2查询(有条件)传送方式 查询传送也称为条件传送,是指在执行输入指令(IN)或输出指令(OUT)前,要先查询相应设备的状态,当输入设备处于准备好状态、输出设备处于空闲状态时,CPU才执行输入/输出指令与外设交换信息。为此,接口电路中既要有数据端口,还要有状态端口。 1.2中断传送方式 中断传送方式是指当外设需要与CPU进行信息交换时,由外设向CPU发出请求信号,使CPU暂停正在执行的程序,转而去执行数据输入/输出操作,待数据传送结束后,CPU再继续执行被暂停的程序