BDMA 使用参考¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 11/18/2024 | |
| 1.1 | 11/25/2025 |
1. 概述¶
Byte-aligned data transfer DMA engine(字节对齐数据传输的直接内存访问控制器),简称BDMA,主要用于外设和存储器之间,存储器与存储器之间的高速传输数据,并且不需要CPU的参与。
本文主要介绍Rtos和Linux系统下操作BDMA进行数据传输。
2. 功能描述¶
-
内存数据搬运(mem copy)
-
内存数据填充(mem pattern fill)
-
内存数据搜寻(mem pattern search)
-
内存数据crc计算(mem crc)
-
时钟与MIU时钟同频
不同Chip支持BDMA数量如下表
| **chipname** | **mspi number** |
| ------------- | --------------- |
| iford | 3 |
| souffle | 3 |
| ifado | 2 |
| pcupid | 3 |
| ibopper | 2 |
| ifackel | 2 |
3. 硬件连接介绍¶
4. Rtos用法介绍¶
4.1. Rtos Config配置¶
Rtos使用BDMA,需要配置:
CONFIG_BDMA_SUPPORT=y
进入rtos/proj目录,make menuconfig选择的配置如下:
BSP Driver Options --->
[*] Support BDMA driver
4.2. Rtos SYS配置¶
4.2.1. bdma节点配置¶
<bdma0>
[camclk_u16] CAMCLK_VOID;
[interrupts_u8] INT_IRQ_BDMA;
[regs_u32] 0x1F200400;
| 属性 | 描述 | 备注 |
|---|---|---|
| camclk_u16 | 用于指定BDMA的时钟源 | 不需要修改 |
| interrupts_u8 | 用于指定BDMA的中断号 | 不需要修改 |
| regs_u32 | 用于指定BDMA寄存器bank的地址 | 不需要修改 |
5. Linux用法介绍¶
5.1. Linux Config配置¶
Linux使用BDMA,需要配置:
CONFIG_SSTAR_BDMA=y
进入kernel目录,make menuconfig选择的配置如下:
Device Drivers --->
[*] Sstar SoC platform drivers --->
[*] Sstar BDMA
5.2. dtsi节点说明¶
bdma0 {
compatible = "sstar,bdma0";
interrupts = <GIC_SPI INT_IRQ_BDMA IRQ_TYPE_LEVEL_HIGH>;
reg = <0x1F200400 0x80>;
clocks = <&xtal>;
status = "ok";
};
BDMA master驱动中支持配置的属性如下:
| 属性 | 描述 | 备注 |
|---|---|---|
| compatible | 用于匹配驱动进行驱动注册,需与代码中一致 | 禁止修改 |
| reg | 用于指定BDMA寄存器bank的地址 | 不需要修改 |
| interrupts | 用于指定使用的硬件中断号及属性 | 不需要更改 |
| clocks | 用于指定使用的时钟源 | 不需要更改 |
| status | 用于选择是否使能BDMA驱动 | 可根据需要修改 |
6. API 参考¶
drv_bdma.h中的API在Rtos和Linux的用法一样。
Linux路径:drivers/sstar_common/include/drv_bdma.h
Rtos路径:proj/sc/driver/sysdriver_common/include/drv_bdma.h
| API名 | 功能 |
|---|---|
| drv_bdma_initialize | 初始化BDMA对应的通道 |
| drv_bdma_uninitialize | 解BDMA通道初始化 |
| drv_bdma_transfer | BDMA功能运行 |
6.1. drv_bdma_initialize¶
-
功能
初始化BDMA通道
-
语法
bdma_err drv_bdma_initialize(u8 channel); -
形参
参数名称 描述 输入/输出 channel 通道选择 输入 -
返回值
-
0:成功。
-
非0:失败。
-
-
依赖
- 头文件:drv_bdma.h
6.2. drv_bdma_uninitialize¶
-
功能
解初始化BDMA通道
-
语法
bdma_err drv_bdma_uninitialize(u8 channel); -
形参
参数名称 描述 输入/输出 channel 通道选择 输入 -
返回值
-
0:成功。
-
非0:失败。
-
-
依赖
- 头文件:drv_bdma.h
6.3. drv_bdma_transfer¶
-
功能
运行BDMA功能。
-
语法
bdma_err drv_bdma_transfer(u8 channel, bdma_param *param); -
形参
参数名称 描述 输入/输出 channel 通道选择 输入 param 传输配置参数 输入 -
返回值
-
0:成功。
-
非0:失败。
-
-
依赖
- 头文件:drv_bdma.h
-
注意
- 必须先初始化对应的channel。
7. 数据结构说明¶
相关数据结构定义如下。
| 数据类型 | 定义 |
|---|---|
| bdma_param | 功能相关配置 |
| bdma_line_offset | 行偏移配置 |
| bdma_crc | crc32配置 |
| bdma_search | 内存数据搜寻配置 |
7.1. bdma_param¶
-
说明
功能配置相关的数据结构。
-
定义
typedef struct { u8 bIntMode; u8 bEnLineOfst; bdma_src_select eSrcSel; bdma_dst_select eDstSel; bdma_data_width eSrcDataWidth; bdma_data_width eDstDataWidth; bdma_addr_mode eDstAddrMode; ss_miu_addr_t pSrcAddr; ss_miu_addr_t pDstAddr; u32 u32TxCount; u32 u32Pattern; bdma_line_offset *pstLineOfst; bdma_crc * pstCrcst; bdma_search * pstSearchst; bdma_callback pfTxCbFunc; void * pTxCbParm; } bdma_param; -
成员
成员名称 描述 bIntMode 中断使能 bEnLineOfst 配置传输宽度使能 eSrcSel 源设备选择 eDstSel 目标设备选择 eSrcDataWidth 源设备传输宽度设置 eDstDataWidth 目标设备传输宽度设置 eDstAddrMode 目标设备放入数据的模式 pSrcAddr 源设备地址 pDstAddr 目标设备地址 u32TxCount 数据传输大小 u32Pattern 内存数据搜寻指定的数据 pstLineOfst 行偏移功能配置 pstCrcst crc计算功能配置 bdma_search 内存搜寻功能配置 bdma_callback 中断回调函数 pTxCbParm 中断回调指针,私有指针
7.2. bdma_line_offset¶
-
说明
行偏移功能配置。
-
定义
typedef struct { u32 u32SrcWidth; u32 u32SrcOffset; u32 u32DstWidth; u32 u32DstOffset; } bdma_line_offset; -
成员
成员名称 描述 u32SrcWidth 源设备宽度 u32SrcOffset 源设备有效数据宽度 u32DstWidth 目标设备宽度 u32DstOffset 目标设备有效数据宽度
7.3. bdma_crc¶
-
说明
crc功能配置。
-
定义
typedef struct { u8 reflection; u32 polynomial; u32 seedvalue; } bdma_crc; -
成员
成员名称 描述 reflection 字节反转配置 polynomial 计算多项式 seedvalue 初始值,计算后为crc的值
7.4. bdma_search¶
-
说明
内存数据搜寻设置。
-
定义
typedef struct { u8 antimatch; u8 mobf; u32 patternmask; u32 mobfkey; u32 patternaddr; } bdma_search; -
成员
成员名称 描述 antimatch 反向匹配使能 mobf MOBF 模式使能 patternmask 搜寻目标取位 mobfkey MOBF模式目标值 patternaddr 返回的搜寻目标地址
8. 测试用例说明¶
-
Linux参考: drivers/sstar_common/bdma/ut/lnx/bdma_ut.c
-
Rtos参考: proj/sc/driver/sysdriver_common/bdma/ut/lnx/bdma_ut.c
9. FAQ¶
9.1 内存数据搬移后目标地址没有数据¶
1.在数据搬移前后使用接口CamOsMemFlush()对源地址和目标地址进行数据flush。