为了处理与 DMA 控制器接口的缓冲区,有特定的函数。这些函数不仅负责地址转换,还负责缓存与内存的一致性,例如缓存刷新(在发送之前将数据写入内存)和缓存无效(在接收之前使缓存无效)。
(1) 分配缓冲区,获取虚拟地址和物理地址:
void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag)
函数的返回值是分配的缓冲区的虚拟地址,而dma_handle指针保存的是分配的缓冲区的物理地址。
(2) 传递分配给设备的一个缓冲区:
dma_addr_t dma_map_single(struct device *dev, void *ptr,
size_t size,
enum dma_data_direction dir)
返回值是缓冲区的物理地址,参数dir是DMA_TO_DEVICE,ptr是缓冲区的虚拟地址;
(3) 从设备接收一个缓冲区:
void dma_unmap_single(struct device *dev, dma_addr_t addr,
size_t size,
enum dma_data_direction dir)
参数dir是DMA_FROM_DEVICE。
笔记:
要使用与 dma 相关的三个函数,必须将设备注册到具有 dma_map_ops 的特定总线上,否则这三个函数将无法使用。