DMA

Macros

dma direction

dma 传输方向支持 4 种。

1 #define DMA_MEMORY_TO_MEMORY 0
2 #define DMA_MEMORY_TO_PERIPH 1
3 #define DMA_PERIPH_TO_MEMORY 2
4 #define DMA_PERIPH_TO_PERIPH 3

dma addr increment

dma 地址自增使能。

1 #define DMA_ADDR_INCREMENT_DISABLE 0
2 #define DMA_ADDR_INCREMENT_ENABLE  1

dma data width

dma 传输位宽支持 8BIT 、16BIT、32BIT。

1 #define DMA_TRANSFER_WIDTH_8BIT  0
2 #define DMA_TRANSFER_WIDTH_16BIT 1
3 #define DMA_TRANSFER_WIDTH_32BIT 2

dma burst size

dma 突发传输个数,最多 16 字节突发。

1 #define DMA_BURST_INCR1  0
2 #define DMA_BURST_INCR4  1
3 #define DMA_BURST_INCR8  2
4 #define DMA_BURST_INCR16 3

警告

位宽 * 突发个数 需要小于等于 16 字节

dma addr

参考 bflb_dma.h 文件,不详细列出。

dma request

参考 bflb_dma.h 文件,不详细列出。

Structs

struct bflb_dma_channel_lli_pool_s

由于 dma 支持 lli 模式,所以需要在传输之前分配一块内存池给 lli 使用, 调用 bflb_dma_lli_reload 后会自动消耗内存池和配置相关 lli 信息,无需用户手动配置。

1 struct bflb_dma_channel_lli_pool_s {
2     uint32_t src_addr;
3     uint32_t dst_addr;
4     uint32_t nextlli;
5     union bflb_dma_lli_control_s lli_control;
6 };

struct bflb_dma_channel_lli_transfer_s

用户使用 lli 传输时,需要填充的传输内容:源地址、目标地址和长度,并且如果地址不连续,可以增加多个 transfer。

1 struct bflb_dma_channel_lli_transfer_s {
2     uint32_t src_addr;
3     uint32_t dst_addr;
4     uint32_t nbytes;
5 };

struct bflb_dma_channel_config_s

初始化 dma 通道时需要填充的信息。

 1 struct bflb_dma_channel_config_s {
 2     uint8_t direction;
 3     uint32_t src_req;
 4     uint32_t dst_req;
 5     uint8_t src_addr_inc;
 6     uint8_t dst_addr_inc;
 7     uint8_t src_burst_count;
 8     uint8_t dst_burst_count;
 9     uint8_t src_width;
10     uint8_t dst_width;
11 };

parameter

description

direction

传输方向

src_req

源 dma 请求

dst_req

目标 dma 请求

src_addr_inc

源地址是否自增

dst_addr_inc

目标地址是否自增

src_burst_count

源地址突发个数

dst_burst_count

目标地址突发个数

src_width

源地址位宽

dst_width

目标地址位宽

Functions

bflb_dma_channel_init

说明: 初始化 dma 通道。

1 void bflb_dma_channel_init(struct bflb_device_s *dev, const struct bflb_dma_channel_config_s *config);

parameter

description

dev

设备句柄

config

配置参数

bflb_dma_channel_deinit

说明: 反初始化 dma 通道。

1 void bflb_dma_channel_deinit(struct bflb_device_s *dev);

parameter

description

dev

设备句柄

bflb_dma_channel_start

说明: 启动 dma 通道传输。

1 void bflb_dma_channel_start(struct bflb_device_s *dev);

parameter

description

dev

设备句柄

bflb_dma_channel_stop

说明: 关闭 dma 通道传输。

1 void bflb_dma_channel_stop(struct bflb_device_s *dev);

parameter

description

dev

设备句柄

bflb_dma_channel_isbusy

说明: 检查 dma 通道是否处于 busy 状态。

1bool bflb_dma_channel_isbusy(struct bflb_device_s *dev);

parameter

description

dev

设备句柄

return

是否 busy

bflb_dma_channel_irq_attach

说明: 注册 dma 通道中断完成回调函数并开启通道完成中断。

1void bflb_dma_channel_irq_attach(struct bflb_device_s *dev, void (*callback)(void *arg), void *arg);

parameter

description

dev

设备句柄

callback

回调函数

arg

用户参数

bflb_dma_channel_irq_detach

说明: 关闭 dma 通道完成中断。

1void bflb_dma_channel_irq_detach(struct bflb_device_s *dev);

parameter

description

dev

设备句柄

bflb_dma_channel_lli_reload

说明: 配置 dma 通道的 lli 信息。

1 int bflb_dma_channel_lli_reload(struct bflb_device_s *dev,
2                                 struct bflb_dma_channel_lli_pool_s *lli_pool, uint32_t max_lli_count,
3                                 struct bflb_dma_channel_lli_transfer_s *transfer, uint32_t count);

parameter

description

dev

设备句柄

lli_pool

lli 内存池

max_lli_count

lli 内存池大小

transfer

传输句柄

count

传输次数

return

返回使用的 lli count个数,小于0表示错误

bflb_dma_feature_control

说明: dma 其他特性相关控制,一般不常用。

1void bflb_dma_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);

parameter

description

dev

设备句柄

cmd

控制字

arg

控制参数

cmd 可以填入以下参数:

1#define DMA_CMD_SET_SRCADDR_INCREMENT (0x01)
2#define DMA_CMD_SET_DSTADDR_INCREMENT (0x02)
3#define DMA_CMD_SET_ADD_MODE          (0x03)
4#define DMA_CMD_SET_REDUCE_MODE       (0x04)