status=dma_async_is_tx_complete(chan, cookie, NULL, NULL);---pool DMA传输状态。if(time_after_eq(jiffies, dma_sync_wait_timeout)) { dev_err(chan->device->dev,"%s: timeout!\n", __func__);returnDMA_ERROR;---超时退出。}if(status !=DMA_IN_PROGRESS)break; cpu_relax();---...
status =dma_async_is_tx_complete(chan, cookie, NULL, NULL);---pool DMA传输状态。 if (time_after_eq(jiffies, dma_sync_wait_timeout)) { dev_err(chan->device->dev, "%s: timeout!\n", __func__); return DMA_ERROR;---超时退出。 } if (status != DMA_IN_PROGRESS) break; cpu_re...
}staticinlineenumdma_status dma_async_is_tx_complete(structdma_chan *chan, dma_cookie_t cookie, dma_cookie_t*last, dma_cookie_t *used) {structdma_tx_state state;enumdma_status status; status= chan->device->device_tx_status(chan, cookie, &state);if(last)*last =state.last;if(used)*...
int dmaengine_pause(struct dma_chan *chan) 继续传输: 只能用于已经挂起的传输 int dmaengine_resume(struct dma_chan *chan) 检查传输状态: enum dma_status dma_async_is_tx_complete(struct dma_chan *chan, dma_cookie_t cookie, dma_cookie_t *last, dma_cookie_t *used) ...
struct dma_chan { int lock; const char *device_id; }; 其中,如果成员lock!=0则表示DMA通道正被某个设备所使用;否则该DMA通道就处于free状态。而成员device_id就指向使用该DMA通道的设备名字字符串。 基于上述结构类型dma_chan,Linux定义了全局数组dma_chan_busy[],以分别描述8个DMA通道资源各自的使用状态。
在中断处理函数中,使用dmaengine_tx_status()函数来检查传输状态,并释放DMA缓冲区。 irqreturn_t dma_irq_handler(int irq, void *dev_id) { struct my_device *dev = dev_id; struct dma_chan *chan = dev->dma_chan; struct dma_tx_state state; enum dma_status status; status = dmaengine_tx_st...
dma_chan *chan); static int hc_dma_terminate_all(struct dma_chan *chan); static enum dma_status hc_dma_tx_status(struct dma_chan *chan, dma_cookie_t cookie, struct dma_tx_state *state); static void hc_dma_issue_pending(struct dma_chan *chan); static int hc_dma_alloc_chan_...
static inline enum dma_status dma_cookie_status(struct dma_chan *chan, dma_cookie_t cookie, struct dma_tx_state *state) eDMA 使用 dmaengine 的步骤 定义一个 struct dma_device 变量,并根据实际的硬件情况,填充其中的关键字段。 根据eDMA 支持的 channel 个数,为每个 channel 定义一个 struct dma_cha...
void dma_async_issue_pending(struct dma_chan *chan) 该函数启动DMA传输,此时如果通道是空闲的,等待队列中的第一个传输描述符将会启动DMA操作。 static inline enum dma_status dma_async_is_tx_complete(struct dma_chan *chan,dma_cookie_t cookie, dma_cookie_t *last, dma_cookie_t *used) ...
int dmaengine_slave_config(struct dma_chan *chan, struct dma_slave_config *config) 获取传输描述 DMA 传输属于异步传输,在启动传输之前,设备驱动需要将此次传输的一些信息(例如src/dst的buffer、传输的方向等)提交给 DMA 控制器,DMA 控制器确认好后,返回一个描述符。此后,设备驱动就可以以该描述符为单位,控...