printk(KERN_ERR"Failed to create DMA pool\n");return-ENOMEM; }//分配DMA缓冲区void*dma_buffer =dma_pool_alloc(my_dma_pool, flags, NULL);if(!dma_buffer) { printk(KERN_ERR"Failed to allocate DMA buffer\n"); dma_pool_destroy(my_dma_pool);return-ENOMEM; }//使用DMA缓冲区进行数据传输(...
函数dma_pool_create分析如下(在drivers/base/dmapool.c中): 函数dma_pool_alloc从DMA池中分配一块一致内存,其参数pool是将产生块的DMA池,参数mem_flags是GFP_*位掩码,参数handle是指向块的DMA地址,函数dma_pool_alloc返回当前没用的块的内核虚拟地址,并通过handle给出它的DMA地址,如果内存块不能被分配,返回null。
dma_pool 类似于 kmem_cache,但它使用 dma_alloc_coherent(),而不是 __get_free_pages()。此外,它了解对齐的常见硬件约束,例如需要在 N 字节边界上对齐的队列头。 像这样创建一个 dma_pool: struct dma_pool *pool; pool = dma_pool_create(name, dev, size, align, boundary); “name”用于诊断(如km...
dma_pool_create(constchar*name,structdevice *dev, size_tsize,size_talign,size_talloc) dma_pool_create()初始化了一个DMA一致性缓冲区池,用于给定设备的使用。它必须在可以睡眠的上下文中调用。 "name"用于诊断(类似于struct kmem_cache名称);dev和size类似于传递给dma_alloc_coherent()的内容。该类型数据...
此外,由于dma_alloc_coherent()是以page为单位分配内存的,若驱动需要多次分配小于一个page的内存,则可以使用dmapool来实现。由于该接口的功能实现较单一,故此处不再具体介绍,其中以下为其主要接口: (1)dmapool创建接口 struct dma_pool *dmam_pool_create(const char *name, struct device *dev, size_t size, ...
pool=dma_pool_create(name,dev,size,align,boundary); “那么”用于诊断(如 kmem_cache 名称); dev 和 size 如之前的一样。 设备对此类数据的硬件对齐要求是“align”(以字节表示,并且必须是2的幂)。 如果您的设备没有边界穿越限制,则为边界传递 0; 传递 4096 表示从该池分配的内存不得跨越 4KByte 边界...
dma_alloc_coherent/dma_map_single/dma_pool_create 以上这3个函数只是将内核虚拟地址映射得到物理地址 对于物理地址的使用则涉及到DMA控制器的操作了,需要将物理地址填写到DMA控制器的对应寄存器,并启动DMA控制器进行传输。内核对DMA控制器的操作也提供了一些函数。
dma_pool_create(const char *name, struct device *dev, size_t size, size_t align, size_t alloc); create( )函数为设备初始化DMA一致性内存的内存池。它必须要在可睡眠上下文调用。 name为内存池的名字(就像struct kmem_cache name一样)。dev及size就如dma_alloc_coherent()参数一样。align为设备硬件需...
struct dma_pool *dma_pool_create(const char *name, struct device *dev, size_t size, size_t align, size_t allocation); void dma_pool_destroy(struct dma_pool *pool); name是DMA池的名字,dev是device结构,size是从该池中分配的缓冲区的大小,align是该池分配操作所必须遵守的硬件对齐原则(用字节表...
chan->desc_pool = dma_pool_create("xilinx_cdma_desc_pool", chan->dev, sizeof(struct xilinx_cdma_tx_segment), __alignof__(struct xilinx_cdma_tx_segment), 0); } else { chan->desc_pool = dma_pool_create("xilinx_vdma_desc_pool", ...