1. 通道控制函数 其实就是这三个 /* * DMA通道控制函数 * 功能: 控制DMA通道的暂停、恢复和终止操作。 */ static int hc_dma_pause(struct dma_chan *chan) { return 0; // 返回成功 } static int hc_dma_resume(struct dma_chan *chan) { return 0; // 返回成功 } static int hc_dma_termina...
void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle) 1. 2. 3. 函数dma_pool_alloc原型分析: 此函数成功时返回从DMA池中获取的内存块的地址,失败时返回NULL; 参数pool为创建DMA池时返回的结构体指针,由于SylixOS没有提供该结构,因此在替换过程中接口返回值做了修改; 参...
调用dma_alloc_coherent函数获得的映射,可能其最小大小为单个页。如果需要使用DMA池,需要调用dma_pool_create函数创建DMA池,再通过dma_pool_alloc函数从池中分配内存。使用完之后,需要调用dma_pool_destroy函数销毁DMA池。 以上信息仅供参考,建议查阅关于dma_alloc_coherent的书籍或者咨询技术人员,以获取更准确的信息。
pr_info("\nTesting dma_pool_alloc()...\n\n"); mypool = dma_pool_create("mypool", NULL, pool_size, pool_align, 0); kbuf = dma_pool_alloc(mypool, GFP_KERNEL, &handle); output(kbuf, handle, size, "This is the dma_pool_alloc() string"); dma_pool_free(mypool, kbuf, handl...
所以要实现的函数为: static int hc_dma_alloc_chan_resources(struct dma_chan *chan); static void hc_dma_free_chan_resources(struct dma_chan *chan); static int hc_dma_config(struct dma_chan *chan, struct dma_slave_config *config); static struct dma_async_tx_descriptor *hc_dma_prep_dma_...
struct dma_pool * 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()参数一...
其中pool 是传递给 dma_pool_alloc() 的内容,cpu_addr 和 dma_handle 是 dma_pool_alloc() 返回的值。 该函数可以在中断上下文中调用 销毁dma_pool: 代码语言:javascript 复制 dma_pool_destroy(pool); 确保在销毁池之前已为从池分配的所有内存调用 dma_pool_free()。 该函数不能在中断上下文中调用 ...
函数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_alloc_coherent()一样,这个函数会返回两个值:一个值是cpu可以使用的虚拟地址,另一个值是内存池设备可以使用的dma物理地址。void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);返回内存给内存池。参数pool为传递给dma_pool_alloc()的pool,参数vaddr及addr为dma_pool_alloc...
需要注意的是dma_alloc_coherent分配的内存的起始地址和size都是对齐在page上(类似__get_free_pages的感觉,当然__get_free_pages接受的size参数是page order),如果你的驱动不需要那么大的DMA buffer,那么可以选择dma_pool接口,下面会进一步描述。 如果传入非空的dev参数,即使驱动调用了掩码设置接口函数设定了DMA mask...