dma_addr_t dma_handle; cpu_addr = dma_alloc_coherent(dev, size, &dma_handle, gfp); 这个函数返回两个值,其中cpu_addr是虚拟地址,CPU可以通过这个地址来访问这段buffer,另外一个dma_handle物理地址,可以传递给DMA engine。 这里分配的大小以 PAGE_SIZE为单位。 另外这个函数会调用alloc_page()来分配物理...
count, page_order, gfp & __GFP_NOWARN); if (page && !dma_coherent_ok(dev, page_to_phys(page), size)) { dma_release_from_contiguous(dev, page, count); page = NULL; } }
dma_free_coherent(NULL, SDMA_BUF_SIZE, rbuf, rpaddr);return0; } ssize_t sdma_read (structfile *filp,char__user * buf, size_t count, loff_t *offset) {inti; wait_for_completion(&dma_m2m_ok);for(i=0; i<SDMA_BUF_SIZE; i++) { printk("src_data_%d = %x\n",i, *(wbuf+i...
实际上一致性DMA映射中的那个Consistent实际上可以称为coherent,即cache coherent。 缺省情况下,coherent mask被设定为低32 bit(0xFFFFFFFF),即便缺省值是OK了,我们也建议你通过接口在驱动中设定coherent mask。 一般使用Consistent DMA mapping的场景包括: (1)网卡驱动和网卡DMA控制器往往是通过一些内存中的描述符(形成...
dma-coherent; status = "okay"; }; 3、device-tree.bbappend SRC_URI += "file://system-user.dtsi" SRC_URI += "file://pl-custom.dtsi" 4、teminal petalinux-create -t modules -n xilinx-axidma --enable 5、github上下载dma驱动,xilinx_axidma-master.zip 并解压,由于内核的改变,对下列部分...
/*该函数禁止cache缓存以及禁止写入缓冲区*/void*dma_alloc_coherent(struct device*dev,size_t size,dma_addr_t*handle,gfp_t gfp);//分配DMA缓存区,返回值和参数和上面的函数一直 3) 代码语言:javascript 代码运行次数:0 复制 Cloud Studio代码运行 ...
一致分配的设置是通过调用dma_set_coherent_mask()来执行的 intdma_set_coherent_mask(struct device*dev,u64 mask); 这里,dev 是指向设备的设备结构的指针,mask 是描述设备支持的地址的哪些位的位掩码。 通常,设备的设备结构嵌入在设备的总线特定设备结构中。 例如,&pdev->dev 是指向 PCI 设备的设备结构的指...
int dma_set_coherent_mask(struct device *dev, u64 mask); 在这里,dev 是指向设备的设备结构的指针,而 mask 是一个位掩码,描述了您的设备支持的地址位。通常,设备的设备结构嵌入在设备的总线特定设备结构中。例如,&pdev->dev 是指向 PCI 设备的设备结构的指针(pdev 是指向您设备的 PCI 设备结构的指针)...
5、dma_alloc_coherent DMA要求使用non-cached, 物理地址连续的内存。 将对应的内核虚拟地址转化为物理地址,供给后面的s3c2410_dma_enqueue函数使用。 6、int s3c2410_dma_enqueue(unsigned int channel, void *id, dma_addr_t data, int size) 7、int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan...
void * dmam_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t gfp) int ata_port_start(struct ata_port *ap) 该函数处理了缓冲区的分配和映射,返回值是缓冲区的内核虚拟地址,被驱动程序使用,dma_handle保存了相关的总线地址,该函数对分配的缓冲区做了一些处理,从而缓冲...