英飞凌
直播中

李华瑞

7年用户 926经验值
私信 关注

如何在TC397上从DMA暂停状态恢复GETH RX DMA?

在我们的应用中,GETH Rx DMA 被暂停(即 DMA 通道 i 状态寄存器.RBU ==1),因为 Rx DMA 无法获得 Rx 描述符。
根据"TC3xx 用户手册 part2.pdf" 第 2921 页、
"要恢复处理 Rx 描述符,应用程序应更改
描述符的所有权,并发出接收轮询需求命令。
如果不发出该命令,则在收到下一个
识别到的传入数据包时恢复 Rx 进程。 在环模式下,应用
应将通道的接收描述符尾指针寄存器提前。 "
但是,我们在手册中找不到有关"Receive Poll Demand 命令的任何介绍。" 。
那么,如何从 Rx DMA 暂停状态恢复?
在应用程序
将通道的接收描述符尾指针寄存器提前后,是否只需清除 RBU 位并重新启动 Rx DMA 即可?

回帖(1)

杨海清

2024-5-21 17:14:01
在TC397上从DMA暂停状态恢复GETH RX DMA的过程可以分为以下几个步骤:

1. 首先,确保应用程序已经正确地更新了Rx描述符。这包括设置正确的缓冲区地址、缓冲区大小以及将描述符的所有权从CPU更改为DMA。

2. 在更新Rx描述符后,需要发出接收轮询需求命令(Receive Poll Demand,简称RPD)。这个命令的作用是通知DMA引擎检查Rx描述符并开始处理它们。在TC3xx用户手册中,可能没有明确提到RPD命令的具体实现,但我们可以通过以下方式来实现它:

   a. 编写一个宏定义或函数,用于生成RPD命令。例如:
      ```c
      #define RPD_COMMAND 0x00010001 // 这个值可能需要根据实际硬件和驱动进行调整

      void issueRPDCommand(volatile uint32_t *dmaBaseAddr) {
          *(dmaBaseAddr + RPD_OFFSET) = RPD_COMMAND;
      }
      ```
      注意:`dmaBaseAddr`是指向DMA通道基地址的指针,`RPD_OFFSET`是RPD命令在DMA通道寄存器中的偏移。

   b. 在应用程序中,调用这个函数来发出RPD命令:
      ```c
      issueRPDCommand(dmaBaseAddr);
      ```

3. 在环模式下,应用程序需要提前更新通道的接收描述符尾指针寄存器。这可以通过以下方式实现:

   a. 编写一个宏定义或函数,用于更新尾指针寄存器。例如:
      ```c
      #define RDES_RING_END_OFFSET 0x18 // 这个值可能需要根据实际硬件和驱动进行调整

      void updateRDESRingEnd(volatile uint32_t *dmaBaseAddr, uint32_t tailPointer) {
          *(dmaBaseAddr + RDES_RING_END_OFFSET) = tailPointer;
      }
      ```
      注意:`dmaBaseAddr`是指向DMA通道基地址的指针,`RDES_RING_END_OFFSET`是尾指针寄存器在DMA通道寄存器中的偏移。

   b. 在应用程序中,调用这个函数来更新尾指针寄存器:
      ```c
      updateRDESRingEnd(dmaBaseAddr, newTailPointer);
      ```
      其中`newTailPointer`是新的尾指针值,指向更新后的最后一个Rx描述符。

4. 在执行上述操作后,GETH Rx DMA应该能够从暂停状态恢复并开始处理Rx描述符。

请注意,上述代码示例仅供参考,实际实现可能需要根据具体的硬件和驱动进行调整。建议仔细阅读TC3xx用户手册和相关硬件文档,以确保正确实现这些操作。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分