Edit online

接口设计

Read time: 4 minute(s)

Driver 层接口设计

以下接口是遵循 Linux DMA Engine 子系统的标准接口。

1. dmaengine_slave_config

函数原型

int dmaengine_slave_config(struct dma_chan *chan, struct dma_slave_config *config)

功能说明

配置指定的 DMA 物理通道

参数定义

chan - 指向一个 DMA 物理通道
config - 保存了需要的配置信息

返回值

0,成功

注意事项

-

2. dmaengine_pause

函数原型

int dmaengine_pause(struct dma_chan *chan)

功能说明

暂停指定通道的传输操作

参数定义

chan - 指向一个 DMA 物理通道

返回值

0,成功

注意事项

-

3. dmaengine_resume

函数原型

int dmaengine_resume(struct dma_chan *chan)

功能说明

恢复指定通道的传输操作

参数定义

chan - 指向一个 DMA 物理通道

返回值

0,成功

注意事项

-

4. dmaengine_prep_dma_memcpy

函数原型

int dmaengine_prep_dma_memcpy(struct dma_chan *chan,
uint32_t dest, uint32_t src, uint32_t len)

功能说明

memcpy 操作的预处理

参数定义

chan - 指向一个 DMA 物理通道
dest - 目标 Buffer 的物理地址
src - 源 Buffer 的物理地址
len - 数据长度

返回值

0,成功;<0,失败

注意事项

-

5. dmaengine_prep_dma_device

函数原型

int dmaengine_prep_dma_device(struct dma_chan *chan,
uint32_t dest, uint32_t src, uint32_t len,
enum dma_transfer_direction dir)

功能说明

设备与内存之间传输操作的预处理

参数定义

chan - 指向一个 DMA 物理通道
dest - 目标 Buffer 的物理地址
src - 源 Buffer 的物理地址
len - 数据长度
dir - 传输方向,是 Dev to Mem,还是 Mem to Dev

返回值

0,成功;<0,失败

注意事项

-

6. dmaengine_prep_dma_cyclic

函数原型

int dmaengine_prep_dma_cyclic(struct dma_chan *chan,
uint32_t buf_addr, uint32_t buf_len, uint32_t period_len,
enum dma_transfer_direction dir)

功能说明

(设备与内存之间)循环传输操作的预处理

参数定义

chan - 指向一个 DMA 物理通道
buf_addr - 循环 Buffer 的起始物理地址
buf_len - 循环 Buffer 的总长度
period_len - 循环的 Buffer 片段长度
dir - 传输方向,是 Dev to Mem,还是 Mem to Dev

返回值

0,成功;<0,失败

注意事项

-

7. dma_async_issue_pending

函数原型

void dma_async_issue_pending(struct dma_chan *chan)

功能说明

启动指定通道的数据传输

参数定义

chan - 指向一个 DMA 物理通道

返回值

注意事项

-

8. dmaengine_terminate_async

函数原型

int dmaengine_terminate_async(struct dma_chan *chan)

功能说明

终止指定通道的数据传输

参数定义

chan - 指向一个 DMA 物理通道

返回值

0,成功

注意事项

-

9. dmaengine_tx_status

函数原型

enum dma_status dmaengine_tx_status(struct dma_chan *chan, uint32_t *residue)

功能说明

获取指定通道的传输状态

参数定义

chan - 指向一个 DMA 物理通道
residue - 还没有传输完成的剩余长度,单位:字节

返回值

DMA_COMPLETE,传输完成;DMA_IN_PROGRESS,传输中

注意事项

-

HAL 层接口设计

HAL 层的函数接口声明存放在 hal_dma.h 中,主要接口有:
int hal_dma_chan_prep_memset(struct aic_dma_chan *chan,
                             uint32_t p_dest,
                             uint32_t value,
                             uint32_t len);
int hal_dma_chan_prep_memcpy(struct aic_dma_chan *chan,
                             uint32_t p_dest,
                             uint32_t p_src,
                             uint32_t len);
int hal_dma_chan_prep_device(struct aic_dma_chan *chan,
                             uint32_t p_dest,
                             uint32_t p_src,
                             uint32_t len,
                             enum dma_transfer_direction dir);
int hal_dma_chan_prep_cyclic(struct aic_dma_chan *chan,
                             uint32_t p_buf_addr,
                             uint32_t buf_len,
                             uint32_t period_len,
                             enum dma_transfer_direction dir);
int hal_dma_chan_tx_status(struct aic_dma_chan *chan, uint32_t *left_size);
int hal_dma_chan_start(struct aic_dma_chan *chan);
int hal_dma_chan_stop(struct aic_dma_chan *chan);
int hal_dma_chan_pause(struct aic_dma_chan *chan);
int hal_dma_chan_resume(struct aic_dma_chan *chan);
int hal_dma_chan_terminate_all(struct aic_dma_chan *chan);
int hal_dma_chan_register_cb(struct aic_dma_chan *chan,
                             dma_async_callback callback,
                             void *callback_param);
int hal_dma_chan_config(struct aic_dma_chan *chan,
                        struct dma_slave_config *config);
int hal_release_dma_chan(struct aic_dma_chan *chan);
struct aic_dma_chan * hal_request_dma_chan(void);
int hal_dma_init(void);
int hal_dma_deinit(void);
int hal_dma_chan_dump(int ch_nr);

irqreturn_t hal_dma_irq(int irq, void *arg);