dma驱动】的更多相关文章

之前没有接触过DMA驱动.不了解它的原理,稍作学习先总结下dma驱动步骤: 1. 申请DMA中断. 2. 申请内存空间作为src和dts的空间. 3. 注册设备注册节点 4. 将申请到的src和dst内存空间地址的指针,映射到dma设备.ioremap 所以应用程序就是 直接打开节点,读数据. 代码日后看缘分上不上 内网见谅…
一.DMA简介 DMA(Direct Memory Access,直接内存存取),DMA传输将数据从一个地址空间复制到另外一个地址空间.传输过程由DMA控制器独立完成,它并没有拖延CPU的工作,可以让CPU效率提高. 既然DMA用于传输,那么就需要具备传输三要素:源.目的.长度.在传输完成后,DMA会通过产生中断的方式汇报. 由于DMA不使用页表机制,因此必须分配连续的物理内存,这一点需要我们注意,我们可以使用dma_alloc_writecombine()或dma_alloc_coherent…
DMA(Direct Memory Access) 即直接存储器访问, DMA 传输方式无需 CPU 直接控制传输,通过硬件为 RAM .I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高. 学了这么多驱动,不难推出DMA的编写套路: 1)注册DMA中断,分配缓冲区 2)注册字符设备,并提供文件操作集合fops -> 2.1)file_operations里设置DMA硬件相关操作,来启动DMA 由于我们是用字符设备的测试方法测试的,而本例子只是用两个地址之间的拷贝来演示DMA的…
将 DMA 抽象为一个字符设备,在初始化函数中调用 void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp) 函数来分配两段物理地址连续的空间,一段作为源空间,一段作为目的空间. 然后将物理地址进行 ioremap 供驱动使用,最后调用 register_chrdev 来注册这个字符设备. DMA 的 regs: #define DMA0_BASE_ADDR 0x4B0…
框架入口源文件:dma.c (可根据入口源文件,再按着框架到内核走一遍) 内核版本:linux_2.6.22.6    硬件平台:JZ2440 以下是驱动框架: 以下是驱动代码  dma.c : #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/delay.h> #inc…
1. 分配源地址.目的地址 src_addr = dma_alloc_writecombine(NULL,BUFF_SIZE, &psrc_addr,GFP_KERNEL); dst_addr = dma_alloc_writecombine(NULL,BUFF_SIZE, &pdst_addr,GFP_KERNEL); 函数里面是源和目的的物理地址,函数返回的是源和目的的虚拟地址. 2. 源和目的的内存释放 dma_free_writecombine(NULL, BUFF_SIZE,sr…
/* *参考arch/arm/mach-s3c24xx/dma-s3c2410.c */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/irq.h> #include <asm/uaccess.h&g…
http://www.crifan.com/files/doc/docbook/dma_pl08x_analysis/release/html/dma_pl08x_analysis.html#idp2003632…
http://xilinx.eetrend.com/blog/10760 http://xilinx.eetrend.com/blog/10787…
1. 此文目的记录笔者对ARM的PL08x的DMA驱动PL08x.c理解.给其他不熟悉此DMA驱动的读者一点借鉴和参考.2. 适合读者你已经具备一定驱动编程能力,知道一些最基本的概念,比如用于输出输出数据的设备的FIFO等,一般设备所具有的比如DATA等寄存器希望对ARM的PL080的DMA驱动的工作流程有深入的了解,希望知道如何使用此DMA驱动 http://pan.baidu.com/s/1hqmPetQ…