<强> 1。两种DMA映射类型
强>
1.1。一致性DMA映射(一致的DMA映射)
主要用于映射长时间使用的区域。
CPU和DMA控制器不需要考虑缓存的影响。
这里的一致实际上是连贯的概念,不能保证一致,也就是说需要记忆障碍来保证记忆。
1.2流式DMA映射(流DMA映射)
主要用于一次性DMA传输,传输完成后就会释放。
2。指定DMA设备的寻址范围
包括/linux/dma-mapping.h
//用于一致性内存映射的映射范围 静态内联int dma_set_coherent_mask (struct设备* dev u64面具)//用于流式内存映射的映射范围 静态内联int dma_set_mask (struct设备* dev, u64面具);
<强> 3。DMA映射接口强>
3.1一致性DMA接口
分配较大DMA缓冲器
//dev DMA控制器设备//大小要分配的DMA缓冲器大?/dma_handle返回DMA缓冲区的物理地址//标志分配标志//返回值DMA缓冲器的虚拟地址 void * dma_alloc_coherent (struct设备* dev size_t大小,dma_addr_t * dma_handle gfp_t标志)//dev DMA控制器设备//大小释放的DMA缓冲器大?/cpu_addr DMA缓冲区的虚拟地址//dma_handle DMA缓冲区的物理地址 空白dma_free_coherent (struct设备* dev size_t大小, void * cpu_addr, dma_addr_t dma_handle)
分配较小DMA缓冲区,从DMA调查中申请。
/* * * dma_pool_alloc -从dma调查获得一块一致性内存 * @pool:产生内存块的dma池 * @mem_flags: GFP_ *位掩码 * @handle:返回内存块的dma地址 */void * dma_pool_alloc (struct dma_pool *池,gfp_t mem_flags, dma_addr_t *处理)/* * * dma_pool_free -将内存释放回dma池 * @pool:产生内存块的dma池 * @vaddr:内存块的虚拟地址 * @dma:内存块的物理地址 */空白dma_pool_free (struct dma_pool *池,void * vaddr, dma_addr_t dma)
, <强> 3.2流式DMA接口强>
//dev需要映射内存的设备//ptr映射的缓冲虚拟地址//大小映射的大?/dir传输方向//attr属性//返回值直接存储器存取物理地址 dma_addr_t dma_map_single_attrs (struct设备* dev, void * ptr, size_t大小, enum dma_data_direction dir, 无符号长attrs)//dev需要映射内存的设备//addr dma区域的物理地址//大小映射的大?/dir传输方向//attr属性 空白dma_unmap_single_attrs (struct设备* dev dma_addr_t addr, size_t大小, enum dma_data_direction dir, 无符号长attrs)
<强>页面映射强>
dma_addr_t dma_map_page (struct设备* dev结构页面*, size_t抵消,size_t大小, enum dma_data_direction dir) 空白dma_unmap_page (struct设备* dev dma_addr_t addr, size_t大小,enum dma_data_direction dir)
<强>返回dma映射错误强>
//返回dma映射错误 int dma_mapping_error (struct设备* dev dma_addr_t dma_addr)
<强>映射scatterlist 强>
int dma_map_sg_attrs (struct设备* dev, struct scatterlist * sg, enum dma_data_direction dir, int、 无符号长attrs) 空白dma_unmap_sg_attrs (struct设备* dev, struct scatterlist * sg, enum dma_data_direction dir, int、 无符号长attrs)//返回映射后的dma地址和长度 sg_dma_address (struct scatterlist * sg) sg_dma_len (struct scatterlist * sg)
<强>同步操作强>
空白dma_sync_single_for_cpu (struct设备* dev dma_addr_t addr, size_t大小, enum dma_data_direction dir) 空白dma_sync_single_for_device (struct设备* dev, dma_addr_t addr, size_t大小, enum dma_data_direction dir) 无效 dma_sync_sg_for_cpu (struct设备* dev, struct scatterlist * sg, int nelems enum dma_data_direction dir) 无效 dma_sync_sg_for_device (struct设备* dev, struct scatterlist * sg, int nelems enum dma_data_direction dir)
以上就是本次介绍的全部相关知识点,如果大家有任何补充可以联系小编。