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.

[参考译文] AM625:SBL 阶段 2 中的 OSPI PHY 调优故障

Guru**** 2576215 points
Other Parts Discussed in Thread: UNIFLASH, SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1559018/am625-ospi-phy-tuning-failure-in-sbl-stage-2

器件型号:AM625
Thread 中讨论的其他器件:UNIFLASHSYSCONFIG

工具/软件:

代表客户发帖。

我们在该项目中面临着紧迫的问题。 在我们的耐久性测试中、我们遇到了很多常见的 PHY 调优问题。

最初我们看到了单次发生、但在添加更多调试日志后、我们能够连续重现数百个 PHY 调优故障链(导致启动过程重新启动)。 重试几小时的 PHY 调优后(因此至少硬件并不会失效)。

此外,与此相关的是,在同一个测试中,我们重现了频繁的垃圾收集问题,指出了一般的闪存问题。

我们添加了日志并重现了该问题。 当我们无法写入闪存时、dmesg 显示:

SPI-NOR spi0.0:发生编程错误

在我们拥有的所有 RAM 配置中、这两个问题都可在多个器件上重现。

该模式如下所示、并发生在 R5 上的 SBL 第二阶段 (SBL2) 中:

[2025-06-06 07:47:09.614] SBL1:1210.0.1.0
[2025-06-06 07:47:09.721] SBL2:1210.0.1.0
[2025-06-06 07:47:09.721] ReadData prog_req_flag fail
[2025-06-06 07:47:09.756] ERROR: Flash_norOspi_enablePhy:1222: Flash_norOspi_enablePhy : PHY enabling failed!!! Continuing without PHY...
[2025-06-06 07:47:09.858] SBL1:1210.0.1.0
[2025-06-06 07:47:09.949] SBL2:1210.0.1.0
[2025-06-06 07:47:10.011] j-A
[2025-06-06 07:47:10.243] NOTICE:  BL31: v2.8(release):v2.8-226-g2fcd408bb-dirty
[2025-06-06 07:47:10.259] NOTICE:  BL31: Built : 23:20:15, Mar  4 2024
[2025-06-06 07:47:10.871] INIT: version 2.96 booting
 

如果发生问题、我们会重新启动器件、因此我们没有机会查看它是否会在 Linux 中仍然是一个问题。

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

    尊敬的 Cong:

    感谢您分享测试结果。

    我会在某个时候更新最后一列。

    此致、

    Vaibhav

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

    更新了:

    是(跨 SBL OSPI Linux 阶段 1 和阶段 2 添加了多个日志、以调试故障(如果有)
    • 更改 1:时钟频率设置为 16666666666 Hz
    • 更改 2:只需禁用 DMA
    166666666. 4. (在第 1 阶段和第 2 阶段) (在阶段 1 和阶段 2 中) 0/1498 次循环 我们能否在大约 5K 个周期内对此进行测试? 0/6135.  

    日志: e2e.ti.com/.../DisableDMA_5F00_full.txt

    谢谢

    (续)

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

    尊敬的 Cong:

    请在 IST 下午 2:45 之前加入 MSFT 呼叫。 我需要讨论有关 DMA 的一些事项(比如是否需要 DMA,等等)。 这将基于读取的字节数。)

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    我在会议中等待

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

    你好、Vaibhav、

    这是日志:

    e2e.ti.com/.../Read_5F00_byte.txt

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

    尊敬的 Cong:

    不需要对 Cong 执行任何操作:

    正如在呼叫中看到的、也有 在两个阶段都启用 PHY 并且在两个阶段都禁用 DMA 时无故障 S. 已针对 6000 多个周期进行测试、未发现故障。

    此外、我还解释了 DMA 的使用时间(传输> 1KB)、否则将不会使用。

    如前所述、间接读取不会使用 dma、如文件 ospi_v0.c 下的源代码中所示

    仅在实现 DAC 读取(传输> 1KB)时、才会按照文件 ospi_v0.c 中所示使用 DMA

    需要从 Cong 执行的操作:

    现在来看最后一种情况 PHY 和 DMA 在两个阶段都启用、这里我们看到 1600 个周期中出现 1 个故障

    这不需要专门归因于 DMA、但我们可以进行一些修改和实验。

    1.在 ospi_v0.c 中的 OSPI_readDirect 下、在行返回状态之前;请编写以下代码段:

      /*禁用直接访问模式*/
      CSL_REG32_fins (&preg->config_REG
              OSPI_FLASH_CFG_CONFIG_REG_ENB_DIR_ACC_CTLR_FLD、
              0)
    2.确保在 OSPI_readDirect 中传递的缓冲区对齐。 所以,我说的是以下内容:
    /*使用 DMA 时、读取缓冲区必须对齐缓存行、我们对齐到 128B、尽管 32B 足够*/
    uint8_t receiveBuffer[1024]__attribute__((aligned (128U)));
    上面是一个 1KB 缓冲区、我们针对该缓冲区执行 DMA 传输、因此我们已将其声明为缓存对齐。 请与软件团队联系、并确保用于 readDirect 的缓冲区已对齐。
    只有上述 2 项更改才能在启用 PHY 和 DMA 以及 166MHz 条件下进行足够、分频器为 4。
    请让它运行约 3K 个周期、并告诉我。
     

    此致、

    Vaibhav

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

    你好、Vaibhav、

    关于#2 点

      加载映像时、我们只需使用 OSPI_readDirect。 我们使用 TI MCU+ SDK 中的一些 API 、例如 App_Load SELFcoreImage、App_Load 和 App_Load; 我们认为这些函数内部的读取缓冲区已经对齐。

    下面是 我们进行实验来证明这一点的日志:

    我想我只应用#1 并运行 3K 个周期

    有道理吗?

    谢谢

    (续)

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

    尊敬的 Cong:

    所以我想我只是应用#1 并运行 3K 个周期

    是、请继续。

    我们期待着同样的结果。 同时、如果您看到故障、请在此处 ping。

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    当我们做修改#1 时、ECU 无法成功引导至 Linux。 它是卡在某个地方:(

    谢谢

    (续)

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

    尊敬的 Cong:

    请加入通话。

    我可以解释这些更改和适用位置。

    这主要是因为 Linux 需要根据 Flash_norOspiRead 中的自定义代码设置启用 DAC。

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

     

    上次星期五的工作时间已经过了、因此我无法加入会议。 很抱歉

    我将从今天开始提供。 请随时安排新会议

     

    谢谢

    (续)

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

    尊敬的 Cong:

    让我们通过 1 PM IST 进行连接。

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    我正在会议中等待。

    谢谢

    (续)

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

    尊敬的 Cong:

    当我们修改#1 时、ECU 无法成功引导至 Linux。 它在某处卡住:(

    按照现在的呼叫、它将启动。

    我们来运行几个周期并查看故障率(如果有)

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    有时 ECU 仍然无法成功引导至 Linux

    费率: 61/273 失败

    e2e.ti.com/.../2909.txt

    谢谢。

    (续)

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

    尊敬的 Cong:

    正如调用中看到的、也有 在两个阶段都启用 PHY 并且在两个阶段都禁用 DMA 时无故障 S. 已针对 6000 多个周期进行测试、未发现故障。 [/报价]

    因此、我们可以丢弃 OSPI_readDirect 中的禁用 DAC 更改、以及我们今天在函数 Flash_norOspiRead 的调用中添加的启用 DAC 逻辑(在 if (Linux == 0x02) 条件下)。

    因此、目前我们正在研究在 6000 多个周期中启用 PHY 和禁用 DMA 没有故障。

    发生 1 次故障              在 1600 多个周期内启用 PHY 和 DMA。

    您是否可以尝试运行我们之前已经做过的以下实验、但只需进行 2 次增量更改。

    使 PHY 和 DMA 保持启用状态、频率为 166666666。 (确保您放弃这些:  放弃在 OSPI_readDirect 中禁用 DAC 更改、以及我们今天在函数 Flash_norOspiRead(在 if (linux == 0x02) 条件下)的调用中添加的启用 DAC 逻辑 )

    在 Flash_norOspiOpen 中应用以下更改:

    // Comment 1: add this new API
    
    static int32_t Flash_norOspiSetRdDataCaptureDelay(Flash_Config *config)
    {
        int32_t status = SystemP_SUCCESS;
        Flash_NorOspiObject *obj = (Flash_NorOspiObject *)(config->object);
        uint32_t maxReadDataCapDelay = 0, minReadDataCapDelay = 0;
        
        /* Set RD Capture Delay by reading ID */
        uint32_t origBaudRateDiv = 15U;
        uint32_t readDataCapDelay = origBaudRateDiv;
    
        while(readDataCapDelay > 0)
        {
            OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay);
            status = Flash_norOspiReadId(config);
            if(status == SystemP_SUCCESS)
            {
                if(maxReadDataCapDelay == 0)
                {
                    maxReadDataCapDelay = readDataCapDelay;
                }
                minReadDataCapDelay = readDataCapDelay;
            }
            readDataCapDelay--;
        }
    
        if(maxReadDataCapDelay == 0)
        {
            status = SystemP_FAILURE;
        }
        else
        {
            /* Picking the middle value from a region of passing read data capture delay */
            readDataCapDelay = (minReadDataCapDelay + maxReadDataCapDelay) / 2;
            OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay);
            status = SystemP_SUCCESS;
        }
    
        return status;
    }
    
    // Comment 2: In the Flash_norOspiOpen function, the section where the following code is present:
            /* Set RD Capture Delay by reading ID */
            uint32_t readDataCapDelay = 4U;
            OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay);
            status = Flash_norOspiReadId(config);
    
            while((status != SystemP_SUCCESS) && (readDataCapDelay > 0U))
            {
                readDataCapDelay--;
                OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay);
                status = Flash_norOspiReadId(config);
            }
            
    Replace the above section code with the line:
    
            /* Set RD Capture Delay by reading manufacture ID and device ID */
            status += Flash_norOspiSetRdDataCaptureDelay(config);

    请构建源/电路板

    第 1 级和第 2 级示例正确、并运行 3k 个周期。

    期待您的答复。

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    我已经应用了您的建议

    它正在测试中。 我将在获得测试结果时通知您

    谢谢

    (续)

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

    尊敬的 Cong:

    谢谢你。 等待结果。

    此致、

    Vaibhav

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

    你好、 Vaibhav、

    到目前为止、我更新了测试结果:

    0/3484 失败

    我今天将继续使用此 ECU 进行测试、并肯定地开始在另一个 ECU 上进行测试

    谢谢

    (续)

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

    你好、Vaibhav、

    到目前为止、我更新了测试结果:

    ECU1:0/7031 失败

    ECU2:0/2791 失败

    我将更改总结如下。 如果我错了、请纠正我

    原始代码:

     -找到使 ID 成功读取的 readDataCapDelay。 readDataCapDelay 的值从 4 开始并逐渐降低、直到成功读取 ID。

    更改代码:

    - readDataCapDelay 的值从 15 开始逐渐减小到 0。

    -找到使 ID 成功读取的 readDataCapDelay 最大值

    -找到使 ID 成功读取的 readDataCapDelay 最小值

    -取最大值和最小值的平均值。

    理论上讲、但在实践中、当我调试时、我总是会看到最大值和最小值都等于 1、在这两种情况下、readDataCapDelay 被分配为值 1。

    那么,变化的区别是什么? 多次设置 readDataCapDelay 和读取 ID 是否会使 NOR 闪存更加稳定?

    谢谢。

    (续)

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

    尊敬的 Cong:

    很高兴现在没有失败。 请注意有两处更改:160MHz to 166MHz 和已添加的 commit。

    修复了选择中间值并将频率设置为 166MHz 解决了此问题。 [给定的 PHY 和 DMA 在两个阶段都被启用。]

    对于中间值选择、请查看此处的提交信息: all:ospi:改进 Tap 模式·TexasInstruments/mcupsdk-core-k3@7c2562e·GitHub 的逻辑

    对于频率部分、正如我在前面的调用中提到的、160MHz(最初由 ZKW 设置)在某个时候会导致故障。 原因是支持 166MHz。 有关详细说明、请参阅下面的屏幕截图。

    分频器值为 12 时、频率等于 166MHz:

    分频器值为 13 时、频率等于 153MHz:

    因此、使用任何整数分频器值时、我们都无法达到 160MHz。 因此、166MHz 将是正确的选择。

    希望这一点澄清。 所做的更改。

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    我们进行了测试、将频率从 160MHz 更改为 166.67MHz

    结果:

    0/13695 失败

    频率变化可能是根本原因

    感谢你的帮助

    如果发现 新内容、我会随时更新。

    (续)

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

    尊敬的 Cong:

    几周前、我们尝试了相同的方法、我让您只是在频率变化的情况下跑步。 2.5 周前 e2e 回复的屏幕截图:

    您报告的零星故障是 1/1600 次循环。 请注意、我们在通话中看到、有时您已离开 stage2/stage1 以正确重建、并在夜间继续运行测试。 因此(阶段 1 或阶段 2 未正确重建)、出现了 1 故障。 否则、它不会出现任何故障。

    如果您看到任何其他发展趋势、请告诉我。

    谢谢、

    Vaibhav