K230 DMA API参考
1. 概述
1.1 概述
GSDMA:DMA 全称 Direct Memory Access,即直接存储器访问,将数据从一个地址空间复制到另一个地址空间,提供在存储器和存储器之间的高速数据传输。GDMA 全称 Graphic Direct Memory Access,负责将内存中的图像复制到另一块内存中,同时可以完成图像的旋转和镜像等功能。SDMA 全称 System Direct Memory Access,负责将内存中的数据复制到另一块内存中,即传统意义上的 DMA。
软件代码将 GSDMA 硬件的各个功能以 API 的方式提供给使用者使用,帮助用户快速实现图像传输、旋转、镜像、2D 功能及数据传输功能。同时实现了模块状态信息统计等功能。
1.2 功能描述
dma 驱动调用流程如下图所示:
将 dma 硬件抽象为一个设备,八个通道,其中,通道 0~3 是 gdma 通道,通道 4~7 是 sdma 通道。
1.2.1 gdma
用户通过 gdma 来实现图像的旋转镜像工作,主要调用流程如下:
- 进行 dma 设备属性的配置;
- 启动 dma 设备。在调用此函数以后驱动会自动申请 VB 空间作为目的地址的数据缓冲区;
- 进行 gdma 通道属性的配置;
- 启动 gdma 通道;
- 用户在用户态申请 VB 空间作为源数据的数据缓冲区,调用 kd_mpi_dma_send_frame 发送数据的源地址给 gdma;
- 驱动会将源地址中的数据传输到步骤二中申请的目的地址数据缓冲区中;
- 用户调用 kd_mpi_dma_get_frame 获取目的地址中的数据地址。
1.2.2 sdma
用户通过 sdma 来实现数据搬移工作,主要调用流程如下:
- 进行 dma 设备属性的配置;
- 启动 dma 设备。在调用此函数以后驱动会自动申请 VB 空间作为目的地址的数据缓冲区;
- 进行 sdma 通道属性的配置;
- 启动 sdma 通道;
- 用户在用户态申请 VB 空间作为源数据的数据缓冲区,调用 kd_mpi_dma_send_frame 发送数据的源地址给 sdma;
- 驱动会将源地址中的数据传输到步骤二中申请的目的地址数据缓冲区中;
- 用户调用 kd_mpi_dma_get_frame 获取目的地址中的数据地址。
2. API 参考
2.1 DMA 使用
该功能模块提供以下API:
- kd_mpi_dma_set_dev_attr
- kd_mpi_dma_get_dev_attr
- kd_mpi_dma_start_dev
- kd_mpi_dma_stop_dev
- kd_mpi_dma_set_chn_attr
- kd_mpi_dma_get_chn_attr
- kd_mpi_dma_start_chn
- kd_mpi_dma_stop_chn
- kd_mpi_dma_send_frame
- kd_mpi_dma_get_frame
- kd_mpi_dma_release_frame
2.1.1 kd_mpi_dma_set_dev_attr
【描述】
配置 dma 设备属性
【语法】
k_s32 kd_mpi_dma_set_dev_attr(k_dma_dev_attr_t *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
attr | dma 设备属性结构体指针。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无。
【需求】
- 头文件:mpi_dma_api.h
- 库文件:libdma.a
【注意】
无
【举例】
无
【相关主题】
2.1.2 kd_mpi_dma_get_dev_attr
【描述】
获取已经配置的 dma 设备属性。
【语法】
k_s32 kd_mpi_dma_get_dev_attr(k_dma_dev_attr_t *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
attr | dma 设备属性结构体指针 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无
【需求】
- 头文件:mpi_dma_api.h
- 库文件:libdma.a
【注意】
需要在配置 dma 设备属性之后才可以获取 dma 设备属性。
【举例】
无
【相关主题】
2.1.3 kd_mpi_dma_start_dev
【描述】
启动 dma 设备。
【语法】
k_s32 kd_mpi_dma_start_dev();
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
无 | 无 | 无 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无
【需求】
- 头文件:mpi_dma_api.h
- 库文件:libdma.a
【注意】
- 需要配置 dma 设备属性之后才可以调用此函数启动 dma
【举例】
无
【相关主题】
无
2.1.4 kd_mpi_dma_stop_dev
【描述】
停止 dma 设备。
【语法】
kd_mpi_dma_stop_dev();
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
无 | 无 | 无 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无
【需求】
- 头文件:mpi_dma_api.h
- 库文件:libdma.a
【注意】
- 只有启动 dma 设备之后才可以调用此函数来停止 dma 设备。
【举例】
无
【相关主题】
无
2.1.5 kd_mpi_dma_set_chn_attr
【描述】
配置 dma 通道属性。
【语法】
k_s32 kd_mpi_dma_set_chn_attr(k_u8 chn_num, k_dma_chn_attr_u *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
chn_num | 通道号 | 输入 |
attr | dma 通道属性,该参数是一个联合体,可以选择配置 gdma 通道属性,也可以选择配置 sdma 通道属性。通道 0~3 是 gdma,通道 4~7 是 sdma | 输入 |
【返 回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无
【需求】
- 头文件:mpi_dma_api.h
- 库文件:libdma.a
【注意】
无
【举例】
无
【相关主题】
2.1.6 kd_mpi_dma_get_chn_attr
【描述】
获取已经配置的 dma 通道属性。
【语法】
k_s32 kd_mpi_dma_get_chn_attr(k_u8 chn_num, k_dma_chn_attr_u *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
chn_num | 通道号 | 输入 |
attr | dma 通道属性,该参数是一个联合体,可以选择获取 gdma 通道属性,也可以选择获取 sdma 通道属性。通道 0~3 是 gdma,通道 4~7 是 sdma | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无
【需求】
- 头文件:mpi_dma_api.h
- 库文件:libdma.a
【注意】
- 需要在配置 dma 通道属性之后才可以获取 dma 通道属性。
【举例】
无
【相关主题】
2.1.7 kd_mpi_dma_start_chn
【描述】
启动 dma 通道。
【语法】
k_s32 kd_mpi_dma_start_chn(k_u8 chn_num);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
chn_num | 通道号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无
【需求】
- 头文件:mpi_dma_api.h
- 库文件:libdma.a
【注意】
- 只有在配置启动 dma 设备,配置 dma 通道属性之后才可以启动 dma 通道。
【举例】
无
【相关主题】
无
2.1.8 kd_mpi_dma_stop_chn
【描述】
暂停 dma 通道
【语法】
k_s32 kd_mpi_dma_stop_chn(k_u8 chn_num);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
chn_num | 通道号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无
【需求】
- 头文件:mpi_dma_api.h
- 库文件:libdma.a
【注意】
- 只有启动 dma 通道之后才可以调用此函数来停止 dma 通道。
【举例】