Thursday, January 13, 2022

[Linux kernel] DMA

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

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能