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.

[参考译文] AM6442:如何防止 R5 通过存储器地址 (0x6000_0000) 直接访问 NOR 闪存?

Guru**** 2978480 points

Other Parts Discussed in Thread: AM6442

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1647624/am6442-how-to-prevent-r5-from-directly-accessing-nor-flash-via-memory-addresses-0x6000_0000

器件型号: AM6442

我们遇到了 NOR 闪存内容 (U-Boot) 偶尔损坏、导致引导失败的问题。

我们的初始分析表明、R5 程序中的通配符指针可能会覆盖地址 0x6000_0000 附近的数据。 我们没有将此区域配置为 R5 可读/可写、这是否意味着默认情况下可以访问?

我们知道防火墙机制可能限制对某些存储器区域的 R5/A53 访问。 由于引导加载程序损坏是不可接受的、因此我们希望防止意外访问 NOR 闪存。

配置这样的防火墙是否是正确的方法? 如果是、您能否分享指导或相关文档?

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

    您好:

    我们明白防火墙机制可能会限制 R5/A53 对某些存储器区域的访问。 由于引导加载程序损坏是不可接受的、因此我们希望防止意外访问 NOR 闪存。

    NOR 闪存不是存储器映射器件、因此它可能不会直接被防火墙保护。 在 DAC 模式下、闪存映射为仅供读取的存储器映射器件、因此您可能不会使用防火墙来阻止写入闪存。

    相反、您可以对 FSS 控制器寄存器空间进行防火墙保护、以确保只有预期实体可以使用寄存器空间与闪存通信。 请注意、只有在防火墙初始化之后、此访问控制才会在运行时进入图片。

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

    您好、Prashant

    >在 DAC 模式下、闪存映射为仅供读取的存储器映射器件、因此您不能使用防火墙阻止写入闪存。

    =>在我的环境中、它似乎不是只读的、而是可写的。 这是否与我的 R5 程序中的 syscfg 设置相关?

      如有必要、我可以上传我的 syscfg 文件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    =>在我的环境中、它似乎不是只读的、它似乎是可写的。 这是否与我的 R5 程序中的 syscfg 设置相关?

    这些驱动程序使用 INDAC 模式来写入闪存。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉,我有点困惑 — 让我整理一下我目前所理解的内容。

    首先、NOR 闪存使用 INDAC 模式、因此对存储器地址 0x6000_0000 的写入操作可以直接修改 NOR 闪存。

    然后、防火墙可以应用于 FSS 控制器 (FSS0_OSPI_0、0x0FC2_0000)、但不能应用于 0x6000_0000 处的 FSS0_DAT_REG1。

    南... 我不确定我们是否在 FSS 控制器上配置防火墙、它是否可以防止 R5 代码中的野生指针写入 0x6000_0000 并破坏 NOR 闪存?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、NOR 闪存使用 INDAC 模式、因此对存储器地址 0x6000_0000 的写入操作可以直接修改 NOR 闪存。

    INDAC 需要通过 R/W 命令与闪存进行通信 DAC 允许将闪存映射到存储器、但仅支持读取。 因此、直接指针解除引用不能向闪存写入任何内容。

    无论如何、我没有看到任何 FWL ID 从 0x60000000 开始保护地址空间、因此该地址空间不会出于任何目的受到防火墙保护。 您可以为 FSS 寄存器地址空间设置防火墙、以仅允许某些实体与闪存通信。

    在 TRM 的“3.8.3.1 基于区域的防火墙“部分中提供了防火墙列表。

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

    > INDAC 需要通过 R/W 命令与闪存通信 DAC 允许将闪存映射到存储器、但仅支持读取。 因此、直接指针解除引用不能向闪存写入任何内容。

    =>这正是让我感到困惑的地方。 我们在 R5 程序中添加了一些测试代码、并确认 NOR 中的数据实际上可以通过 0x6000_0000 进行修改。

    在 R5 syscfg 文件中、有一些与闪存相关的剩余配置、我们实际上不需要、因为 R5 代码甚至不需要访问闪存。 这些设置是否是可以通过 0x6000_0000 直接修改 NOR 数据的原因?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    =>这正是让我感到困惑的地方。 我们在 R5 程序中添加了一些测试代码、并确认 NOR 中的数据实际上可以通过 0x6000_0000 进行修改。

    您能否验证闪存内容本身以检查其是否实际损坏? 基本上、重启器件并检查闪存内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在上面的图 2 中、左侧的数据在 R5 测试程序运行(损坏)后从 NOR 中转储、而右侧的数据在 R5 测试程序运行之前转储。
    我们多次重复此测试、并在前后执行三个转储以进行比较、确认数据确实已损坏。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在上面的图 2 中、左侧的数据在 R5 测试程序运行(损坏)后从 NOR 中转储、而右侧的数据在 R5 测试程序运行之前转储。

    “之前“和“之后“不显示真实的画面。 您看到的零可能只是 FSS 控制器方法、用于表明 DAC 写入被拒绝、闪存内容可能不会损坏。

    测试完成后、您必须冷重启设备并仅检查内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    INDAC 要求通过 R/W 命令与闪存进行通信 DAC 允许将闪存映射到存储器、但仅支持读取。 因此、直接指针解除引用不能向闪存写入任何内容。

    您好 Jun、

    我 只是想在这里澄清一下。  

    上述语句是正确的、但对于 DAC 和 INDAC 读取、ospi 控制器将使用读取和写入命令。 例如、对于 s28hs512t 闪存、8d 读取命令为 EEh、然后在波形上执行 DAC 或 indac 读取时、您首先会看到发送的 EEh 分量后跟地址或闪存偏移、然后在 DN 线路上接收数据。

    此致、

    Vaibhav

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我从头开始重新运行整个测试、包括您提到的冷重启验证。 我的结论仍然相同:当我在 R5 应用程序中写入地址 0x6000_0000 时、NOR 闪存中的数据被修改。 以下是我详细的测试步骤和结果。
    在 AM6442 平台上、我们使用不带 NOR (tiboot3 + tispl + u-boot) 和 NAND (Linux) 的设置。 Linux 在 A53 内核上运行。 R5 应用程序中添加的测试代码如下所示。
    首先、在 R5 程序开始尝试修改地址 0x6000_0000 之前、我转储 Linux 中的 NOR 内容、并获得了 before1.dump 和 before2.dump。 这两个转储中的数据是相同的。
    然后、在 R5 程序持续尝试修改 0x6000_0000 后、我在 1.dump 之后生成了。 此时、after1.dump 仍然与 before1.dump 相同。
    在 R5 程序继续其写尝试几次后,我再次转储 NOR 内容并获得 after2.dump。 在此阶段、after2.dump 显示出与 before1.dump 的差异。
    接下来、我关闭设备电源、断开所有外部电缆的连接、并使其保持关闭状态约两分钟、然后再次打开电源。 因此、没有 UART 输出(因为 R5 程序修改了 NOR 中的 tiboot3 区域)、可以观察到器件直接进入 DFU 模式(当在 NOR 中找不到有效的 tiboot3 时会发生这种情况)。
    此时、我认为可以确认中的数据也没有损坏。 但是、我还接着通过 DFU 模式将 tiboot3 + tispl + u-boot 加载到 RAM(未更改 NOR 中的数据)并直接引导 Linux。 然后我再次转储 NOR 内容、并获得 COLD_reset1.dump 和 COLD_reset2.dump。
    结果表明 COLD_reset1.dump 和 COLD_reset2.dump 与 after2.dump 相同、并且不同于 after1.dump(after1 与 dump 之前相同)。 这证实了 NOR 数据确实已被修改。 修改后的数据也与我的测试代码行为相匹配(0x100 字节被 0x00 覆盖)。
    我怀疑在我们的设置中确实存在与您描述的行为不同的行为。 这是否与我们使用 U-Boot + Linux + R5 应用组合有关?
    它们之间是否存在某种交互(例如由 U-Boot 或 Linux 中的 NOR 驱动程序执行的某些默认配置)、使地址 0x6000_0000 可写、并允许它影响 NOR 中的实际数据?
    在 U-Boot 和 Linux 中、我们都使用“JEDEC、SPI-NOR“作为 NOR 驱动器。 您认为还有其他方面值得调查吗?

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

    感谢您的答复。 我对 NOR 驱动程序不是很熟悉、但驾驶员是否可以配置某些模式、从而导致我观察到的行为?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 R5 程序继续其写尝试几次后、我再次转储 NOR 内容并获得 After2.dump。 在此阶段、after2.dump 显示出与 before1.dump 的差异。

    这是否意味着腐败在一些尝试后发生、但不是在最初发生?

    它们之间是否可能存在一些交互(例如,U-Boot 或 Linux 中的 NOR 驱动程序执行的某些默认配置)、这使地址 0x6000_0000 可写入、并允许其影响 NOR 中的实际数据?

    硬件本身不支持 DAC 写入、因此与软件配置无关。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是否意味着在一些尝试后发生了损坏、但不是第一次发生?

    是的、NOR 损坏不会在第一次尝试时发生、也不会在固定尝试时发生。 相反、它在多次尝试后发生不可预测的情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在让 OSPI 专家循环、因为最新问题与 DAC 写入有关。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢。 如果有任何更新或新发现、请随时与我联系。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jun、  

    有关专家目前正在接受全天培训。 请期待明天作出响应。

     

    此致、

    Yashraj

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

    您好 Jun、

    我将对以下内容进行测试:

    1. 在 SDK 提供的应用程序(即 ospi_flash_io)中、我们将运行以下步骤。
    2. 在已知偏移处使用已知数据执行擦除和 DAC 写入。
    3. 读回数据并比较其是否正确。

    当前 NOR 闪存写入是间接的、但我们将使用 DAC 写入进行测试、看看在我的设置中是否出现类似的行为。

    阿里亚曼 Chaurasia 请看看这个。 谢谢。

    此致、

    Vaibhav

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

    您好 Jun、

    DAC 写入不适用于串行 NOR 闪存。

    我已经执行了实验,如上所述的 Vaibhav。

    执行擦除操作后、可以得到以下预期输出:

    但是、在执行 DAC 写入后、会得到以下不正确的输出:

    因此、我遇到了数据不匹配的问题:

    这些输出是预期的、因为控制器 IP 不支持 DAC 写入。 对于 DAC 写入、串行 NOR 闪存需要虚拟地址来启用 DAC 写入。 由于控制器在轮询模式下无法发送虚拟地址、因此无法支持 DAC 写入。

    此致、

    Aryamaan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们已暂时启用硬件级写保护。 访问地址 0x6000_0000 无法覆盖我们环境中的 NOR 闪存数据的根本原因仍然不清楚。 如果有任何新发现、我们将提供最新信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jun、

    您能否分享正在使用的闪存器件名称?

    [引述 userid=“666707“ url=“~/support/processors-group/processors/f/processors-forum/1647624/am6442-how-to-prevent-r5-from-directly-accessing-nor-flash-via-memory-addresses-0x6000_0000/6375640

    DAC 写入不适用于串行 NOR 闪存。

    我已经执行了实验,如上所述的 Vaibhav。

    执行擦除操作后、可以得到以下预期输出:

    [/报价]

    我在以上回复中进行的 DAC 写入实验是在 AM64x 板上安装默认闪存器件时进行的、即 S28HS512T Serial NOR OSPI 闪存。

    此闪存部分需要来自 OSPI 控制器的虚拟地址、控制器不支持该地址。 但是、DAC 写入可能适用于不需要虚拟地址的自定义闪存。

    此致、

    Aryamaan

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

    您好、Aryamaan、

    我们使用支持双/四通道 SPI 的 W25Q64JWTBJQ 串行闪存。
    BR
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jun、

    感谢您的更新。 在查看 W25Q64JWTBJQ 闪存器件数据表后、我看不到会阻止 DAC 写入工作的限制、因为可以在不发送任何虚拟地址的情况下读取状态寄存器。

    是的、DAC 写入操作确实适用于您的闪存器件、您也已在上述实验中对该器件进行了验证。

    关于您最初提出的阻止访问 NOR 闪存的问题、我注意到数据表具有块保护功能、可用于防止访问某些闪存区域。

    这些块保护位可用于防止 R5 内核直接访问闪存地址。

    此致、

    Aryamaan

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

    您好、Aryamaan、  

    感谢您的确认。

    因此、这种行为差异是由所使用的 NOR 闪存的特性差异引起的、对吧?

    我们已经启用了块保护、我们还将对 R5 程序中的野生指针和越界访问等潜在问题进行更彻底的调查。

    感谢您的帮助!

    BR

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

    您好 Jun、

    是的、您的理解是正确的。 该行为仅由所使用的 NOR 闪存的不同特性引起、尤其是状态寄存器的读取方式差异。

    很高兴知道已启用块保护! 这应该可以防止 R5 内核对闪存区域进行任何不必要的访问。

    此致、

    Aryamaan