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.

[参考译文] AM3354:以太网接收问题

Guru**** 2593120 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/640041/am3354-ethernet-receive-problem

器件型号:AM3354

您好!

我们拥有基于 AM335x 处理器的产品、并且我们正在使用该软件的入门软件。 我们使用的是以太网接口。

在初始化引导以太网接口后、链路建立、我们能够接收和传输数据包。 但在一段时间后、以太网接口无法正常工作。 我们无法接收数据包。

我们进行了调试、发现我们没有 接收到以太网'Rx 中断'。

在 TRM 中、他们提到了以下内容

"写入3PSW 完成指针(RXn_CP)。 主机写入的数据(最后处理的缓冲区的缓冲区描述符地址)与子系统写入的寄存器中的数据进行比较
(子系统使用的最后一个缓冲区描述符的地址)。 如果这两个值不相等(这意味着3PSW 接收的数据包比 CPU 处理的数据包多)、则接收数据包
完成中断信号保持有效。 如果这两个值相等(这意味着主机已处理系统已接收的所有数据包)、则挂起的中断无效。 。
通过读取接收通道完成指针寄存器(RXn_CP)可找到3PSW 期望的值"

因此、我们检查了 CPPI DMA 是否正在处理。 我们选中了 RXHDP (头描述符指针)。 其值为 NULL。  因此 DMA 不知道在哪里写入接收数据包。 我还检查了描述符的状态、所有描述符都归 DMA 所有。 在这种情况下、我们不会得到 NULL。

我们是 AM335x 入门软件代码。 我们使用的是"Enet echo"应用中给定的相同 RX 中断处理程序逻辑。 它是根据 TRM 中给出的软件描述"接收操作"编写的。

所以我们无法理解为什么 RXHDP 描述符变为 NULL? 我们如何调试这个问题?

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们有同样的问题,我们已经用工具读取了 CPSW 的所有寄存器值,并将该值与工作的 CPSW 进行比较。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Uma:

    如此处所宣布- www.ti.com/.../STARTERWARE-SITARA: TI 已完成用于 Sitara 的 StarterWare 的开发。 TI 不再计划对此软件进行更新以进行错误修复或未来增强。 AM335x 客户–处理器 SDK-RTOS 是 StarterWare 的推荐替代产品。 处理器 SDK 包括演示和基准测试、并使代码在 TI 处理器之间的迁移更轻松。

    CPSW EMAC 示例可从适用于 AM335x 的 Processor SDK 中获得、网址 为 software-dl.ti.com/.../index_FDS.html、请参阅:
    processors.wiki.ti.com/.../Processor_SDK_RTOS_EMAC
    processors.wiki.ti.com/.../Processor_SDK_RTOS_NDK

    此致、Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的答复、但我无法理解我们如何通过比较这些值来解决问题。 我们必须具体了解哪些值?

    此致

    Raja

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     我们在 Linux 系统中遇到同样的以太网接收问题, 版本是 Linux 3.14.26 for TI SDK。我们查看 CPSW 寄存器,发现 RX0_CP 为 NULL (0000)。我们可以发送数据包,但无法接收数据包,我们如何处理这个问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您提到的是哪一个 TI SDK 版本? 您是否试用过最新的处理器 SDK Linux - www.ti.com/.../PROCESSOR-SDK-AM335X

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我们使用了 TI SDK 版本--software-dl.ti.com/.../index_FDS.html
    我们已经完成了许多基于 TI SDK 中 Linux 内核3.14.26的软件开发工作、因此我们很难将最新的 Processor SDK Linux 与 Linux 4.9内核结合使用。
    我们想知道造成以太网接收问题的原因,可能是在启动以太网接口初始化后,建立了链路,我们能够接收和发送数据包。 但在一段时间后、以太网接口无法正常工作。 我们无法接收数据包。
    RX0_CP 为 NULL (0000)。
    我们能否在不尝试最新的处理器 SDK Linux 的情况下解决问题、只需通过从 PROCESSOR-SDK-LINUX-AM335X/01_00_00_00/index_FDS.html 修改 Linux 3.14.26的 CPSW 驱动程序代码。

    此致、
    高先生
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Garrett、

    感谢您的回复。 SIR、无论 SDK 是 Starterware 还是 RTOS、都应按照 TRM 14.4.2接收操作中给出的步骤来编写以太网接收操作。

    http://www.ti.com/lit/ug/spruh73p/spruh73p.pdf

    我们将按照  TRM 14.4.2 "软件 接收操作"中给出的步骤进行操作。 但 RXHDP 仍然变为'NULL'。

    调试时、它看起来像是 CPPI DMA 的突然行为。 在处理队列中的一个描述符后、它不处理另一个描述符、而是将 RXHDP 更新为"NULL"、但队列不为空、它包含具有由 DMA 拥有的缓冲区信息的描述符、并且描述符链接正确。

    我想知道为什么我会遇到这个问题、即使我们遵循 TRM 中给出的软件步骤

    谢谢

    Raja  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    此主题中有两种不同的操作系统、我将尝试同时回答这两种操作系统、但我主要支持 Linux。 Linux 用户可能需要提交新线程。 对于用户4238200、是否可以迁移到更高版本的 SDK 和内核?

    附加的是一个 Linux 补丁、它使用 CPDMA 指针的管理方式来更改 cpdma.c 文件。 由于内部 SOC 互连处理指针更新的速度、需要更改存取器函数。 对于 Starterware 用户、请查看此方法是否与当前驱动程序中的方法不同。

    此致、

    Schuyler

    e2e.ti.com/.../0001_2D00_net_2D00_ethernet_2D00_ti_2D00_cpdma_2D00_am437x_2D00_allow_2D00_descs_2D00_to_2D00_be_2D00_plase.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Schuyler

    在我们的示例中、我们没有为 CPPI 描述符使用外部存储器、而是使用 CPPI DMA 描述符存储器。

    此致

    Raja
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    至 user4238200:

    您正在窃取他人的线程。 如有任何问题、请打开您自己的主题帖。 您的问题将不会在此当前主题上得到解答。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Schuyler

    在描述符更新前后、我使用"DSB"汇编指令测试了以太网功能。 在这种情况下、它也会发生故障、即 RXHDP 在一段时间后变为 NULL。

    请指导我解决问题

    此致

    Raja
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    在 AM335x 中、我们是否可以使用外部存储器、例如用于 Tx 和 Rx 缓冲区描述符的 RAM、而不是 CPPI RAM (8KB)存储器?

    此致

    Raja
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Raja、

    是的、您可以在 AM335x 中将外部存储器用作缓冲区描述符、请参阅 Schuyler 补丁中的注释:

    观察到、CPPI 时 cpsw/cpdma 无法正常工作

    描述符放置在 DDR 中、而不是 AM437X 上的内部 CPPI RAM 中

    SoC:

    - RX/TX 无提示停止处理数据包;

    -或-启动后、它可以工作一段时间、但会卡在网络上一次

    负载增加(ping 正常、但 iperf 不工作)。

    (AM335x 和 AM57xx 上未再次出现同一问题)。

    此致、

    Garrett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Raja/Uma、

    对于您在 Starterware 中观察到的 RXHDP 空问题、您可以参阅在 Sitara 处理器上验证的 PDK 驱动程序中的 EMAC_cpsw.c 实现。

    一些相关功能包括:
    *@n@b EMAC_enqueueRx()
    *@n 使用应用程序中的新缓冲区填充任何空的 RX 描述符

    *@n@b EMAC_dequeueRx()
    *@n 对所有已完成的 RX 数据包求解、并为应用提供缓冲区

    *@n@b EMAC_cpswInitRxChannel()
    *@n 此函数设置接收缓冲区描述符。

    请注意、在推送本地描述符队列上的数据包缓冲区之前、存在缓存无效。
    emac_osalCacheInv((void*)pPkt->pDataBuffer,pkt->BufferLen);
    EMAC_pqPush (&PDC->DescQueue、pPKT);

    此致、
    Garrett