This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

在DM36x中查看EDMA3的资源分配

对于该问题首先要明确使用的软件,我以ipnc rdk为例,主要使用edma有两部分一部分为linux,另一部分为codec.

对于linux你可以关注edma的kernel driver,在其中加入一些sysfs或者proc fs的接口将资源分配情况输出

对于codec的edma使用情况可以直接看codec的手册.

  • 多谢FengDong的信息。codec的edma资源使用似乎不经过kernel driver吧。

    知道了edma的使用情况,如何能够调整?

  • linux应用使用的edma资源一定是通过kernel驱动分配的.不同的是dvsdk软件并没有做应用层驱动给应用层使用,而rdk则实现了应用层的dma驱动,可以在应用层直接使用dma资源.最终的分配还是在kernel驱动完成.

    通常你不需要进行调整因为申请的都是逻辑channel.

  • 多谢FengDong的回复!既然包括dvsdk在内都是通过kernel进行edma分配,那通过kernel可以监测到所有的edma资源使用情况。如您所说,利用kernel申请时用了逻辑channel,那逻辑channel向物理channel的影射应该也是在kernel完成的了。

    对于资源受限结构精致的嵌入式系统,dm36x连接的外设如I2S、SPI等要求DMA实时响应,否则有数据丢失的危险,因此dma的优先级分配是很重要的,这点在edma的channel编号顺序中已经体现出来。

    如您所说,应用向kernel申请emda资源使用了逻辑channel,其优先级是如何体现出来的?或者这个概念对应用层是透明的?

  • 请首先明确在dm36x上codec engine是单core模式,codec申请的dma一定会进入到kernel执行但是会使用自己的驱动,不是你在kernel代码中找到的驱动.所以如之前帖子所说你如果看codec的dma使用情况就要看codec的手册.而对于你说的其他驱动都有dma mode和arm中断mode两种模式.你如果要观察设备驱动的dma以及优先级可以参考具体的驱动代码.

    而对于你说的驱动dma的情况,只要不与codec使用相同的tc channel就可以.

    详细的优先级等信息还是需要你看edma的手册,对于edma的工作原理机制有了解.

  • 谢谢FendDong的及时回复。我们将kernel及dvsdk中与edma相关的代码及edma手册、codec数据手册和用户手册全部浏览了一遍,自认为对硬件结构、原理和软件的执行流程已经搞清楚了。为了真正了解davinci中对dma资源的使用情况,我们在codec运行的情况下,将所有channel的事件队列分配情况,和不同队列的优先级设置读取打印如下:

    DMAQNUM0[0x01c00240]=0x00111220

    DMAQNUM1[0x01c00244]=0x00003300

    DMAQNUM2[0x01c00248]=0x00010000

    DMAQNUM3[0x01c0024c]=0x12212210

    DMAQNUM4[0x01c00250]=0x11101011

    DMAQNUM5[0x01c00254]=0x10011001

    DMAQNUM6[0x01c00258]=0x11112111

    DMAQNUM7[0x01c0025c]=0x11111111

    QUEPRI[0x01c00284]=0x00000122

    从DMAQNUMx寄存器的值看出,的确如codec手册所言,其占据了事件队列0、1、2。DMAQNUM1中出现值为3是SPI2的驱动代码设置。

    而且QUEPRI的设置将事件队列3设置为最高优先级0,而codec占据的事件队列优先级分别为1和2。也就是说SPI2占据了DMA最高优先级。

    遗憾的是,做为负责收发图像数据的spi2以slave角色工作,依然出现了较高的数据错帧率(1%~5%)。

    SPI占据的绝对带宽是微不足道的(<2Mb/s),请问在emda的资源使用上还有办法解决此问题?

  • 你的路走偏了,错帧你更应该研究的是硬件信号以及驱动的时序.dma如果出问题,通常不是错帧,而是underflow或者overflow.

  • Hi, Feng Dong:

    我认为问题本质是:

    SPI master去读取DM36x作为的SPI Slave,2边都用DMA读取,DM36x的SPI-DMA被Codec-DMA抢占,导致数据输出暂停,而Master那边不知道,还在驱动时钟去读取这个Slave,这样就导致了数据错误。

    在没有Codec情况下数据是完全正确的。

    你觉得呢?

  • 你要先从master侧检查数据错误的情况,是插入不需要传输的数据还是什么.这都属于驱动dma的情况,之前帖子已经说明只要不与codec使用相同的tc channel就可以.另外你要检查是否有underflow,或者overflow,主要是设置合适的阈值保证传输数据即时到达fifo.这些都是驱动需要调整的.

  • Hi,Fengdong:

    我们对比过数据,貌似出错的数据没有规律,比如循环发0-255,有时候突然一个数据变0(时钟4M左右),有时候一段数据没规律(时钟8M左右),然后又恢复,基于此种情况我才得出上述的结论。

    如你所说,插入不需要传输的数据应该看dma支不支持?从手册来看没有发现EDMA3有这种功能。

    现在SPI2用的是TC3,与Codec是不在一个TC上的。

    另外,你说的underflow和overflow是指EventQueue的队列个数吧?因为SPI控制器的FIFO仅为1,而DMA的TC Fifo数也是固定的,我只剩下队列个数可以修改了,是这个意思不?但是EQ3只有一个SPI,那么就需要修改别的EQ变短了?

    盼复!

  • 我说的都是针对spi接口,你要检查spi是否有异常中断.