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:TMDS64EVM PRU RGMII 固件

Guru**** 2893300 points

Other Parts Discussed in Thread: TMDS64EVM, SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1631603/tmds64evm-tmds64evm-pru-rgmii-firmware

器件型号: TMDS64EVM
主题: SysConfig 中讨论的其他器件

我正在在 TMDS64EVM 的 ICSSG1_PRU0 上编写自定义固件(我知道,TI 应用团队未建议或支持,但我无法避免!)。

在花费太多时间调试我遇到的问题之前、TI 是否提供了任何现有的“示例“供我加载、作为完整性检查来确保我的实验室设置正确无误? 我很想看到一些示例 C 代码、但即使是 TI 提供的固件二进制文件、我也可以从其中一个 Arm 内核加载、这有助于确保将数据从板上传输到笔记本电脑。

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

    简单的裸机起点将是 SORTE G

    git.ti.com/.../

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

    谢谢您的支持。 在查看了一些代码后、我有一个总体问题。

    关于配置 PRU、您能否向我解释一下为 R5F 代码保留了哪些类型的功能、以及应该为 PRU 代码保留哪些功能?

    例如、在 SORTE_G 应用程序中 R5F ARM 代码的例程“generic_pruss_init“中、并不只是加载 PRU 固件。 在将固件加载到 PRU 之前、R5F 还会启用 PRU MDIO、初始化 PRU 数据和共享 RAM、写入多个 PRU MII_RT_G_CFG 和 PRU IEP 寄存器。 PRU 还会写入许多相同的寄存器。 为什么并非所有 PRU 寄存器配置(尤其是 MII_RT_G、IEP 和 MDIO 元件)都完全分配给 PRU 代码?

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

    问题的核心是二元化:

    我有问题的核心。 R5F 初始化 PRU 中的寄存器、加载 PRU 固件、然后开始 PRU 执行。 然后、PRU 初始化 R5F 已初始化的许多相同寄存器。 不清楚为什么存在重复、如果 R5F 需要首先执行、那么系统是否存在某种需要这种约束、或者只是监督重复/冗余代码?

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

    此外、在对代码进行修改以适应 TMDS64EVM 上的实现时、 启用 MDIO (MDIO_CONTROL_REG.ENABLE 设置为 1) 后、我无法执行 PHY 设备的任何读取或写入命令 、因为 MDIO_USER_ACCESS_REG.GO 始终设置为 1 并且从不清除(这在 R5F 和 ICSSG1 PRU0 上都会发生)。

    即使我没有 AM643x 电路板、我也尝试将 SORTE_G 项目导入 CCS 以构建示例代码并手动执行该操作。 但是、代码未构建、会抛出错误“Product com.ti.MCU_PLUS_SDK_AM243X v8.6.0.48 当前未安装、并且没有可用的兼容版本“。 TI 网站上未提供该版本的 SDK。 所以我被困在水中... 我需要一种方法在外部复位 PHY 器件(无法使用 PHY 内部寄存器执行软复位)、或者为 SORTE_G 示例安装正确的 SDK、以便我可以查看是否有任何自动生成的 SysConfig 代码在我这边突出显示了缺失的功能

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

    对这一未解决的评论采取后续行动。 如何访问 com.ti.mcu_plus_sdk_AM243X v8.6.0.48 、以便我可以构建您提到的 SORTE_G 工程?

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

    研究 SORTE_G 应用并将其中一些应用应用程序应用于我自己的代码后出现的一些问题:

    1. 对于接收处理、任务管理器子任务由 BK1、BK2、BKN 和 EOF(在 Rx.asm 中实现的例程)触发。 为什么 RX_SOF 没有实现函数触发?
    2. Rx.asm 接收处理函数会在两个 RX L2 FIFO 之间来回 ping 通。 代码假设首先填充存储体 0 数据、并从整个数据中读取、而在使用 R18 中的状态进行读取之前不进行检查。 这是否是因为 SOF 未用作触发器而被假定、而是 BK1、因此我们知道寄存器中的所有 32 个字节都已填充?
      1. 对于新事务、组 0 是否始终会在组 1 之前先填充? 否则、例程如何假设组 0 开头?
    3. 参考手册中指出“XFR 读取事务是被动的、对 RX L2 中的任何状态或其他状态都没有影响“。 我一直在从 RX L2 FIFO 中读取重复数据、并想知道这是否是因为没有正确地从 L2 FIFO 中弹出数据。 xfr2vbus 操作是否假定新数据在将其 DMA 到共享存储器后将被覆盖?
    4. 为什么 rx.asm 代码不检查 32 字节数据块的部分块? 在 EOF 触发任务的情况下、这是否意味着数据已经完全写入、并且可以安全地假设不可能进行部分读取?
      1. 即使在 EOF 是触发事件且写入所有数据的情况下、如果传输的数据量小于 32 字节、该怎么办? 代码如何筛选出 XIN 从 FIFO 复制的无关数据?
      2. 在 rx.asm 例程 rxio_eof 中、再次假设该代码从 RX L2 FIFO 组 0 进行复制。 此假设始终如何保持不变、尤其是因为 Bn 触发例程 rxio_nB 在两个 FIFO 组之间进行 ping 通?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    回答您的问题:

    1.RX_SOF 在 RX_L2 中没有任何数据。 没有要接收的内容。 它可用于准备即将进入 RX_L2 的新数据包的描述符等。 但是、不需要 SORTE 示例

    2. RX 复位后,硬件总是先发送到存储体 0 ,然后再发送到存储体 1。 在数据包结束时、固件发出 RX 复位。  

    3.请注意、您讨论的是 RX_L2 宽边或 XFR2VBUS 宽边。 可能两者都是。 来自 RX_L2 的 XIN 不影响 RX_L2 内容。 您可以再次读取该数据并获取相同的数据、除非从 RGMII 接口覆盖该数据。 XOUT 至 XFR2VBUS 将寄存器内容发送到存储器 — 触发后忘记。  

    4. EOF 情况:代码应支持任何奇数帧长度。 临界情况例如、在 32 或 64 字节边界处、其中实际长度为 63、64 或 65 字节。 EOF 可能已在同一时间或在下一个挡块之后稍稍出现。  以下代码片段显示了使用 R18.b0 处理 bank0 和 bank1 的剩余字节。 它将 R18.b0 移动到 R0.b0 以使用  xin   RXL2_SideA、&R2、b0 进行最终发送

    rxio_eof:
     .if $defined(PRU0)
        xout    BANK0_ID, &r0, 27*4     ; save R0-r26
     .else
        xout    BANK1_ID, &r0, 27*4     ; save R0-r26
     .endif
       zero    &r10, 8
       ldi	   TEMP_REG_1.w0,  IN_DATA_BASE_ADDR_PTR ; load the pointer to the controller in data base address
       lbco	   &r10, PRU0_DMEM_CONST, TEMP_REG_1.w0, 4
       add     r10.w0, r10.w0, r28.w2      ; update the base address with new offset with respect to incoming frames
       add     r10.w0, r10.w0, r27.w0
       xin     RXL2_SIDEA, &r18.b0, 1	; get the RXL2 write pointer
       XOR     TEMP_REG_1.w2, r18.b0, r27.w0; Using XOR to idendify if more than 32 bytes are in RX L2. If bit 5 is set, then it is more than 32 bytes.
       ;check if >=32 bytes is in the ring buffer. True if bit 5 of TEMP_REG_1 is set. If yes, store first those 32 bytes.
       qbbc rx_io_eof_fifo_empty, TEMP_REG_1.w2, 5
       qbbs    skip2, r27.w0, 5 ; check for the RXL2 side
       xin     RXL2_SIDEA, &r2, 32
       qba     rx_io_eofsave1
    skip2:
       xin     RXL2_SIDEB, &r2, 32;
    rx_io_eofsave1:; if the remaining bytes>32, save the first 32 byte here
    	xout    xfr2vbus_wr0, &r2, 38  ;  ;store this 32 bytes in memory
    	add     r27.w0,r27.w0, 32
    	add     r10.w0,r10.w0,32;updated the write address pointer in shared memory
    rx_io_eof_fifo_empty:  ; check if R18.b0 is 0 or 32 -> if true, no more bytes are needed to be stored
    	qbeq    case1, r18.b0, 0
    	qbne    rx_io_eofsave2, r18.b0, 32
    case1:
    	qba 	 makecrc
    rx_io_eofsave2:; if the remaining bytes>32, save the remaining byte here
    	AND    r18.b0,r18.b0, 0x1F;correct R18.b0 for the amount of bytes to store if value is >32. example R18.b0 shows 35 -> correct to 3 bytes
    	mov    r0.b0, r18.b0
    	zero   &r2, 32
        qbbs    skip1, r27.w0, 5 ; check for the RXL2 side
    	xin     RXL2_SIDEA, &r2, b0;
        qba     rxio_eof_cont1
    skip1:
    	xin     RXL2_SIDEB, &r2, b0;
    rxio_eof_cont1:
        xout    xfr2vbus_wr0, &r2, 38  ; dma to buffer
        add     r27.w0, r27.w0, r18.b0
      	add     r10.w0, r10.w0, r18.b0; updated the write pointer

    -托马斯

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

    谢谢!

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

    关于 xfr2vbus 运行的另一个问题。 运行它时、我从 Tx L2 FIFO 中提取数据:

     XIN RXL2_BANK0_XID、&R2、32

    然后使用传输检查的写入状态:

    DMA:
     XIN 0x62、&R20、1
     qbeq DMA、R20、1

    使用 xfr2vbus 命令将其发送出去:

      XOUT XFR2VBUS_WR_XID、&R2、32

    首次执行此代码时、写入状态检查显示为“IDLE“、因此会立即超过条件检查。 但是、数据绝不会显示在存储在 R10 中的地址中。

    第二次、R20 中的状态存储卡在 1、表示传输处于活动状态、但绝不会清除回 0。 因此、原始传输无效(目标地址中没有数据)、XFR 操作受阻、无法再次访问。 如何调试其原因?