最早接触DMA的时候是大三的微机原理,当时不是很理解,什么DMA模式啊,只知道是传输速度快,不经过CPU,但是到底是怎么样的不经过CPU呢?还是不理解。这次I2C控制器里面带了DMA的模式,所以有机会去接触下了。
而具体的DMA的意思是什么,百度百科里还是不错的。
DMA的工作过程:
Linux下用dma传输主要调用下面这些函数就可以实现外部的dma了。
具体的就可以看下面简单的解释,以下主要是dma发送的,其实接收也一样的。配置反一下就可以了。
1、初始化DMA
2、启动DMA
- struct dma_async_tx_descriptor *txdesc = NULL;
- struct dma_chan *txchan,;
- struct dma_slave_config txconf;
-
- txchan= dws->txchan;
-
- /*2. Prepare the TX dma transfer */
- txconf.direction= DMA_TO_DEVICE; //表示dma传输方向为发送
- txconf.dst_addr= dws->dma_addr; //目标地址,物理地址
- txconf.dst_maxburst= LNW_DMA_MSIZE_16; //最大传输的字节数
- txconf.dst_addr_width= DMA_SLAVE_BUSWIDTH_2_BYTES; //数据的位宽
-
- txchan->device->device_control(txchan,DMA_SLAVE_CONFIG,
- (unsigned long) &txconf);
-
- dws->tx_sgl.length= dws->len; //要传输的数据的长度
-
- dma_map_sg(dma_dev->dev,&dmatx->sg, 1, DMA_TO_DEVICE);
- //通过这个函数来实现虚拟地址和物理地址的映射。
-
- txdesc= txchan->device->device_prep_slave_sg(txchan,
- &dws->tx_sgl,
- 1,
- DMA_TO_DEVICE,
- DMA_PREP_INTERRUPT| DMA_COMPL_SKIP_DEST_UNMAP);
- txdesc->callback= dw_spi_dma_done; //传输完成后的回调函数
- txdesc->callback_param= params; //回调函数中的参数
-
- dmaengine_submit(txdesc);
- dma_dev->device_issue_pending(txchan); // 启动dma传输了
-
配置好后,这样DMA就会开始传输了,然后传输完了以后就会有调用callback函数。
from: http:///eastmoon502136/article/details/8502087