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.

[参考译文] AM3358:通过 PRU 进行 DDR 访问

Guru**** 2534260 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/725531/am3358-ddr-access-from-pru

器件型号:AM3358
主题中讨论的其他器件:TIDA-01555

各位专家、您好!

我正在进行一个项目、其中我们使用 PRU-ICSS 从外部器件对数据进行位传输并将其保存到 DDR。 PRU 上运行的代码以汇编语言编写。 使用 SBCO 操作码将数据从 PRU 存储到 DDR 中。 这很好、但常量表似乎仅限于使用前16 MB 的 DDR 存储器。 由于我们使用的 Linux 内核也位于内存的这一部分、因此我们希望使用 DDR 的不同区域。 如果我正确解释了文档、则应该可以使用 SBBO 操作码。 但是、我似乎无法使其正常工作。

因此、这给我两个问题:

  1. 是可以从 PRU 寻址整个 DDR、还是限制在前16 MB
  2. SBBO 操作码是否可用于写入 DDR。 如果是、如何操作?

附件是比较 SBCO 和 SBBO 操作码的小测试。 预期的行为是、它为两个操作码打印相同的内容。 但是、当运行 SBBO 代码时、DDR 存储器不会被写入。

希望您能给我一些关于我所犯的错误的指示。

此致、

Simon Wamelink

e2e.ti.com/.../sbco_2D00_sbbo.tar.gz

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

    您好、Simon、

    您有疑问:您是否正在使用 PRU 软件支持包? 如果是、您使用的是 PRU 软件支持包的哪个版本以及 Linux 的哪个版本?

    常量表条目31是部分可编程的、因此您可以将基址从0x80000000设置为0x80FFFF00 (编辑2018年9月5日)。 通过使用 SBCO、您可以向偏移量为0x0的地址写入地址、偏移量为从编程的基址到偏移量为0xFFFF 的地址(这取决于 PRU 软件支持包中使用的 AM335x_PRU.cmd 链接器命令文件中的 DDR 条目的 len。 根据 PRU 软件支持包的版本、您可能需要将其增加到 len = 0x00010000)。 另请注意、在 PRU 软件支持包中定义常量表条目时、使用"neear"与"far"很重要。

    SBBO 操作码应能够写入 DDR。 下面是我编写的使用 LBBO 在 DDR 地址加载值的示例代码、SBBO 应该类似:

    C 代码:
    #define DDR_8000_0000 (*(volatile unsigned int *) 0x80000000)
    uint32_t DDR0 = DDR_8000_0000;

    汇编器输出:
    LDI R15.w2、32768
    LDI R15.W0、0
    LBBO R0.b0、R15、0、4


    检查您是否提供了 PRU OCP 主端口访问、以便它可以读取 DDR:
    C 代码:
    CT_CFG.SYSCFG_BIT.STANDBY_INIT = 0;//(PRU_ICSS_CFG 寄存器 SYSCFG 位 STANDBY_INIT)

    此致、
    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更新:您的 sbco.p 看起来是写入0x80E00000、而 sbbo.p 是写入0xE0000000。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nick、

    感谢您的更新。 更改 SBBO 操作码的地址后、它确实会按照预期写入存储器。 经过更深入的检查、我在计算要在我们的代码库中写入的存储器地址时出错、导致行为不正确。 解决此问题后、我们可以从 PRU 寻址所有可用存储器。  

    在研究此问题时、我发现了本 文档 、其中 PRU 用于将数据写入乒乓缓冲器。 在本文档随附的代码中、一个保留存储器块被添加到器件树中。 我已向器件树中添加了一个类似的块、以保留 PRU 写入的内存。 之后、一切都按预期工作

    感谢你的帮助。

    此致、

    Simon Wamelink

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

    您好、Simon、

    很高兴一切都像预期的那样正常工作! 对于未来的读者、可以在 此处找到与 TIDA-01555关联的引用代码 Simon

    此致、

    Nick