DMA的操作是需要物理地址的,但是在linux内核中使用的都是虚拟地址,如果我们想要用DMA对一段内存进行操作,我们如何得到这一段内存的物理地址和虚拟地址的映射呢?dma_alloc_coherent这个函数实现了这种机制。
1、函数原型: void *dma_alloc_coherent( struct device *dev, size_t size,dma_addr_t *dma_handle,gfp_t gfp);
下面的这一段参考 http://blog.csdn.net/lanmanck/archive/2009/11/05/4773175.aspx
2、调用
A = dma_alloc_writecombine(B,C,D,GFP_KERNEL);
含义:
A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存
B: struct device指针,可以平台初始化里指定,主要是dma_mask之类,可参考framebuffer
C: 实际分配大小,传入dma_map_size即可
D: 返回的内存物理地址,dma就可以用。
所以,A和D是一一对应的,只不过,A是虚拟地址,而D是物理地址。对任意一个操作都将改变缓冲区内容
/* Allocate TX and RX buffers for DMA channels */ bu92747kv_ir->rx_buff_virt = dma_alloc_coherent(NULL, FIFO_SIZE, &(bu92747kv_ir->rx_buf_dma_phys), GFP_KERNEL | GFP_DMA);
Sleep 與 Wake Up
No comments:
Post a Comment