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.

[参考译文] AM62P-Q1:MMC SBL 和 AB 分区切换问题

Guru**** 2394305 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1480320/am62p-q1-mmc-sbl-an-ab-partition-switchover-problem

器件型号:AM62P-Q1

工具与软件:

我们使用 eMMC 的 SBL 快速入门、将 mmcblk0boot0和 mmcblk0boot1用作双分区、通过更改 eMMC 寄存器的179位来修改引导分区。
引导文件为 tiboot3.bin、sbl_emmc_linux_stage2.debug.appimage.hs_fs、hsm.appimage.hs_fs、u-boot.img、mcu_r5_image、linux_a53_image。

切换后、我们发现 mcu_r5_image 和 linux_a53_image 始终在默认情况下使用 mmcblk0boot0文件、并且其他文件位置正确。 我想问问哪里可以修改这两个负载的地址、以及如何使这两个文件能够加载它们各自分区位置的内容。

echo 0 > /sys/block/mmcblk0boot0/force_ro
dd if=tiboot3.bin of=/dev/mmcblk0boot0 seek=0
sleep 1
dd if=sbl_emmc_linux_stage2.debug.appimage.hs_fs of=/dev/mmcblk0boot0  bs=1k  seek=512
sleep 1
dd if=hsm.appimage.hs_fs of=/dev/mmcblk0boot0  bs=1k  seek=2304
sleep 1
dd if=u-boot.img of=/dev/mmcblk0boot0  bs=1k  seek=2560
sleep 1
dd if=mcu_r5_image of=/dev/mmcblk0boot0  bs=1k  seek=8192
sleep 1
dd if=linux_a53_image of=/dev/mmcblk0boot0  bs=1k  seek=18432


echo 0 > /sys/block/mmcblk0boot1/force_ro
dd if=tiboot3.bin of=/dev/mmcblk0boot1 seek=0
sleep 1
dd if=sbl_emmc_linux_stage2.debug.appimage.hs_fs of=/dev/mmcblk0boot1  bs=1k  seek=512
sleep 1
dd if=hsm.appimage.hs_fs of=/dev/mmcblk0boot1  bs=1k  seek=2304
sleep 1
dd if=u-boot.img of=/dev/mmcblk0boot1  bs=1k  seek=2560
sleep 1
dd if=mcu_r5_image of=/dev/mmcblk0boot1  bs=1k  seek=8192
sleep 1
dd if=linux_a53_image of=/dev/mmcblk0boot1  bs=1k  seek=18432

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

    您好、Kong:

    我不能完全理解这里的引导流程、您能提供同样的帮助吗? 您是否使用通过 MCU +SDK 中支持的 eMMC 引导 Linux: https://software-dl.ti.com/mcu-plus-sdk/esd/AM62PX/10_01_00_33/exports/docs/api_guide_am62px/SBL_BOOTING_LINUX_EMMC.html

    然后在 u-boot 中、将这些映像刷写到两个引导分区并确定每次都要引导哪个分区?

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

    是的、我也使用此默认逻辑进行引导、但我们现在使用双分区 A/B 方案进行异常处理、但默认 SDK 只会从 mmcblk0boot0引导、因此我们修改 eMMC 179寄存器以修改 MMCBLk0boot0/1的引导模式。 tiboot3.bin、sbl_emmc_linux_stage2.debug.appimage.hs_fs、hsm.appimage.hs_fs 和 u-boot.img 文件都是从相应的开关分区启动的。 但 MCU_R5_image、Linux_A53_image 这两个文件始终是从 mmcblk0boot0启动的、我找不到写入死区的位置

    与 uboot 开关对应的内核和 rootfs 分区是正确的。 问题是无法切换 eMMC SBL 中的某些引导文件

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

    您好、Kong:

    MCU+SDK SBL 支持从 eMMC 引导分区0引导、因此映像将从 boot0加载

    此致、

    开会。

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

    如何切换到 BOOT1

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

    您好、Kong:

    默认情况下、MCU+SDK 不支持此功能。 如果要切换到 boot1、则必须在驱动程序中进行一些更改。在 bootloader_mmcsd_raw.c 文件的第75行、引导分区硬编码为0:

    您可以根据逻辑将其更改为使用引导分区1。

    最棒的餐厅

    开会。

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

    我更改了此变更点。 tiboot3.bin、sbl_emmc_linux_stage2.debug.appimage.hs_fs、hsm.appimage.hs_fs、u-boot.img 都被剪切为 boot1。 现在、我不知道这两个 MCU_R5_image 之间存在错误、但 Linux_A53_image 不会切换到 boot1、而是使用了 boot0

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

    Debug 发现指导第二段的函数将 partconf 修改为1、但无法确定如何将其设置为1

     if (SYSTEMP_SUCCESS ==状态)
       {
           if (bootHandle!= NULL)
           {
           ((Bootloader_Config *) bootHandle)->scratchMemPtr = gAppimage;
               状态= App_loadImages (bootHandle、&bootImageInfo);

          }

    }

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

    大家好、有什么建议吗? 您能给我回复吗??

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

    您好!

    您能否分享您在 SDK 中进行的从 boot1分区启动映像的确切更改?

    如何确认 HSM 映像(hsm.appimage.hs_fs)和 A53 U-Boot (u-boot.img)确实会从 boot1引导、但不会从 Linux 和 MCU 应用映像引导。

    谢谢!

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

    1、我的改变:

    2、您可以在两个不同的分区中打印不同的 MCU 日志。 或删除 BOOT0的这部分 MCU 代码当 BOOT1为 BOOT1时、您会发现 BOOT1无法启动、受 BOOT0 MCU 缺失的影响

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

    您好、Kong:

    应用以下补丁将帮助您切换到引导分区1、请在应用补丁后重新编译库: e2e.ti.com/.../001_5F00_mcu_5F00_sdk_5F00_emmcbootpartindex.patch

    在应用该补丁后、您将能够使用 syscfg 选择要从哪个分区引导。您必须选择 Boot partition = 1才能从 mmc0boot0引导、2才能从 mmc0boot1引导。 请注意、如果要从 mmc0boot1分区中引导、则必须将 SBL stage-1和 SBL stag-2 (MCU、Linux、HSM)中每个引导加载程序实例的引导分区值更改为2:

    我已经在我的终端测试过一次、我可以使用这个切换到"mmc0boot1"、请尝试这个、如果您进一步遇到任何问题、请告诉我。

    此致、

    开会。

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

    您好、Kong:

    只是想澄清一下、我已经使用 MCU+SDK 版本10.0.0测试了此补丁、您还应该使用相同的版本、而不是 每次要切换分区时在驱动程序中对引导分区索引1/2进行硬编码。 请在结束时尝试此操作、如果有任何问题、请告诉我。

    此致、

    开会。

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

    我阅读了你的补丁、实际上、最终目标是改变这个函数 bootPartIndex 的值、我以前写了2个名字来验证、MCU、这个东西没有切开。 您是否确定您的 MCU 正在使用相应的分区。   
    我还使用版本10.0.0

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

    您好!

    您能否应用以下补丁并共享完整的启动日志?

    diff --git a/source/drivers/mmcsd/v0/mmcsd_v0.c b/source/drivers/mmcsd/v0/mmcsd_v0.c
    index 54e8d59..f805091 100644
    --- a/source/drivers/mmcsd/v0/mmcsd_v0.c
    +++ b/source/drivers/mmcsd/v0/mmcsd_v0.c
    @@ -1445,6 +1445,9 @@ static int32_t MMCSD_transfer(MMCSD_Handle handle, MMCSD_Transaction *trans)
             status = SystemP_FAILURE;
         }
     
    +    DebugP_log("CMD_SEND:%d\r\n", (trans->cmd) >> 8);
    +    DebugP_log("\t\t ARG \t\t 0x%08x \r\n", trans->arg);
    +
         if(SystemP_SUCCESS == status)
         {
             /* Check for interrupt enable */
    

    此修补程序会添加发送的命令及其参数的日志记录。 这样可以清楚地了解正在读取映像的引导分区。

    谢谢!

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

    我只需写下2

    static int32_t MMCSDRaw_imgRead(void *dst, uint32_t len, void *args)
    {
        int32_t status = SystemP_SUCCESS;
        //uint32_t partition = 1;
        Bootloader_MmcsdArgs *MMCSDArgs = (Bootloader_MmcsdArgs *)args;
        MMCSD_Handle handle = MMCSD_getHandle(MMCSDArgs->MMCSDIndex);
    
        if(handle == NULL)
    	{
    	   status = SystemP_FAILURE;
    	}
    
        if(status == SystemP_SUCCESS)
        {
      
            status = MMCSD_enableBootPartition(handle, 2);
    
            if(status != SystemP_SUCCESS)
            {
    
            }
            else
            {
                status = Bootloader_MmcsdRaw_readFromOffset(handle, dst, len, MMCSDArgs->curOffset);
    
                if(status != SystemP_SUCCESS)
                {
    
                }
                else
                {
                    CacheP_wb(dst, len, CacheP_TYPE_ALL);
                    MMCSDArgs->curOffset += len;
                }
            }
        }
    
        return status;
    }

    日志  

    root@am62pxx-evm:~# CMD_SEND:6
                     ARG             0x03b35200
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:6
                     ARG             0x03b10200
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:23
                     ARG             0x00000001
    CMD_SEND:17
                     ARG             0x00000400
    CMD_SEND:6
                     ARG             0x03b35200
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:6
                     ARG             0x03b10200
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:23
                     ARG             0x00000001
    CMD_SEND:17
                     ARG             0x00000400
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:23
                     ARG             0x00000002
    CMD_SEND:18
                     ARG             0x00000401
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:23
                     ARG             0x00000001
    CMD_SEND:17
                     ARG             0x00000403
    CMD_SEND:6
                     ARG             0x03b35200
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:6
                     ARG             0x03b10200
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:23
                     ARG             0x00000001
    CMD_SEND:17
                     ARG             0x00000400
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:23
                     ARG             0x000001f7
    CMD_SEND:18
                     ARG             0x00000401
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:23
                     ARG             0x00000001
    CMD_SEND:17
                     ARG             0x000005f8
    CMD_SEND:6
                     ARG             0x03b70000
    CMD_SEND:13
                     ARG             0x00020000
    CMD_SEND:6
                     ARG             0x03b90100
    CMD_SEND:0
                     ARG             0x00000000
    

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

    这些不是完整的日志。 请共享从 UART 端口捕获的日志。

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

    您好!

    很抱歉、这些仍不是完整的日志。 我在此处看不到任何类似的 SBL stage1和 stage2日志:

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM62PX/10_01_00_33/exports/docs/api_guide_am62px/EXAMPLES_DRIVERS_SBL_EMMC_LINUX_MULTISTAGE.html#autotoc_md1108

    此致、

    Prashant

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

    感谢您分享更新的日志!

    我看到 SBL stage2实际上是从 eMMC boot1分区读取的。 但是、我没有看到来自 SBL stage2的任何 CMD_SEND 序列。 我认为这些日志可能对应于 WKUP_UART0实例。

    您能否连接到 WKUP_UART0端口并检查其是否包含相关日志?

    谢谢!

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

    MCU 日志

    ▒▒[IPC RPMSG ECHO] Version: REL.MCUSDK.K3.10.00.00.14+ (Mar 24 2025 02:19:19):
    [IPC RPMSG ECHO] Remote Core waiting for messages at end point boot0...........13 ... !!!
    [IPC RPMSG ECHO] Remote Core waiting for messages at end point boot0...........14 ... !!!
    
    

    wkup 日志:

    ▒▒Sciserver Testapp Built On: Aug  7 2024 15:26:01
    Sciserver Version: v2024.08.0.0-REL.MCUSDK.K3.10.00.00.14+
    RM_PM_HAL Version: v10.00.08
    Starting Sciserver..... PASSED
    

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

    我在此处看不到任何 CMD_SEND 日志。 您是否重建了 SBL stage2并对其进行了重新刷新?

    请注意、SBL stage1正在从 boot1分区引导 SBL stage2。 因此、您将更新 boot1分区中的 stage2映像。

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

    是的、确实如此。 您测试过吗? 无法打印输出

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

    你是对的,但我遇到了一个奇怪的现象,我去 SBL 日志是有效的。 但对 wukp 日志的调用不起作用

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

    驱动程序更改似乎没有生效。 您是否要为相同的配置文件构建驱动程序和 SBL stage2映像?

    如有疑问、请分享两者的构建日志。

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

    你可以把你的编译步骤给我比较吗,我觉得我的第二阶段编译不能与驱动程序的东西相关联

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

    这些命令将为相同的配置文件构建库和 SBL stage2:

    ❯ make -s libs PROFILE=debug
    ❯ make -s -C ./examples/drivers/boot/sbl_emmc_linux_multistage/sbl_emmc_linux_stage2/am62px-sk/wkup-r5fss0-0_freertos/ti-arm-clang/ PROFILE=debug scrub all
    

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

    编译与驱动程序没有关联,问题已解决,非常感谢