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.

[参考译文] TMDS64EVM:RGMII RX L2 FIFO MAC 滤波器

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1645178/tmds64evm-rgmii-rx-l2-fifo-mac-filter

器件型号: TMDS64EVM

AM64X TRM 的“6.4.11.2.3.7.6.4 PRU_ICSSG RX L2 滤波器块“部分列出了寄存器 MAC_PRU[0/1]_[0/1],以根据传入数据包的目标地址过滤传入数据包。

关于如何使用这些资源、是否有任何示例或更多阅读内容? 只向这些寄存器写入值并不能进行任何滤波、我没有找到任何使用这些寄存器的 SDK 示例、并且在 TRM 中的任何时候都没有对这些寄存器进行进一步讨论。

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

    RX L2 分类器具有 2 种在传入帧上同时运行的滤波器:

    • FT1 MAC 过滤器(类型 1)-使用模式+掩码比较、8 个过滤器与 6 字节以太网目标地址 (DA) 字段匹配
    • FT3 内容过滤器(类型 3)- 16 个过滤器在有效载荷内的可配置字节偏移处匹配任意帧内容(64 位模式)

    滤波器的寄存器配置 (FT1)

    e2e.ti.com/.../ft1_5F00_filter_5F00_setup.sh

    Bash 脚本针对其两个 PRU(可编程实时单元)内核 (PRU0 和 PRU1) 配置硬件 MAC 地址数据包过滤器。

    该脚本配置两个 FT1(帧类型 1)滤波器、以匹配 IEEE 1588 PTP / 802.1AS 时间同步协议使用的特定以太网目标地址 (DA) 多播 MAC 地址。

    filter1_3 — 范围匹配  (filter1_3 表示 FT1 第 3 个滤波器、有 8 个 FT1 滤波器)
    匹配整个 IEEE 802.1AS 保留的多播范围:


    01:80:C2:00:00:0x(其中 X = 0 到 F)
    最后半字节 X 通过 DA_MASK1 = 0x0F00 进行屏蔽、在该字节位置允许任何值 0x00–0x0F。
    这涵盖范围中的所有 16 个地址(例如,01:80:C2:00:00:00 到 01:80:C2:00:00:0E)。

    filter1_4 — 完全匹配
    仅匹配一个特定的 IEEE 1588 PTP 多播地址:


    01:1B:19:00:00:00
    两个掩码寄存器都设置为 0x0—完全匹配、没有通配符位。
    寄存器布局
    对于每个滤波器 k、寄存器遵循以下寻址公式:

    寄存器 PRU0 基址偏移 PRU1 基址偏移
    FT1_START_LEN 0x80 0x64C
    FT1_CFG 0x84 0x650
    DA0 0x88 +(k× 0x10) 0x654 +(k× 0x10)
    DA1 0x8C +(k× 0x10) 0x658 +(k× 0x10)
    DA_MASK0 0x90 +(k× 0x10) 0x65C +(k× 0x10)
    DA_MASK1 0x94 +(k× 0x10) 0x660 +(k× 0x10)
    均相对于基地址 0x300B3000。

    MAC 字节排序说明
    MAC 字节存储在 32 位寄存器中为小端字节序:


    适用
    MAC:01:80:C2:00:...
    da0:0x00C28001→[byte3:byte2:byte1:byte0]= 00:C2:80:01
    执行流程

    适用
    对于每个滤波器 (3、然后 4):
    设置 FT1_START_LEN→检查从偏移 0 开始的 6 个字节(DA 字段)
    2.设置 FT1_CFG→将滤波器模式配置为“相等“(值为 0x5555)
    3.写入 DA0/DA1→MAC 模式以匹配
    4.写入 MASK0/MASK1→0=精确匹配;非零位=通配符/范围
    5.读回所有寄存器以验证写入成功
    (对 PRU0 和 PRU1 重复)

    固件代码

    固件:捕获整个 RX 分类器状态快照:rx_flags、ft1_valid、ft1_match、ft3 valid/match、rate、 类字段一次全部进入 R11–R17、等待结果就绪。

    FILTER_CLASSIFIER_RESULTS_NOT_READY:
        xin     22, &R11, 28                ;total 28 bytes of flags
    
        ; ft1_valid → R12.b0 = FT1_VLD
        qbne    FILTER_CLASSIFIER_RESULTS_NOT_READY, R12.b0, 0xFF
    
    FILTER_CLASSIFIER_RESULTS_DONE:
    
    qbbs    PTP_MATCH, R12.b1, 3
    
    More comments:
    ;xin	Transfer instruction — reads data from a broadside (BS) peripheral into PRU registers
    ;22	Broadside ID — BS ID 22 = MII_G_RT RX Classifier
    ;&R11	Destination start register — load data beginning at R11
    ;28	Number of bytes to read — fills R11 through R17 (7 registers × 4 bytes)

    BR
    Jc.

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

    我不是在 Arm 内核上运行 Linux、而是在轻量级 NoRTOS 实例上运行。 我会从头开始编码 PRU。 因此、即使我无法运行该批处理文件、我仍假定将该脚本中的命令转换为 PRU 上的可执行代码行应该具有相同的效果、对吧? 我是否需要注意是否仅在 PRU 代码中执行这些操作?

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

    100%、 从 PRU ASM 到 HW 寄存器的 sbco 应该足够、C 代码 — 避免由于编译器优化而对寄存器读取  /写入重新排序。

    例如:

    LDI32 r1, 0x300B3000
    LDI32 r0, 0x00060000
    SBBO &r0, r1, 0x64C, 4

    BR、
    Jc.

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

    这里有一个问题、使用本地寻址而不是主域存储器映射;否则、VBUS 请求通过互连总线路由、而不是内部 ICSS VBUS 总线、会产生延迟、但两者都应该起作用。

    例如: 如果在 ICSSG 中访问、0x00032000 是本地地址 —   MII_G_RT 基地址

    检查 表 2-4。 AM64x TRM 中的 PRU_ICSSG0/1 存储器映射

    BR
    Jc.

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

    几个问题:

    1) TRM 在几个地方指出“RX L2 滤波器... 只有当过滤器未激活时、属性才会更新“。 什么决定了滤波器是处于活动状态还是非活动状态?

    2) 您提供的示例是否有任何理由设置 Filter1_3 和 Filter1_4、而不是 Filter1_0 和 Filter1_1?  我假设如果适当地调整了寄存器偏移、两者都可以起作用。

    3) 在设置滤波器之前、我使用任务管理器在根据 ICSSG_RX_CFG.BK1_SIZE/BK2_SIZE/BK_SIZE 和 RX_EOF 中设置的值接收字节时触发接收处理(根据表 6-97 任务到事件映射中定义的事件)。 在上面显示的“固件代码“中、您正在使用带有宽边 ID 22 的 XIN 操作来检测新数据。 根据我当前的任务管理器事件触发器、筛选器是否仍然有效、或者我是否必须改用“表 6-137 “中的状态值。 MII_G_RT RX 分类器宽边映射“来确定接收到哪些有效帧?

    我问、因为我正在按照您对 Filter1_0 寄存器的步骤进行操作、我不进行任何滤波:

    MEM_REG_M (ICSSG1_MII_G_RT_FT1_START_LEN_PRU0)= 0x60000u;// FT1_LEN = 6、FT1_START = 0
    MEM_REG_M (ICSSG1_MII_G_RT_FT1_CFG_PRU0)= 0x555555u;// FT1_nCFG = 1(相等)
    MEM_REG_M (ICSSG1_MII_G_RT_FT1_0_DA0_PRU0)= 0xBAE1BA11u;
    MEM_REG_M (ICSSG1_MII_G_RT_FT1_0_DA1_PRU0)= 0x000011E2;
    MEM_REG_M (ICSSG1_MII_G_RT_FT1_0_DA_MASK0_PRU0)= 0x0;//屏蔽无位
    MEM_REG_M (ICSSG1_MII_G_RT_FT1_0_DA_MASK1_PRU0)= 0x0;//屏蔽无位

    这些值反映为写入 CCS 存储器浏览器中的值。 我尝试为设备建立的 MAC 地址是 11:BA:E1:BA:E2:11

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) TRM 在几个地方指出“RX L2 Filter... 只有当过滤器未激活时、属性才会更新“。 什么决定了过滤器是处于活动状态还是非活动状态?

    在帧接收期间、一旦 RX 帧字节计数器达到滤波器编程的起始位置、滤波器就处于活动状态。 它在该点之前或在没有接收帧时处于非活动状态。


    最安全和推荐的方法是在初始化过程中、在任何数据包到达之前配置过滤器属性。 这可保证过滤器在配置时处于非活动状态。 如果您尝试在数据包已经流动的情况下更新过滤器属性、您将面临帧中接收过滤器的风险、这意味着:

    在更新期间、可能无法正确过滤一个或两个数据包

    动态范围规格
    如果必须在操作期间更新、向 FL1_START 写入新值将重置过滤器并清除其状态位、从而提供一个短暂的非活动窗口 、但这仍然不能保证在所有飞行数据包中是干净的。

    我的建议
    在初始化时、流量开始前配置一次过滤器属性、以确保过滤器行为正确且可预测。

    2) 您提供的示例是否有理由设置 Filter1_3 和 Filter1_4、而不是 Filter1_0 和 Filter1_1 ?  我假设如果我适当地调整了寄存器偏移、两者都可以起作用。

    正常工作。 我怀疑您的 RX 是否仍在研究您发布的其他 E2E 主题。

    上面显示的“固件代码“中、您正在使用带有宽边 ID 22 的 XIN 操作来检测新数据。 [/报价]
    XID 22 是 RXL2 加速器的宽边 ID。  它不是数据、而是用于读取 RXL2 滤波器结果。
    根据我当前的任务管理器事件触发器、过滤器是否仍能正常工作、

    RX L2 滤波器结果在宽边存储器中保持不变、除非发生 RX L2 完成事件或 SW 写入 FT_START、此时结果被清除。

    BR
    Jc.

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

    如果您指的是我的线程 TMDS64EVM:PRU RGMII 接收数据包数据损坏了? -处理器论坛 — 处理器- TI E2E 支持论坛 指出我的 RX 通常是坏的、是的、这也是一个更大的问题。

    但根据您的回复、请告诉我以下假设是否正确、有关过滤:

    1) 设置过滤器以在初始化期间检查 DA 状态

    2) 无论过滤器状态或配置如何、正常处理期间都将在 Rx L2 FIFO 中接收数据

    3) 当我的任务管理器触发函数在接收到新数据包的第一个数据块时被调用、请检查过滤器 RxL2 滤波器状态位 R12.FT1_MATCH

    3A) 如果设置了 FT1_MATCH 位、则从 FIFO 弹出数据并将其复制到共享存储器中进行处理

    3B) 如果未设置 FTI_Match 位、则会从 FIFO 中弹出数据并将其丢弃(不复制到共享存储器)

    这是正确的思考方式吗? 我必须在所有情况下都弹出 RX L2 FIFO、以便新数据进入进来、但我可以选择保留弹出的数据或根据 FT1_MATCH 的状态丢弃该数据?

    如果在接收数据时有更好的方法来使用筛选器、我会对想法持开放态度。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 在初始化期间设置过滤器以检查 DA 状态

    没错。

    [引述 userid=“685763“ url=“~/support/processors-group/processors/f/processors-forum/1645178/tmds64evm-rgmii-rx-l2-fifo-mac-filter/6346828

    2) 无论过滤器状态或配置如何、正常处理期间都将在 Rx L2 FIFO 中接收数据

    [/报价]

    没错。

    3) 当我的任务管理器触发函数在接收到新数据包的第一个数据块时被调用时、检查过滤器 RxL2 过滤器状态位 R12.FT1_MATCH

    没错。

    3a) 如果设置了 FT1_match 位、则从 FIFO 中弹出数据并将其复制到共享内存中进行处理

    这取决于您的用例。

    我必须在所有情况下都弹出 RX L2 FIFO、以便新数据输入、但我可以选择保留弹出的数据或根据 FT1_MATCH 的状态丢弃该数据?

    没错。 如果不 POP FIFO、则会发生数据溢出、您可能会遇到如下所示的错误统计信息、其中会对 RX L1 FIFO 施加背压。

    6.4.14.12.67 MII_G_RT_RX_STAT_ULATION_ERR_PRU0 寄存器(偏移= 574h)=> AM64x TRM

    如果有更好的方法来处理接收数据时如何使用过滤器、我会接受想法。

    在您的另一个主题中添加了一个小片段、请查看  

    BR
    Jc.

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

    谢谢、我们可以结束这一主题、专注于解决另一个主题中的问题。