在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用户手册和相关硬件文档,以确保正确实现这些操作。
在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用户手册和相关硬件文档,以确保正确实现这些操作。
举报