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 中仍然是一个问题。

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

    您好、 Maciej Kubica 

    您能否添加一些详细信息、说明与先前的测试相比发生了哪些变化、这使得此错误更加普遍? OSPI PHY 调优在过去几年中有一些更新。 您目前使用的是哪个 SDK 版本?

    在 PVT 上测试时、该问题是否更加普遍、是否之前看起来有类似的问题、并绘制了 Rx 和 Tx DLL 的可能 OTP 值? 可以从 调优图推断所选 OTP的“运行状况“和稳健性。

    此致

    Karan

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

    您好、

    我已经通读了电子邮件和 e2e。

    日志中显示“在没有 PHY 的情况下继续“。

    通常在发生以下任一情况时发生这种情况:

    1.无法正确读取 128 字节的 Phy 调优闪存攻击向量。

    2. phy 调优闪存攻击向量被擦除。

    请注意、调优算法未失败、因为调优算法失败会导致闪存驱动程序打开失败、但在上述情况下、该流程将继续进行、而不会启用 phy。

    为了理解我正在讨论的 phy 调优攻击向量和 ospi phy 调优算法、请阅读以下常见问题解答、这应该很好地继续。

     【常见问题解答】SK-AM64B:--operation=flash-phy-tuning-data 的目的是什么? 


    此致、

    Vaibhav

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

    您好、

    需要客户提供以下详细信息:

    为了进一步调试此问题、我还需要闪存器件名称以及 SysConfig 闪存设置、用于 SBL Stage 2 和 SBL UART Uniflash。

    对我采取的行动:  

    有时、我将分享一段代码更改片段、该片段会在 Flash_norOspiOpen 内部输出一个缓冲区。 这将有助于我了解 SBL 阶段 2 的闪存攻击向量是否损坏。

    谢谢、

    Vaibhav

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

    您好、

    请替换以下文件下 Flash_norOspiOpen 的定义:source/board/flash/ospi/flash_nor_ospi.c

    并 还添加新函数 Flash_norOspiSetRdDataCaptureDelay。

    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;
    }
    
    static int32_t Flash_norOspiOpen(Flash_Config *config, Flash_Params *params)
    {
        int32_t status = SystemP_SUCCESS;
        Flash_NorOspiObject *obj = (Flash_NorOspiObject *)(config->object);
        Flash_Attrs *attrs = config->attrs;
        int32_t attackVectorStatus = SystemP_FAILURE;
    
        obj->ospiHandle = OSPI_getHandle(attrs->driverInstance);
    
        if(obj->ospiHandle == NULL)
        {
            status = SystemP_FAILURE;
        }
    
        if(SystemP_SUCCESS == status)
        {
            /* Set device size and addressing bytes */
            OSPI_setDeviceSize(obj->ospiHandle, attrs->pageSize, attrs->blockSize);
    
            /* Set command opcode extension type */
            OSPI_setCmdExtType(obj->ospiHandle, config->devConfig->cmdExtType);
    
            /* Set initial number of address bytes */
            obj->numAddrBytes = 3;
    
            /* Set current protocol as 1s1s1s */
            obj->currentProtocol = FLASH_CFG_PROTO_1S_1S_1S;
    
            /* Now configure the flash for the selected protocol */
            status += Flash_norOspiSetProtocol(config, obj->ospiHandle, params);
            obj->currentProtocol = config->devConfig->protocolCfg.protocol;
    
            /* Set number of address bytes. If 4 byte addressing is supported, switch to that */
            status += Flash_norOspiSetAddressBytes(config, obj->ospiHandle);
    
            /* Set opcodes in OSPI controller */
            OSPI_setXferOpCodes(obj->ospiHandle, config->devConfig->protocolCfg.cmdRd, config->devConfig->protocolCfg.cmdWr);
    
            /* Set Mode Clocks and Dummy Clocks in Controller and Flash Memory */
            status += Flash_norOspiSetModeDummy(config, obj->ospiHandle);
    
            /* Set RD Capture Delay by reading manufacture ID and device ID */
            status += Flash_norOspiSetRdDataCaptureDelay(config);
    
            /* Enable PHY if attack vector present and PHY mode is enabled */
            uint32_t phyTuningOffset = Flash_getPhyTuningOffset(config);
            if(OSPI_isPhyEnable(obj->ospiHandle))
            {
                DebugP_log("Trying to read the phy tuning attack vector initially from the address %u . \r\n", phyTuningOffset);
                attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
    
                if(attackVectorStatus != SystemP_SUCCESS)
                {
                    /* Flash the attack vector to the last block */
                    DebugP_log("Trying to write the phy tuning attack vector as it is not read/flashed correctly at address %u . \r\n", phyTuningOffset);
                    uint32_t blk = 0, page = 0;
                    uint32_t phyTuningData = 0,phyTuningDataSize = 0;
                    OSPI_phyGetTuningData(&phyTuningData, &phyTuningDataSize);
                    Flash_offsetToBlkPage(config, phyTuningOffset, &blk, &page);
                    Flash_norOspiErase(config, blk);
                    Flash_norOspiWrite(config, phyTuningOffset, (uint8_t *)phyTuningData, phyTuningDataSize);
                    DebugP_log("Trying to read the phy tuning attack vector after flashing at address %u . \r\n", phyTuningOffset);
                    attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
                    int loop = 1;
                    while(loop);
                    // at this point open the memory browser as the loop = 1 will result in program to be stuck here. 
                    // In memory browser type the address as 0x60000000 + phyTuningOffset. At this address check if the first 128 bytes matches the buffer: gOspiFlashAttackVector
                    // gOspiFlashAttackVector can be found in the file: source\drivers\ospi\v0\ospi_phy.c
                }
    
                if(attackVectorStatus == SystemP_SUCCESS)
                {
                    status += OSPI_phyTuneDDR(obj->ospiHandle, phyTuningOffset);
                    if(status == SystemP_SUCCESS)
                    {
                        obj->phyEnable = TRUE;
                        OSPI_setPhyEnableSuccess(obj->ospiHandle, TRUE);
                    }
                }
                else
                {
                    DebugP_logError("%s : PHY enabling failed!!! Continuing without PHY...\r\n", __func__);
                    obj->phyEnable = FALSE;
                    OSPI_setPhyEnableSuccess(obj->ospiHandle, FALSE);
                }
            }
            else
            {
                obj->phyEnable = FALSE;
            }
        }
    
        /* Any flash specific quirks, like hybrid sector config etc. */
        if(params->quirksFxn != NULL)
        {
            params->quirksFxn(config);
        }
        else
        {
            /* Do nothing */
        }
    
        return status;
    }

    确保在更换 API 后、通过运行以下命令来重新构建库:

    现在、我们来重新构建您的应用。

    请与我一起分享结果以及下面提到的结果:

    [引用 userid=“531612" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1559018/am625-ospi-phy-tuning-failure-in-sbl-stage-2/6002784

    需要客户提供以下详细信息:

    为了进一步调试此问题、我还需要闪存器件名称以及 SysConfig 闪存设置、用于 SBL Stage 2 和 SBL UART Uniflash。

    [/报价]

    谢谢、

    Vaibhav

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

    您好 Kumar、

    感谢您的建议,我们将研究为您提供的信息,并尝试修补程序明天最新.

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

    尊敬的 Maciej:

    请选择上面共享的代码、我刚刚从最新的 SDK 中修改了几项内容。

    这些预定义符号如下:

    1. 首先、我们有 readDataCapDelay 值。 在最新的 SDK 中、我们将此值设置为所有通过值集的中间值。 变化如下:
      1. 在 SDK 8.6 中找到、前提是一组传递值  4、3、2  然后 将 readDataCapDelay 设置为最大值 4。
      2. 在 SDK 11.1 中并继续、如果传递值集是这样  4、3、2  然后、 readDataCapDelay 设置为中间值 3。
      3. 结论: 从传递读取数据捕获延迟值的区域中选择中间值、确保可靠的数据读取。
    2. 第二个更改本质上是、当 PHY 调优矢量被错误读取或 phyTuningOffset 中缺失时、我们会将此攻击矢量写回
      phyTuningOffset。 变化如下:
      1. 在 SDK 8.6 中、首先擦除扇区、然后将 128 字节的攻击向量写入 phyTuningOffset。
      2. 在 SDK 11.1 中、现在块被擦除、然后将 128 字节的攻击向量写入 phyTuningOffset
      3. 结论:由于写入闪存驱动程序以在统一模式下执行、因此我们执行块擦除而不是扇区擦除。

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    首先、我想分享 SBL 阶段 2 的 SysConfig
    e2e.ti.com/.../0640.syscfg.txt

    用于 SBL UART Uniflash 的 SysConfig 在 SDK 8.6 中保留为默认配置。

    我们将尽快应用此修补程序并更新结果。

    (续)

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

    你好、Vaibhav、

    当我们更改 obj->numAddrBytes = 3;

    出现以下错误。

    如果保留原始设置 (4)、则不会出现此错误

    (续)

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

    尊敬的 Cong:

    我尝试替换 SysConfig 并打开它。

    我看到它显示的闪存名称是 S28HS512T、这不是您使用的闪存、对吗?

    因此 SysConfig 无法正确打开/呈现。

    我想请您向我发送 SysConfig 中 OSPI 部分和闪存部分值的屏幕截图。

    请也将闪存数据表发送给我。

    期待您的答复。

    谢谢、

    Vaibhav

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

    e2e.ti.com/.../INFINEON_5F00_S28HxGT_5F00_Rev202011.pdf

    添加了数据表

    我们的型号是:  S28HS02GT

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

    你好、Vaibhav、

    我将 numAddrBytes 改回 4。 然后、我在源代码中打印 phy 调优攻击向量、如下所示:

    这是日志:

    e2e.ti.com/.../LOG0903.txt

    (续)

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

    尊敬的 Cong:

    查看日志后、看起来您已经运行了 1906 个周期。

    我们发现故障的次数已经达到 23 次、因此故障率为 1.2%。

    我使用以下语句来识别失败:“PHY 启用失败!!! 在没有 PHY 的情况下继续...“ 在 1906 个周期中发生 23 次。

    目前还会查看 phy 调优攻击向量日志、并将在稍后更新。

    谢谢、

    Vaibhav

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

    尊敬的 Cong:

    您发送的日志是否在您在 flash_nor_ospi.c 文件中实现函数 flash_norOspiSetRdDataCaptureDelay 后发送?

    此函数定义位于我共享的文件中。

    我请您向我发送 SysConfig 中 OSPI 部分和闪存部分值的屏幕截图。

    我也在等同样的。

    从日志中观察到:

    1. 我看到 phy 调优偏移值为 9437184、它不会与您使用的闪存相加。 您使用的闪存是 256MB 闪存、因此、phy 调优偏移本应为:
      1. 256MB/2(根据 8.6 MCU SDK 公式)。
      2. 256 MB — 块大小 (256 KB)、根据 9.0 MCU SDK 公式计算。
    2. Phy 调优攻击向量有时似乎无法正确编写。
    3. 请告诉我 SBL UART Uniflash 第 2 阶段使用 MCU SDK 8.6 或任何其他版本中的驱动程序进行编译、然后我可以继续、对编译的 SBL 版本和最新的 SDK 进行比较。

    谢谢、

    Vaibhav

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

    尊敬的 Vaibhav:

    是的、我使用了  您分享的函数 Flash_norOspiSetRdDataCaptureDelay。
    我已经使用您共享的所有代码(numAddrByts=4 和 OSPI_phyPrintAttackVector 而非 OSPI_phyReadAttackVector 除外)   打印 PHY 调优攻击向量。

    下面是 OSPI 部分和闪存部分的屏幕截图:

    SBL 2 使用 MCU SDK 8.6 中的驱动程序进行编译。

    (续)

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

    您好、

    感谢您提出这个问题。

    请允许我在某个时候对这一点发表评论。

    谢谢、

    Vaibhav

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

    你好 Kumar、有什么新消息吗?

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

    您好、

    我看到 SysConfig 中的值已更新、与 8.6 不同。 我将其与最新的 SDK 11.1 进行比较。

    在尝试更新的 SysConfig 值之前、您是否可以将频率更改为 166MHz、因此需要在 SysConfig 工具中写入 166666666。

    如果频率更改无法解决您的问题、则可以尝试新的更新配置。

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    感谢您的建议。 将频率更改为 166MHz、 我们将进行测试。 我会尽快给您发送测试结果

    (续)

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

    尊敬的 Cong:

    期待结果。

    谢谢、

    Vaibhav

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

    尊敬的 Vaibhav:

    结果不好。

    错误发生率为 72/3672

    e2e.ti.com/.../09102025.txt

    (续)

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

    尊敬的 Cong:

    根据日志、我的观察结果如下:

    1. 您已将 PHY 调优偏移配置为 0x900000。
    2. 该故障会连续两次出现、但不会以超过 2 个的块发生。
    3. 注意:  在没有 PHY 的情况下继续  这意味着驱动程序应该在 TAP 模式下运行以实现闪存、因此应该没有问题。

    后续步骤:

    只是为了再次确认、 您正在讨论的是来自 SBL UART Uniflash 多级 2 的 PHY 调优失败消息、而不是下面的正确消息?

    • C:\ti\mcu_plus_sdk_am62x_11_01_00_16\examples\drivers\boot\sbl_ospi_linux_multistation\sbl_ospi_linux_stage2/stage1

    如果消息来自 SBL OSPI Linux Stage 1 或 Stage 2、那么我可以建议使用另一个修复方法。 我想问这一点的原因是、在刷写时会捕获到 SBL UART Uniflash 阶段 2 中的错误、而不是在引导时捕获。 您发送的日志都在引导时显示。

    注意:请将我以前的更改合并。 如果客户有任何机会使用 SBL OSPI Linux 第 1 阶段和第 2 阶段、则需要对闪存进行的唯一 SysConfig 更新是:(除了闪存大小和器件 ID 更新之外)

    • 更改 1:
      • 虚拟时钟(读取) = 21
      • 虚拟周期配置->寄存器数据->要写入的数据= 8
    • 更改 2:
      • 四字节寻址-> 4 字节寻址使能序列= 0xA1

    在 SBL OSPI Linux 阶段 1 中、就在 Drivers_open () 之后、以及在调用 Board_driversOpen () 之前、 添加以下函数:

    FlashFixUpOspiBoot (gOspiHandle[CONFIG_OSPI0]gFlashHandle[CONFIG_FLASH0]);
    其定义如下:
    void flashFixUpOspiBoot(OSPI_Handle oHandle, Flash_Handle fHandle);
    
    void flashFixUpOspiBoot(OSPI_Handle oHandle, Flash_Handle fHandle)
    {
        OSPI_setProtocol(oHandle, OSPI_FLASH_PROTOCOL(8,8,8,1));
        OSPI_enableDDR(oHandle);
        OSPI_setDualOpCodeMode(oHandle);
        Flash_reset(fHandle);
        OSPI_enableSDR(oHandle);
        OSPI_clearDualOpCodeMode(oHandle);
        OSPI_setProtocol(oHandle, OSPI_FLASH_PROTOCOL(1,1,1,0));
    }
    尝试两种方法  
    obj->numAddrBytes = 3;和  
    obj->numAddrBytes = 4;最初设置在 Flash_norOspiOpen 中。

     

    这样可以解决该问题。 如果无法解决问题、请根据客户的可用性安排在星期五 9 月 12 日/9 月 15 日致电。
    谢谢、
    Vaibhav

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

    你好、Vaibhav、

    不同应用  SBL OSPI Linux Stage 1 和 Stage 2 、而不是 SBL UART Uniflash 多级 2.  

    我们将尝试应用您的建议并尽快更新结果

    谢谢

    (续)

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

    你好、Vaibhav、

    应用所有建议后、尝试使用两个  obj->numAddrBytes  =  3;和 obj->numAddrBytes = 4;、

    读取闪存失败。 函数 Flash_readirect() 返回失败。

    您还有其他想法吗?

    谢谢

    (续)

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

    您好、Cong、

    请在星期一上安排跟进电话。  

    我只需要知道您正在使用 Flash_ READ_INDIRECT 、因为闪存读取对于 NOR 是直接的(默认情况下在 SDK 中)。 所以我假设读取已进入 DAC  整个时间。

    可能还有其他一些配置、我希望在通话时看到。 期待会议。

    谢谢、

    Vaibhav

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

    嗨、大家好、您在哪个时区? 印度还是达拉斯?

    康格在越南工作,它将适应印度的工作时间,但可能很难与美国时区组织...

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

    尊敬的 Maciej:

    出于调试调用的目的、我更喜欢 IST。 请与客户联系以了解其供货情况、并请求他们准备好调试设置、但我会花大部分时间了解他们的 OSPI 修改、首先进行写入/读取/擦除。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    我甚至没有你的电子邮件

    因此、我在 VNT 3:30 创建了一个团队会议、大约接下来 15 分钟。 希望您能加入

    立即加入会议

    或者、您可以创建新的会议请求并通过电子邮件添加我: CongP@fpt.com

    谢谢

    (续)

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

    尊敬的 Cong:

    我已加入通话。 让我们开始讨论。

    此致、

    Vaibhav

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

    尊敬的 Cong:

    根据我们的通话、在此处共享会议笔记。

    下面是一个表格:

    请注意:上面是 AM64x/AM243x 的数字、应用作参考。

    要尝试使用原始设置:

    使用原始设置(同时应用这两项设置):

    • 在 SysConfig(对于 1 级和 2 级)中、将 OSPI 时钟频率置于 166666666 并重新构建应用。
    • 在 SysConfig(对于阶段 1 和阶段 2)中、禁用 DMA 和 PHY 并重新构建应用程序。

    尝试至少 1000 个循环。

    调试调用总结:

    • ZKW 使用 INDAC 读取。
    • PHY 与 DMA 一起启用、因此两者都应禁用。
    • 由于使用原始设置时的故障率为 1.2%、因此在原始设置的基础上提出了上述一组实验。
    • 结果将由 Cong 星期二 Morning IST 分享、在此基础上、讨论将通过 e2e/电话进行。

     

    此致、

    Vaibhav

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

    你好、Vaibhav、

    测试结果显示 0/967 读取闪存失败

    当然、我们不能禁用 DMA、因为它会影响启动时间。

    那么、解决方案是什么? 我们可以再次进行调试调用吗?

    (续)

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

    尊敬的 Cong:

    让我们使用您昨天共享的同一链路进行呼叫连接。

    如果适合您、我们可以在下午 1:30 之前联系您。

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    这对我来说很合适。 再见

    谢谢

    (续)

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

    你好、Vaibhav、

    我在会议中等待。

    谢谢

    (续)

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

    下表总结了通过调用实施的调试。

    修改 修改位置? 时钟频率 时钟分频器 PHY 模式 DMA 结果
    不适用 160000000 4. 是(在第 1 阶段和第 2 阶段) (在第 1 阶段和第 2 阶段) 1900 个周期中出现 1.2%的故障
    是的
    • 更改 1:点按模式中间值选择逻辑已应用  
    • 更改 2:
      • 虚拟时钟(读取) = 21
      • 虚拟周期配置->寄存器数据->要写入的数据= 8
    • 更改 3:
      • 四字节寻址-> 4 字节寻址使能序列= 0xA1
    160000000/16666666666 4. (在第 1 阶段和第 2 阶段) (在第 1 阶段和第 2 阶段) 较高的故障率(几乎每次都失败)
    是的
    • 更改 1:时钟频率设置为 16666666666 Hz
    • 更改 2:禁用 PHY 和 DMA
    166666666. 4. (在阶段 1 和阶段 2 中) (在阶段 1 和阶段 2 中) 在 960 个周期中未发现故障
    是(跨 SBL OSPI Linux 阶段 1 和阶段 2 添加了多个日志、以调试故障(如果有)
    • 更改 1:时钟频率设置为 16666666666 Hz
    • 更改 2:只需禁用 DMA
    166666666. 4. (在第 1 阶段和第 2 阶段) (在阶段 1 和阶段 2 中) 待处理
    是 (跨 SBL OSPI Linux 阶段 1 和阶段 2 添加了多个日志、以调试故障(如果有)
    • 更改 1:时钟频率设置为 16666666666 Hz
    166666666. 4. (在第 1 阶段和第 2 阶段) 是(在第 1 阶段和第 2 阶段) 待处理

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

    尊敬的 Vaibhav:

    我更新了测试结果  

    是(跨 SBL OSPI Linux 阶段 1 和阶段 2 添加了多个日志、以调试故障(如果有)
    • 更改 1:时钟频率设置为 16666666666 Hz
    • 更改 2:只需禁用 DMA
    166666666. 4. (在第 1 阶段和第 2 阶段) (在阶段 1 和阶段 2 中) 在 1498 个循环中未发现故障

    e2e.ti.com/.../teraterm_5F00_build_5F00_1487_5F00_sbl_5F00_PHY.log

    最后一个案例将快速运行并更新

    谢谢

    (续)

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

    尊敬的 Cong:

    最后一个案例将以同样的方式运行和更新

    谢谢、期待看到最后一个测试用例结果。

    然后、我们可以找出导致这种情况的根本原因。

    谢谢、

    Vaibhav

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

    你好、Vaibhav

    我更新了最后一个案例的测试结果:

    是 (跨 SBL OSPI Linux 阶段 1 和阶段 2 添加了多个日志、以调试故障(如果有)
    • 更改 1:时钟频率设置为 16666666666 Hz
    166666666. 4. (在第 1 阶段和第 2 阶段) 是(在第 1 阶段和第 2 阶段) 待处理

    设备 1:0/1374 失败

    设备 2:0/684 失败

    我将在一夜之间继续运行、并告诉您是否再次出现此问题

    谢谢

    (续)

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

    尊敬的 Cong:

    请做一个小更改。

    删除我在代码中添加的日志、例如 main.c 中阶段 1 和阶段 2 的 DebugP_log 等语句、并在夜间运行。

    请告诉我结果。

    谢谢、

    Vaibhav

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

    尊敬的 Vaibhav:

    以下是隔夜测试的结果:

    未通过:4/2727

    请帮助我分析日志。 如果需要、我们可以进行其他调试调用。

    e2e.ti.com/.../1709_5F00_OVN.txt

    谢谢

    (续)

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

    尊敬的 Cong:

    我已查看日志。

    在 2727 个周期中、发现 PHY 启用失败的 4 倍。 这意味着 4 次未能从 phy 调优偏移(在代码中定义为 0x900000)读取 phy 调优攻击向量。

    我要将此失败归因于读取在 SBL 阶段 2 中调用 Flash_norOspiOpen 的步骤中选择的数据延迟值。 此外、在您的代码中、您还添加了一个额外的启用 PHY 的 API。

    我想打印出以下寄存器:0xFC40000 和 0xFC40010。

      DebugP_LOG(“Value of FC40000 and FC40010 为:0x%X 和 0x%X \r\n“*(volatile uint32_t *) 0xFC40000*(volatile uint32_t *) 0xFC40010)
    请使用以下代码段并在阶段 1 和阶段 2 中调用自定义 PHY 使能/使能 PHY 函数之前打印。
    这样、在调用 phy 使能函数之前、上述日志记录语句将出现在 stage1 和 stage2 的 main.c 中。
    只需运行 1k/1.5Kcycles、直到看到 1 次失败并报告日志值。

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    我像您说的那样添加了调试日志、现在正在测试中

    我会告诉您它何时遇到故障案例

    谢谢

    (续)

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

    尊敬的 Cong:

    感谢您的期待。

    因此、如果需要、我们可以拨打电话(在查看日志时)。

    此致、

    Vaibhav

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

    你好、Vaibhav、

    我更新了结果  

    1/1606 失败

    e2e.ti.com/.../1909.txt

    请帮助我分析日志

    谢谢

    (续)

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

    尊敬的 Cong:

    根据日志、读取延迟值和配置寄存器看起来正确。

    您能告诉我电路板是否处于极端条件下吗? 例如、当您运行测试时、是否也应用了温度变化?

    谢谢、

    Vaibhav

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

    尊敬的 Vaibhav:

    此器件在正常条件下进行测试。

    谢谢、

    (续)

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

    尊敬的 Cong:

    设备在正常条件下进行测试。

    感谢您的答复。 这意味着器件是在室温下进行测试的。

    您能否参加此次通话、讨论有关用于 PHY 调优数据存在的偏移的几个指针。 如果适合您、请在美国时间下午 2:30 拨打电话。 让我们加入上面发送的相同 MSFT 邀请。

    在致电之前、我希望您浏览: e2e.ti.com/.../faq-sk-am64b-what-is-the-purpose-of---operation-flash-phy-tuning-data

    谢谢、

    Vaibhav

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

    你好、Vaibhav、

    下午 2:30 IST 对我来说是可行的。

    再见。

    谢谢

    (续)

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

    你好、Vaibhav、

    我仍在等待。 您可以加入吗?

    (续)

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

    尊敬的 Cong:

    更新了表。

    修改 修改位置? 时钟频率 时钟分频器 PHY 模式 DMA 结果

    第二组结果

    不适用 160000000 4. 是(在第 1 阶段和第 2 阶段) (在第 1 阶段和第 2 阶段) 1900 个周期中出现 1.2%的故障 也一样
    是的
    • 更改 1:点按模式中间值选择逻辑已应用  
    • 更改 2:
      • 虚拟时钟(读取) = 21
      • 虚拟周期配置->寄存器数据->要写入的数据= 8
    • 更改 3:
      • 四字节寻址-> 4 字节寻址使能序列= 0xA1
    160000000/16666666666 4. (在第 1 阶段和第 2 阶段) (在第 1 阶段和第 2 阶段) 较高的故障率(几乎每次都失败) 也一样
    是的
    • 更改 1:时钟频率设置为 16666666666 Hz
    • 更改 2:禁用 PHY 和 DMA
    166666666. 4. (在阶段 1 和阶段 2 中)、这意味着分路模式 (在阶段 1 和阶段 2 中) 在 960 个周期中未发现故障 我们能否在大约 5K 个周期内对此进行测试?
    是(跨 SBL OSPI Linux 阶段 1 和阶段 2 添加了多个日志、以调试故障(如果有)
    • 更改 1:时钟频率设置为 16666666666 Hz
    • 更改 2:只需禁用 DMA
    166666666. 4. (在第 1 阶段和第 2 阶段) (在阶段 1 和阶段 2 中) 0/1498 次循环 我们能否在大约 5K 个周期内对此进行测试?
    是 (跨 SBL OSPI Linux 阶段 1 和阶段 2 添加了多个日志、以调试故障(如果有)
    • 更改 1:时钟频率设置为 16666666666 Hz
    166666666. 4. (在第 1 阶段和第 2 阶段) 是(在第 1 阶段和第 2 阶段) 1/1606(零星故障) TI 在内部讨论后提供反馈。

    此致、

    Vaibhav

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

    你好、Vaibhav、

    我将测试结果更新如下:

    是的
    • 更改 1:时钟频率设置为 16666666666 Hz
    • 更改 2:禁用 PHY 和 DMA
    166666666. 4. (在阶段 1 和阶段 2 中)、这意味着分路模式 (在阶段 1 和阶段 2 中) 在 960 个周期中未发现故障 我们能否在大约 5K 个周期内对此进行测试?  0/6763.    
    是(跨 SBL OSPI Linux 阶段 1 和阶段 2 添加了多个日志、以调试故障(如果有)
    • 更改 1:时钟频率设置为 16666666666 Hz
    • 更改 2:只需禁用 DMA
    166666666. 4. (在第 1 阶段和第 2 阶段) (在阶段 1 和阶段 2 中) 0/1498 次循环 我们能否在大约 5K 个周期内对此进行测试? 0/3816 ->稍后继续测试和更新
    是 (跨 SBL OSPI Linux 阶段 1 和阶段 2 添加了多个日志、以调试故障(如果有)
    • 更改 1:时钟频率设置为 16666666666 Hz
    166666666. 4. (在第 1 阶段和第 2 阶段) 是(在第 1 阶段和第 2 阶段) 1/1606(零星故障) TI 在内部讨论后提供反馈。 你那有新消息吗?

    e2e.ti.com/.../DisablePhyandDMA.txt

    e2e.ti.com/.../DisableDMA.txt

    谢谢

    (续)