dsp edma 拷贝和A8 DMA拷贝

本文介绍了使用 DM81XX EDMA3 进行数据拷贝的方法,包括配置 DMA 参数、触发 DMA 转移及 DMA 控制初始化等关键步骤,并展示了具体的 C 语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)dsp调用这两个函数:

void DM81XX_EDMA3_setParams(int chId, int dmaQueue, unsigned int srcAddr,
                            unsigned int dstAddr, unsigned short edmaWidth,
                            unsigned short edmaHeight, short srcLineOffset,
                            short dstLineOffset)

void DM81XX_EDMA3_triggerTransfer(int chId)

 

进行edma数据的copy;

 

dma拷贝内容如下:

 

dma拷贝:

int OSA_dmaCopyFillRun(OSA_DmaChHndl *hndl, void *pPrm, int count, int copyFillType)
{
  DMA_CopyFillPrm prm;
  Uint32 cmd;
  int status;

  if(hndl->chId < 0)
    return OSA_EFAIL;
  
  prm.chId = hndl->chId;
  prm.count = count;
  prm.copyFillType = copyFillType;
  prm.prm = pPrm;

  cmd = DMA_IOCTL_CMD_MAKE(prm.copyFillType);
  status = ioctl(gOSA_dmaCtrl.fd, cmd, &prm);
  
  return status;
}


 

int OSA_dmaCopy1D(OSA_DmaChHndl *hndl, OSA_DmaCopy1D *prm, int count )
{
  return OSA_dmaCopyFillRun(hndl, prm, count, DMA_CMD_COPY_1D);
}


 

int OSA_dmaInit()
{
  char deviceName[20];
     
  if(!gOSA_dmaCtrl.isInitDone) {

    sprintf(deviceName, "/dev/%s", DMA_DRV_NAME);

    gOSA_dmaCtrl.fd = open(deviceName, O_RDWR);
    if(gOSA_dmaCtrl.fd<0)
      return OSA_EFAIL;
    
    gOSA_dmaCtrl.isInitDone = TRUE;
  }
  
  return OSA_SOK;
}


 

int OSA_dmaOpen(OSA_DmaChHndl *hndl, int dmaMode, int maxTransfers)
{
  DMA_OpenClosePrm prm;
  Uint32 cmd;
  int status;
    
  prm.chId = -1;
  prm.mode = dmaMode;
  prm.maxTransfers = maxTransfers;
  
  cmd = DMA_IOCTL_CMD_MAKE(DMA_CMD_CH_OPEN);
  status = ioctl(gOSA_dmaCtrl.fd, cmd, &prm);
  
  if(status==0)
    hndl->chId = prm.chId;
  else  
    hndl->chId = -1;
  
  return status;
}

调用:

        OSA_DmaCopy1D copy1D;

        copy1D.srcPhysAddr = (unsigned long)srcAddr;
        copy1D.dstPhysAddr = (unsigned long)dstAddr;

        copy1D.size   = sizeToCopy;
        OSA_dmaCopy1D(&dmaHndl, &copy1D, 1);


### DMAEDMA概述 在嵌入式系统中,DMA(Direct Memory Access)是一种允许外设直接访问内存的技术,而不需要CPU干预。这可以显著提高数据传输效率并减少处理器负载[^1]。 对于更复杂的场景,则引入了增强型DMA(Enhanced Direct Memory Access, EDMA),它不仅继承了传统DMA的功能特性还增加了额外的能力来处理更加复杂的数据操作需求[^2]。 ### 功能对比 #### 数据传输方式 - **DMA**: 支持简单的单次或循环模式下的固定长度块传送;每次启动前需由软件配置源地址、目的地址以及字节数等参数。 - **EDMA**: 提供链表模式支持连续多段不连续区域间的高效搬运工作,并可通过链接描述符实现自动加载下一组传输设置从而完成一系列非连续存储区之间的资料搬移作业而不必每次都依靠主机介入调整控制寄存器的内容[^3]. ```c // 配置一次基本的DMA传输 (伪代码) dma_channel_config(DMA_CHANNEL_0, source_address, destination_address, transfer_length); // 使用链表初始化多个EDMA事务 (伪代码) edma_link_descriptor_t descriptors[] = { {source_addr_1, dest_addr_1, length_1}, {source_addr_2, dest_addr_2, length_2} }; edma_configure_chain(descriptors); ``` #### 中断机制 - **DMA**: 当发生错误或者完成预定数量的数据交换之后会产生中断信号通知应用程序层做相应处理。 - **EDMA**: 除了具备上述功能之外还能针对特定事件触发条件自定义响应动作比如暂停当前任务切换到另一优先级更高的请求上去执行然后再回来继续未完成的工作流程[^4]. ### 应用实例分析 #### 图像处理领域 当涉及到大量图像帧缓冲区内像素值快速更新时采用EDMA会更为合适因为其能够灵活应对不同大小形状各异的目标对象之间频繁变化的位置关系所带来的挑战同时也减少了因频繁修改硬件资源分配所造成的开销问题[^5]. #### 实时音频流播放 如果目标是在保持低延迟的同时稳定地向DAC发送采样点序列那么普通的DMA就足以胜任这项职责因为它能持续不断地按照设定好的规则把来自外部设备的新鲜样本送达到指定位置等待进一步转换成模拟声音波形输出给扬声器装置[^6].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值