跳转至

BDMA 使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 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的值

    • 说明

      内存数据搜寻设置。

    • 定义

      typedef struct
      {
          u8  antimatch;
          u8  mobf;
          u32 patternmask;
          u32 mobfkey;
          u32 patternaddr;
      } bdma_search;
      
    • 成员

      成员名称 描述
      antimatch 反向匹配使能
      mobf MOBF 模式使能
      patternmask 搜寻目标取位
      mobfkey MOBF模式目标值
      patternaddr 返回的搜寻目标地址

    8. 测试用例说明

    1. Linux参考: drivers/sstar_common/bdma/ut/lnx/bdma_ut.c

    2. Rtos参考: proj/sc/driver/sysdriver_common/bdma/ut/lnx/bdma_ut.c

    9. FAQ

    9.1 内存数据搬移后目标地址没有数据

    1.在数据搬移前后使用接口CamOsMemFlush()对源地址和目标地址进行数据flush。