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.

[参考译文] SK-AM62:在将 SOC 初始化二进制文件刷写到 EVM 期间出现问题

Guru**** 2979400 points

Other Parts Discussed in Thread: UNIFLASH, SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1640007/sk-am62-issue-during-flash-the-soc-initialization-binary-to-the-evm

器件型号: SK-AM62
Thread 中讨论的其他器件: UNIFLASH、 SYSCONFIG

您好团队:

MCU+SDK 软件包: mcu_plus_sdk_am62x_11_01_00_16

以下是在闪存-phy-tuning-data 操作步骤中对 SOC 初始化二进制文件进行闪存期间报告的错误消息:

image.png

我们已经尝试过几次重启 EVM、然后再次运行脚本。 但问题是一样的。

我们还尝试通过删除“--operation=flash-phy-tuning-data“并成功刷写来跳过本节。

您能否就此提供反馈?

BR、
Shubham

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

    嗨、Shubam、

    我假设这是在 TI EVM 上、您能否确认在定制电路板或 TI EVM 上遇到此问题?

    您是否对 UART UNIFLASH 示例/闪存驱动程序代码进行了任何更改?

    此致、

    会面。

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

    尊敬的会议:

    我假设这是在 TI soc 上、您能否确认您是在定制电路板或 TI EVM 上遇到此问题?

    我面临着 TI EVM 带来的问题。

    您是否对 soc 示例/闪存驱动程序代码进行了任何更改?

    我使用的是 MCU_PLUS_SDK_am62x_11_01_00_16 的默认配置, 如 文件:///C:/ti/mcu_plus_sdk_am62x_11_01_00_16/docs/api_guide_am62x/EVM_SETUP_PAGE.html 中所述,在闪存 SOC 初始化步骤中观察到问题 。

    BR、
    Shubham

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

    嗨、Shubham Goel、

    如果您使用的是 EVM、则 SDK SBL stage2 或 SysConfig 设置可能已损坏。

    您能否确认是否对以下文件进行了任何更改?

    1. mcu_plus_sdk_am62x_11_01_00_16/source/drivers/bootloader/uniflash.c
    1. mcu_plus_sdk_am62x_11_01_00_16/examples/drivers/boot/sbl_uart_uniflash_multistation/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/example.syscfg

    如果进行了修改、则可能会导致该问题。

    下一步、我建议重新安装 SDK、并通过以下操作重试一次全新设置:
    mcu_plus_sdk_am62x_11_01_00_16/docs/api_guide_am62x/EVM_SETUP_PAGE.html

    我们还尝试删除“--operation=flash-phy-tuning-data“并成功刷写。

    删除 --operation=flash-phy-tuning-data 不会中断功能、但会降低 性能裕量和稳健性、尤其是对于高速 OSPI 用例而言。

    谢谢、
    Jomy

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

    尊敬的 Jomy Paul P S (18649800): 

    [引述 userid=“686310“ url=“~/support/processors-group/processors/f/processors-forum/1640007/sk-am62-issue-during-flash-the-soc evm-initialization-binary-to-the-evm/6326384“]

    如果您使用的是 EVM、则 SDK SBL stage2 或 SysConfig 设置可能已损坏。

    您能否确认是否对以下文件进行了任何更改?

    1. mcu_plus_sdk_am62x_11_01_00_16/source/drivers/bootloader/uniflash.c
    1. mcu_plus_sdk_am62x_11_01_00_16/examples/drivers/boot/sbl_uart_uniflash_multistation/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/example.syscfg

    如果进行了修改、则可能会导致该问题。

    下一步、我建议重新安装 SDK、并通过以下操作重试一次全新设置:
    mcu_plus_sdk_am62x_11_01_00_16/docs/api_guide_am62x/EVM_SETUP_PAGE.html

    [/报价]

    我正在使用默认文件、并且未对上述文件执行任何修改。

    我还尝试重新安装 SDK、但问题仍然不变。

    移除 --operation=flash-phy-tuning-data 不会中断功能、但会降低 性能裕度和稳健性、尤其是对于高速 soc 用例。

    对于 MCU_PLUS_SDK_am62x_11_01_00_16、FLS 操作按预期工作 、移除“--operation=flash-phy-tuning-data“  、但当我们将 SDK 软件包更新为 MCU_PLUS_SDK_am62x_11_02_00_23 时、会观察到相同的问题、我们无法通过“--tuningoption=flash-phy“删除进行刷写步骤。

    BR、
    Shubham

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

    你好 ,

    您使用的是哪款 TI EVM — 它是 HS_FS 器件?

    谢谢、

    Jomy

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

    尊敬的 Jomy Paul P S (18649800): 

    它是 GP 器件。 我们正在刷写“--cfg=sbl_prebuilt/am62x-sk/default_sbl_null.cfg“。

    BR、
    Shubham

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

    你好 ,

    我将在硬件上尝试此操作并返回给您。

    谢谢、
    Jomy

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

    嗨、Shubham、

    我在我最后使用了 GP 板尝试了这个方法、刷写工作正常、没有任何问题:

    ❯ python3 uart_uniflash.py -p /dev/ttyUSB0 --cfg=sbl_prebuilt/am62x-sk/default_sbl_null.cfg
    
    Parsing config file ...
    Parsing config file ... SUCCESS. Found 5 command(s) !!!
    
    Executing command 1 of 5 ...
    Found flash writer ... sending sbl_prebuilt/am62x-sk/sbl_uart_uniflash_stage1.release.tiimage
    Sent flashwriter sbl_prebuilt/am62x-sk/sbl_uart_uniflash_stage1.release.tiimage of size 264897 bytes in 26.62s.                                                                                 
    
    Executing command 2 of 5 ...
    Command arguments : --file=../../examples/drivers/boot/sbl_uart_uniflash_multistage/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/ti-arm-clang/sbl_uart_uniflash_stage2.release.appimage --operation=flash --flash-offset=0x0
    Sending ../../examples/drivers/boot/sbl_uart_uniflash_multistage/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/ti-arm-clang/sbl_uart_uniflash_stage2.release.appimage: 131712bytes [00:14, 1Sending ../../examples/drivers/boot/sbl_uart_uniflash_multistage/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/ti-arm-clang/sbl_uart_uniflash_stage2.release.appimage: 131713bytes [00:14, 1Sending ../../examples/drivers/boot/sbl_uart_uniflash_multistage/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/ti-arm-clang/sbl_uart_uniflash_stage2.release.appimage: 131714bytes [00:15, 1Sending ../../examples/drivers/boot/sbl_uart_uniflash_multistage/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/ti-arm-clang/sbl_uart_uniflash_stage2.release.appimage: 131715bytes [00:15, 1Sending ../../examples/drivers/boot/sbl_uart_uniflash_multistage/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/ti-arm-clang/sbl_uart_uniflash_stage2.release.appimage: 131716bytes [00:15, 1                                                                                                                                                                                                Sent ../../examples/drivers/boot/sbl_uart_uniflash_multistage/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/ti-arm-clang/sbl_uart_uniflash_stage2.release.appimage of size 130676 bytes in 15.78s.
    [STATUS] SUCCESS !!!
    
    Executing command 3 of 5 ...
    Command arguments : --operation=flash-phy-tuning-data
    Sent flash phy tuning data in 3.1s.                                                                                                                                                             
    [STATUS] SUCCESS !!!
    
    Executing command 4 of 5 ...
    Command arguments : --file=sbl_prebuilt/am62x-sk/sbl_null.release.tiimage --operation=flash --flash-offset=0x0
    Sent sbl_prebuilt/am62x-sk/sbl_null.release.tiimage of size 292289 bytes in 30.46s.                                                                                                             
    [STATUS] SUCCESS !!!
    
    Executing command 5 of 5 ...
    Command arguments : --file=../../examples/drivers/ipc/ipc_rpmsg_echo_linux/am62x-sk/r5fss0-0_freertos/ti-arm-clang/ipc_rpmsg_echo_linux.release.appimage --operation=flash --flash-offset=0xA00000
    Sent ../../examples/drivers/ipc/ipc_rpmsg_echo_linux/am62x-sk/r5fss0-0_freertos/ti-arm-clang/ipc_rpmsg_echo_linux.release.appimage of size 187484 bytes in 20.67s.                              
    [STATUS] SUCCESS !!!
    
    All commands from config file are executed !!! 

    您提到、在删除 --operation=flash-phy-tuning-data 后、刷写工作可以正常、您能否共享确认相同的日志。

    您还能否确认 SoC 是否正在正确引导、以防您跳过 PHY 调优数据刷写。

    此致。

    会面。

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

    尊敬的会议:

    我在最后用了一个 GP 板尝试了这个方法、刷写工作正常、没有任何问题:

    我借用了其他的 GP 板和刷写工作正常的那.. 我们的疑问是如何解决 电路板的上述问题。

    您提到刷写在删除--operation=flash-phy-tuning-data 后可以正常工作 、您能否共享确认相同的日志

    请在下面查找:

    如果您跳过 PHY 调优数据刷写、您是否还可以确认 soc 是否正在正确引导。

    请查找下面连接的 UART 终端输出:

    以上是对 MCU_PLUS_SDK_am62x_11_01_00_16 的观察结果。

    如果您需要任何其他信息、请告诉我。

    BR、
    Shubham

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

    你好 ,

    我们如何解决 上述电路板问题。

    澄清一下、两个电路板是相同还是不同? 如果两个板相同且一个板工作、而另一个板不工作、则可能是与硬件相关的问题。

    谢谢、

    JOMY

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

    尊敬的 Jomy Paul P S (18649800): 

    澄清一下、两个电路板是相同还是不同? 如果两个板相同且一个板工作、而另一个板不工作、则可能是与硬件相关的问题。

    是的。。 两个电路板是相同的、看起来像是一个硬件问题。

    您能建议我们解决问题吗?

    提前感谢。

    BR、
    Shubham

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

    嗨、Shubham、

    很难找出根本原因、因为当涉及到硬件故障时、可能是任何问题。

    我想做的就是这样做。

    请对这些问题中的每一个问题都给我一个“是“或“否“。

    1. 我相信您正在运行的任何实验都没有对“SysConfig“>“OSPI 和 FLASH 设置“进行任何更改、并且您使用的是默认的 SDK 设置?
    2. 在有故障的电路板上、当您移除“--operation=flash-phy-tuning-data“行并刷写时、刷写是否成功? 我认为是的,根据你的上述评论。
    3. 在步骤 2 之后、当您尝试引导时、您是否看到 SBL Null 的正确日志?
    4. 如果您看到 SBL Null 日志、那么您是否能够看到您的 DM 应用正在运行?

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    请在下面找到我的回复:

    我认为您正在运行的任何实验都没有对 sysconfig > soc 和 flash 设置进行任何更改、并且您正在使用默认的 sdk 设置?

    是的。。我们使用的是默认设置。

    在有故障的电路板上、当您删除“--option=flash-phy-tuning-data“行并刷写时、刷写成功吗? -->我认为是的根据你的上述评论。

    是的。。对于 SDK MCU_PLUS_SDK_am62x_11_01_00_16、 删除 “--operation=flash-phy-tuning-data“后工作正常。 但是、当我们将 SDK 软件包更新为 MCU_PLUS_SDK_am62x_11_02_00_23 时、会观察到相同的问题、我们无法 通过删除“--operation=flash-phy-tuning-data“来继续执行刷写步骤。

    在步骤 2 之后、当您尝试引导时、您是否会看到 soc Null 的正确日志?

    是的。。删除 “--operation=flash-phy-tuning-data“后 、日志返回成功刷写(请找到下面的日志映像)。

    如果您看到 soc 空日志、那么您是否能够看到您的 DM 应用正在运行?

    是的。

    BR、
    Shubham

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

    嗨、Shubham、

    感谢您的确认。

    我想知道引导是否也成功、根据 SBL 日志、我指的是您在此处分享的日志:

    请查找下面连接的 UART 终端输出:

    [/报价]

    此致、
    Vaibhav

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

    尊敬的 Vaibhav:

    [引述 userid=“531612“ url=“~/support/processors-group/processors/f/processors-forum/1640007/sk-am62-issue-during-flash-the-soc device-initialization-binary-to-the-evm/6357281“]

    我想知道引导是否也成功、根据 SBL 日志、我指的是您在此处分享的日志:

    请查找下面连接的 UART 终端输出:

    [/报价]

    是的。。 这些是 删除了“--option=flash-phy-tuning-data“步骤后非工作板上的 SBL 日志。

    BR、
    Shubham

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

    嗨、Shubham、

    这是我的分析:

    • 删除“--operation=flash-phy-tuning-data“后可以看到刷写和引导都成功。
    • 现在、您删除的行、我希望您知道为什么它是在名为.cfg 的配置文件中引入的。 如果没有,那么我会让您阅读以下常见问题解答:  【常见问题解答】SK-AM64B :-操作=flash-phy-tuning-data 的目的是什么? 
    • 看起来它已经刷写到需要位于的位置/偏移处。 我之所以这么说、是因为在引导时、您的默认 SDK SBL Null 具有 OSPI 的 SysConfig 设置、其中 OSPI 选中了“PHY Enabled“选项。
    • 这意味着引导加载程序将读取 DM 应用映像、此读取操作将是启用 PHY 的读取、在您的情况下会成功完成。

    结论: 因此、根本原因可能是您的闪存 S28HS512T 的拓扑结构发生了变化、即可能已切换到混合而不是统一模式。

    但是、在开始进行上述总结之前、我想让您检查其他 UART COM 端口是否出现了 IPC 日志? 这意味着 SBL/Bootloader 成功读取 DM Appimage 并执行它。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    很抱歉耽误响应。

    以下是从 DM 运行的第 3 个 UART COM 端口上的输出:

    对于第 2 个和第 4 个端口... 没有信息:

    请告诉我您的反馈。

    BR、
    Shubham

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

    嗨、Shubham、

    现在、根据您的日志、看起来 SBL 与 DM Appimage 一起正确刷写。

    结论: 因此、根本原因可能是您的闪存 S28HS512T 的拓扑发生了变化、也就是说、它可能已切换到混合模式而不是统一模式。

    我相信这是正确的。

    为了确定上述语句是否符合要求、我们可以执行一组闪存寄存器读取、这将为我们提供相关信息。

    我将分享要在 flash_nor_ospi.c 文件中进行的更改、发布后必须进行更改、再次构建板级配置文件、然后简单地刷写+引导、这样我们就可以查看日志。 仅供参考、我将提供的更改将是文件 flash_nor_ospi.c.内的一堆日志语句 有时请允许我。 我看到您的地址在 11.1 上、因此我将提供 11.1 SDK flash_nor_ospi.c 文件的更改。

    此致、

    Vaibhav

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

    嗨、Shubham、

    我正在共享 API 的更改。

    不共享修补程序、因为它可能不适合您的驱动程序、因为您可能进行了任何细微更改。

    只需共享 API、即可轻松复制和替换现有 API。

    API 为 Flash_norOspiOpen。 这些更改只是一组记录语句、这些语句会打印闪存的寄存器值。

    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;
        uint32_t readDataCapDelay, phyTuningOffset;
    
        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);
        }
    
        if(SystemP_SUCCESS == status)
        {
            if(SystemP_SUCCESS == OSPI_skipTuning(obj->ospiHandle))
            {
                OSPI_enablePhy(obj->ospiHandle);
    
                /* PHY configuration are already stored and has to be written into register */
                OSPI_phyWriteTunedVal(obj->ospiHandle);
    
                /* Set RD Capture Delay by reading ID */
                readDataCapDelay = 15U;
                OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay, TRUE);
                phyTuningOffset = Flash_getPhyTuningOffset(config);
                attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
    
                while((attackVectorStatus != SystemP_SUCCESS) && (readDataCapDelay > 0U))
                {
                    readDataCapDelay--;
                    OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay, TRUE);
                    attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
                }
    
                if(SystemP_SUCCESS == attackVectorStatus)
                {
                    obj->phyEnable = TRUE;
                }
    
                OSPI_disablePhy(obj->ospiHandle);
            }
    
            if(SystemP_SUCCESS != attackVectorStatus || SystemP_SUCCESS != OSPI_skipTuning(obj->ospiHandle))
            {
                /* Enable PHY if attack vector present and PHY mode is enabled */
                phyTuningOffset = Flash_getPhyTuningOffset(config);
                if(OSPI_isPhyEnable(obj->ospiHandle))
                {
                    attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
    
                    if(attackVectorStatus != SystemP_SUCCESS)
                    {
                        /* Flash the attack vector to the last block */
                        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);
                        attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
                    }
    
                    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;
                }
            }
        }
        else
        {
            DebugP_logError("%s : Unable to read Flash ID...\r\n", __func__);
        }
    
        /* Any flash specific quirks, like hybrid sector config etc. */
        if(SystemP_SUCCESS == status && params->quirksFxn != NULL)
        {
            params->quirksFxn(config);
        }
        else
        {
            uint8_t regData = 0x00;
    
            /* Read registers and print them consecutively */
            Flash_norOspiRegRead(config, 0x65, 0x00800000, &regData);
            DebugP_log("Status Register 1: %u \r\n", regData);
            regData = 0;
            Flash_norOspiRegRead(config, 0x65, 0x00800001, &regData);
            DebugP_log("Status Register 2: %u \r\n", regData);
            regData = 0;
            Flash_norOspiRegRead(config, 0x65, 0x00800002, &regData);
            DebugP_log("Configuration Register 1: %u \r\n", regData);
            regData = 0;
            Flash_norOspiRegRead(config, 0x65, 0x00800003, &regData);
            DebugP_log("Configuration Register 2: %u \r\n", regData);
            regData = 0;
            Flash_norOspiRegRead(config, 0x65, 0x00800004, &regData);
            DebugP_log("Configuration Register 3: %u \r\n", regData);
            regData = 0;
            Flash_norOspiRegRead(config, 0x65, 0x00800005, &regData);
            DebugP_log("Configuration Register 4: %u \r\n", regData);
            regData = 0;
            Flash_norOspiRegRead(config, 0x65, 0x00800006, &regData);
            DebugP_log("Configuration Register 5: %u \r\n", regData);
    
        }
    
        return status;
    }

     

    完成更改后、希望您通过运行以下命令来构建源库。

    现在、也重新编译您的应用程序和引导加载程序二进制文件。

    完成所有这些操作后、在没有--operatio**phy-tuning-da***行的情况下再次刷新软件、并与我共享生成的日志。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    以下是我执行的步骤:

    1.更新了  SDK flash_nor_ospi.c 中的 API Flash_norOspiOpen

    2. 通过运行上述命令构建源代码库。

    3.在使用 default_sbl_null.cfg 时、重新编译“../../examples/drivers/boot/sbl_uart_uniflash_multistage/sbl_uart_uniflash_stage2/am62x-sk/r5fss0-0_nortos/ti-arm-clang/sbl_uart_uniflash_stage2.release.appimage 和“../../examples/drivers/ipc/ipc_rpmsg_echo_linux/am62x-sk/r5fss0-0_freertos/ti-arm-clang/ipc_rpmsg_echo_linux.release.appimage。

    4.刷写了配置 default_sbl_null.cfg、其中未显示 “--operation=flash-phy-tuning-data“。

    以下是日志:

    1. default_sbl_null.cfg 闪存的日志。

    2. COM 端口的日志。

    完成所有这些操作后、在没有--operatio**phy-tuning-da***行的情况下再次刷新软件、并与我共享生成的日志。

    您能告诉我这些日志是否是您提到的日志吗?

    BR、

    Shubham

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

    您好、

    抱歉我看到日志记录语句位于我提供的 Else 部分下方、请用以下更新后的 API 替换:

    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;
        uint32_t readDataCapDelay, phyTuningOffset;
    
        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);
        }
    
        if(SystemP_SUCCESS == status)
        {
            if(SystemP_SUCCESS == OSPI_skipTuning(obj->ospiHandle))
            {
                OSPI_enablePhy(obj->ospiHandle);
    
                /* PHY configuration are already stored and has to be written into register */
                OSPI_phyWriteTunedVal(obj->ospiHandle);
    
                /* Set RD Capture Delay by reading ID */
                readDataCapDelay = 15U;
                OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay, TRUE);
                phyTuningOffset = Flash_getPhyTuningOffset(config);
                attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
    
                while((attackVectorStatus != SystemP_SUCCESS) && (readDataCapDelay > 0U))
                {
                    readDataCapDelay--;
                    OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay, TRUE);
                    attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
                }
    
                if(SystemP_SUCCESS == attackVectorStatus)
                {
                    obj->phyEnable = TRUE;
                }
    
                OSPI_disablePhy(obj->ospiHandle);
            }
    
            if(SystemP_SUCCESS != attackVectorStatus || SystemP_SUCCESS != OSPI_skipTuning(obj->ospiHandle))
            {
                /* Enable PHY if attack vector present and PHY mode is enabled */
                phyTuningOffset = Flash_getPhyTuningOffset(config);
                if(OSPI_isPhyEnable(obj->ospiHandle))
                {
                    attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
    
                    if(attackVectorStatus != SystemP_SUCCESS)
                    {
                        /* Flash the attack vector to the last block */
                        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);
                        attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
                    }
    
                    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;
                }
            }
        }
        else
        {
            DebugP_logError("%s : Unable to read Flash ID...\r\n", __func__);
        }
    
        /* Any flash specific quirks, like hybrid sector config etc. */
        if(SystemP_SUCCESS == status && params->quirksFxn != NULL)
        {
            params->quirksFxn(config);
        }
        
        uint8_t regData = 0x00;
    
        /* Read registers and print them consecutively */
        Flash_norOspiRegRead(config, 0x65, 0x00800000, &regData);
        DebugP_log("Status Register 1: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800001, &regData);
        DebugP_log("Status Register 2: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800002, &regData);
        DebugP_log("Configuration Register 1: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800003, &regData);
        DebugP_log("Configuration Register 2: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800004, &regData);
        DebugP_log("Configuration Register 3: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800005, &regData);
        DebugP_log("Configuration Register 4: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800006, &regData);
        DebugP_log("Configuration Register 5: %u \r\n", regData);    
    
        return status;
    }

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    请查找更新的日志:

    请告诉我您的反馈。

    BR、
    Shubham

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

    嗨、Shubham、

    根据日志、通常您正在使用的闪存器件之前已修改。 修改后的意思是说、状态寄存器 1 之前已经由可能有权访问该电路板的人写入过一次。

    本质上、我看到状态寄存器 1 的 LPROT 位设置为 1、这意味着:

    因此、这意味着闪存的最后 1/64MB 受到保护、不受写入和擦除操作的影响、但您可以从中进行读取。

    因此、闪存的最后 1/64MB 基本上是 (1/64)* sizeOfFlash =(1/64)* 64 = 1MB 闪存。 这是闪存器件最后的偏移量 1MB。

    phy 调优偏移在最后 1MB 范围内、因此写入此偏移会导致失败。

    希望这解释了你所面临的背后的原因。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    感谢您提供详细信息。

    如果您有办法恢复它、因为它是 SDK 12 的拦截器、您能给我们建议吗?

    提前感谢。

    BR、
    Shubham

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果有办法恢复它、您能给我们建议吗?

    嗨、Shubham、

    我可以建议您做以下操作。

    请使用以下定义更改函数 Flash_norOspiOpen。

    这种更改的作用是、基本上会将状态寄存器 1、LBPROT 位改回 0。 这将确保对闪存最后 1MB 的写入工作正常。

    让我在某个时候与你分享这个。

    此致、

    Vaibhav

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

    您能否快速运行以下命令、我还需要检查非易失性寄存器值。

    我们读取易失性状态寄存器 1 值、在这里我们可以看到 LBPROT 位为 1。

    因此、我们有 2 个地址、一个用于易失性、另一个用于非易失性。

    因此、对于易失性、它为 0x800000 \;对于非易失性、它为 0x0000。

    因此在本应用手册上、请使用修改后的 API 重新运行、其中仅包含另外 1 条调试语句。 此调试语句将读取 SR1 的非易失性寄存器值。

    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;
        uint32_t readDataCapDelay, phyTuningOffset;
    
        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);
        }
    
        if(SystemP_SUCCESS == status)
        {
            if(SystemP_SUCCESS == OSPI_skipTuning(obj->ospiHandle))
            {
                OSPI_enablePhy(obj->ospiHandle);
    
                /* PHY configuration are already stored and has to be written into register */
                OSPI_phyWriteTunedVal(obj->ospiHandle);
    
                /* Set RD Capture Delay by reading ID */
                readDataCapDelay = 15U;
                OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay, TRUE);
                phyTuningOffset = Flash_getPhyTuningOffset(config);
                attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
    
                while((attackVectorStatus != SystemP_SUCCESS) && (readDataCapDelay > 0U))
                {
                    readDataCapDelay--;
                    OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay, TRUE);
                    attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
                }
    
                if(SystemP_SUCCESS == attackVectorStatus)
                {
                    obj->phyEnable = TRUE;
                }
    
                OSPI_disablePhy(obj->ospiHandle);
            }
    
            if(SystemP_SUCCESS != attackVectorStatus || SystemP_SUCCESS != OSPI_skipTuning(obj->ospiHandle))
            {
                /* Enable PHY if attack vector present and PHY mode is enabled */
                phyTuningOffset = Flash_getPhyTuningOffset(config);
                if(OSPI_isPhyEnable(obj->ospiHandle))
                {
                    attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
    
                    if(attackVectorStatus != SystemP_SUCCESS)
                    {
                        /* Flash the attack vector to the last block */
                        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);
                        attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
                    }
    
                    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;
                }
            }
        }
        else
        {
            DebugP_logError("%s : Unable to read Flash ID...\r\n", __func__);
        }
    
        /* Any flash specific quirks, like hybrid sector config etc. */
        if(SystemP_SUCCESS == status && params->quirksFxn != NULL)
        {
            params->quirksFxn(config);
        }
        
        uint8_t regData = 0x00;
    
        /* Read registers and print them consecutively */
        Flash_norOspiRegRead(config, 0x65, 0x00800000, &regData);
        DebugP_log("Status Register 1: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00, &regData);
        DebugP_log("Status Register 1 - non-volatile address value: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800001, &regData);
        DebugP_log("Status Register 2: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800002, &regData);
        DebugP_log("Configuration Register 1: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800003, &regData);
        DebugP_log("Configuration Register 2: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800004, &regData);
        DebugP_log("Configuration Register 3: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800005, &regData);
        DebugP_log("Configuration Register 4: %u \r\n", regData);
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800006, &regData);
        DebugP_log("Configuration Register 5: %u \r\n", regData);    
    
        return status;
    }

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

    尊敬的 Vaibhav:

    请查找更新的日志:

    BR、
    Shubham

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

    嗨、Shubham、

    我可以看到 SR1 的非易失性值为 0。

    这意味着在 PORz、NV 内容将被处理到 V 寄存器、然后执行其余操作。

    我怀疑您的代码中有人在更改状态寄存器 1 字段。

    如果团队中有多个成员、您能否与他人交叉核实是否对代码的任何部分(可能在应用层,驱动程序层或电路板层)进行了任何更改。

    如果绝对没有变化、请告诉我、然后我可以建议解决这个问题。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    soc 如果您的团队中有多个成员、请与某人交叉核实是否对代码的任何部分进行了任何更改、这些更改可能位于应用层、驱动程序层或电路板层。

    我与正在处理同一项目的其他同事进行了讨论、但没有进行此类更改。

    如果完全没有任何更改、请告诉我、然后我可以为此建议一个修复方法。

    是的、请... 它会有所帮助。

    BR、
    Shubham

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

    嗨、Shubham、

    我认为 SDK 12 中有一部分代码写入状态寄存器。

    让我检查一下是否存在类似的东西。

    一旦我有了更多的澄清,我将回复你。

    此致、

    Vaibhav

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

    有趣的是、没有函数在写入状态寄存器 1、我想知道它是如何写入的、尽管没有 API 接触状态寄存器 1。

    对于此闪存器件、唯一向前移动的方法是将 0 写入 LBPROT 位。

    在 Flash_norOspiOpen API 中、我想介绍一下这种写入 API、它将写入状态寄存器 1。

    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;
        uint32_t readDataCapDelay, phyTuningOffset;
    
        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);
        }
    
        if(SystemP_SUCCESS == status)
        {
            if(SystemP_SUCCESS == OSPI_skipTuning(obj->ospiHandle))
            {
                OSPI_enablePhy(obj->ospiHandle);
    
                /* PHY configuration are already stored and has to be written into register */
                OSPI_phyWriteTunedVal(obj->ospiHandle);
    
                /* Set RD Capture Delay by reading ID */
                readDataCapDelay = 15U;
                OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay, TRUE);
                phyTuningOffset = Flash_getPhyTuningOffset(config);
                attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
    
                while((attackVectorStatus != SystemP_SUCCESS) && (readDataCapDelay > 0U))
                {
                    readDataCapDelay--;
                    OSPI_setRdDataCaptureDelay(obj->ospiHandle, readDataCapDelay, TRUE);
                    attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
                }
    
                if(SystemP_SUCCESS == attackVectorStatus)
                {
                    obj->phyEnable = TRUE;
                }
    
                OSPI_disablePhy(obj->ospiHandle);
            }
    
            if(SystemP_SUCCESS != attackVectorStatus || SystemP_SUCCESS != OSPI_skipTuning(obj->ospiHandle))
            {
                /* Enable PHY if attack vector present and PHY mode is enabled */
                phyTuningOffset = Flash_getPhyTuningOffset(config);
                if(OSPI_isPhyEnable(obj->ospiHandle))
                {
                    attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
    
                    if(attackVectorStatus != SystemP_SUCCESS)
                    {
                        /* Flash the attack vector to the last block */
                        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);
                        attackVectorStatus = OSPI_phyReadAttackVector(obj->ospiHandle, phyTuningOffset);
                    }
    
                    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;
                }
            }
        }
        else
        {
            DebugP_logError("%s : Unable to read Flash ID...\r\n", __func__);
        }
    
        /* Any flash specific quirks, like hybrid sector config etc. */
        if(SystemP_SUCCESS == status && params->quirksFxn != NULL)
        {
            params->quirksFxn(config);
        }
        
        uint8_t regData = 0x00;
    
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800000, &regData);
        DebugP_log("Status Register 1: %u \r\n", regData);
        
        regData &= ~(0x1C); // setting bits[4:2] LBPROT to 0
        Flash_norOspiRegWrite(config, 0x71, 0x00800000, regData);
    
        regData = 0;
        Flash_norOspiRegRead(config, 0x65, 0x00800000, &regData);
        DebugP_log("New Status Register 1 value after setting LBPROT to 0: %u \r\n", regData);       
    
        return status;
    }

    之后、重建驱动程序、闪存板层和所有应用程序、并测试其是否正常工作。

    期待您的答复。

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

    尊敬的 Vaibhav:

    感谢您的意见。  很抱歉、由于硬件是在共享的基础上提供的、因此响应延迟。

    现在、在更新 API Flash_norOspiOpen 后、我们 能够将 0 写入 LBPROT 位和预期日志:

    您能不能告诉我、我们是否必须每次都为不同的 SDK 11.0、12.0 版 API Flash_norOspiOpen 进行设置? 因为我们尝试使用默认 cfg 构建 SDK 映像、但失败的原因相同。

    BR、
    Shubham

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

    嗨、Shubham、

    如果我们每次都要使用 API Flash_norOspiOpen 为不同的 soc 11.0、12.0 进行设置、请告诉我。 因为我们尝试使用默认 cfg 构建 SDK 映像、但失败的原因相同。

    看起来是肯定的。

    我将与开发团队讨论此问题、但很可能对于此板、您可以使用我分享的更改。

    这种更改只是将 LBPROT 位 2:4 设置为 0。

    这可确保闪存的最后 1MB 不受编程操作(即擦除和写入)的保护。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    看起来是肯定的。

    我将与开发团队讨论此问题、但很可能对于此板、您可以使用我分享的更改。

    这种更改只是将 LBPROT 位 2:4 设置为 0。

    这可确保闪存的最后 1MB 不受编程操作(即擦除和写入)的保护。

    [/报价]

    当然... 感谢您的确认。

    我们  还将继续在 SDK 12.0 的 API Flash_norOspiOpen 中将 LBPROT 位 2:4 设置为 0。 如果开发团队有任何更新、请告知我们。

    再次感谢您在整个讨论过程中提供的支持。

    BR、
    Shubham

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

    尊敬的 Vaibhav:

    我们将 SDK 更新为 MCU_PLUS_SDK_am62x_12_00_00_27、在刷写 default_sbl_null.cfg 时、控制卡在执行第 3 个命令:

    我们尝试了上述权变措施并删除了“--operation=flash-phy-tuning-data“、但控件再次卡在第 3 步:

    如果需要根据 SDK MCU_PLUS_SDK_am62x_12_00_27 更新注意任何其他要点、请提供您的反馈。

    BR、

    Shubham

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

    您好、

    让我来看看这个。

    此致、

    Vaibhav

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

    嗨、Shubham、

    我已经浏览过此线程、默认 SDK 在任何应用中都没有将 LBPROT 位设置为 1。

    但是、您能否尝试使用未进行任何更改的全新 MCU_PLUS_SDK_am62x_12_00_00_27(将所有内容保留为默认值)、并尝试刷写应用程序映像?

    由于您使用的是默认的闪存器件 S28HS512T、因此使用最新 SDK 刷写应用程序映像不会有任何问题。

    此致、

    Aryamaan

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

    尊敬的 Aryamaan:

    我已经浏览过此线程、默认 SDK 在任何应用中都没有将 LBPROT 位设置为 1。

    但是、您能否尝试使用未进行任何更改的全新 MCU_PLUS_SDK_am62x_12_00_00_27(将所有内容保留为默认值)、并尝试刷写应用程序映像?

    [/报价]

    我尝试使用全新的 MCU_PLUS_SDK_am62x_12_00_00_27 没有进行任何更改、上面的内容(在我之前的注释中)是相同的日志。 之后我尝试了 Vaibhav 为 API Flash_norOspiOpen 建议的修改、日志没有变化。

    BR、
    Shubham

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

    嗨、Shubham、

    在最新 SDK 的 SysConfig 文件中、您能否为要刷写的每个应用程序删除以下 2 个自定义函数并重试?

    更改:

    为此:

    safeBootdetection 函数会复位配置寄存器、这可能会导致您遇到的问题。

    此致、

    Aryamaan

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

    尊敬的 Aryamaan:

    感谢您的意见。

    我正在使用命令行来刷写 SBL 映像、因此我  在 flash_nor_ospi.c 中删除了函数 Flash_quirkSpansionSafebootDetection 和 Flash_quirkSpansionConfigureLayout 的内容、并重新构建所有必需的映像。

    现在、我也能够为 SDK 12.0 刷写 SBL 映像。

    您能提供有关使用上述功能为我们的电路板刷写故障的反馈。 如果我们需要始终删除这些功能、或者我们的电路板出现故障的具体原因是什么?  

    BR、
    Shubham

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

    嗨、Shubham、

    Im 很高兴知道应用程序映像正在成功刷写。

    我建议您注释掉上述两个函数是复位配置寄存器并将闪存配置为默认状态的函数。

    但是、在您的情况下、我们需要闪存在修改后的状态下工作、尤其是在手动将 LBPROT 位设置为 0 的状态下。

    因此、需要删除上述两个功能。

    请注意、上述两个函数对闪存操作的工作没有直接影响、这两个函数仅用于将闪存从未知状态恢复到已知状态、这是闪存的默认状态。

    此致、

    Aryamaan

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

    尊敬的 Aryamaan:

    [引述 userid=“666707“ url=“~/support/processors-group/processors/f/processors-forum/1640007/sk-am62-issue-during-flash-the-soc device-initialization-binary-to-the-EVM/6405107“]

    我建议您注释掉上述两个函数是复位配置寄存器并将闪存配置为默认状态的函数。

    但是、在您的情况下、我们需要闪存在修改后的状态下工作、尤其是在手动将 LBPROT 位设置为 0 的状态下。

    因此、需要删除上述两个功能。

    [/报价]

    感谢您的确认。

    BR、
    Shubham