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.

[参考译文] Linux/AM5708:从 eMMC 默认分区引导 MLO 和 u-boot 映像时出错

Guru**** 2569255 points
Other Parts Discussed in Thread: AM5708

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/623577/linux-am5708-error-in-booting-mlo-and-u-boot-image-from-emmc-default-partition

器件型号:AM5708
主题中讨论的其他器件: CSDDRA742PMP

工具/软件:Linux

您好!

我使用的是基于 AM5708处理器的电路板。

我想从 eMMC 默认引导分区 mmcblk0boot0引导我的 MLO 和 u-boot 映像。

我已更改 eMMC 的 PART_CONF 寄存器中的 BOOT_ACK 和 BOOT_PARTITION_ENABLE 字段。

我已更改 eMMC 的 EXT_CSD 寄存器中的以下字段、

引导配置字节[partition_config:0x48]
 引导分区1已启用
 无法访问引导分区

引导总线条件[BOOT_BUS_Conditions:0x12]-针对 DDR 模式

H/W 复位功能[RST_N_FUNCITY]:0x01

然后、我通过 dd 命令将 MLO 和 u-boot 映像复制到/dev/mmcblk0boot0。

启动时、我收到以下错误、

SPL:MMC 分区交换机出现故障
SPL:无法从所有引导设备引导
###错误###请重置电路板###

它在 PART_Cong 寄存器的 MMC 开关命令中抛出错误。

是否有人可以帮助我如何从 eMMC 默认 mmcblk0boot0分区引导 MLO 和 u-boot?

谢谢、

Gunjal

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

    您好 Gunjal、

    /dev/mmcblk0bootX 用于各种配置设置。 是否可以将 MLO adn u-boot.img 复制/dev/mmcblk0p1?

    此致、
    Kemal

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

    您好!

    我们已经完成了这项工作,而且工作正常,但我们希望启用对“备用引导操作模式”的支持(AM57xx TRM:主题 33.3.7.6.2.3“引导过程”)。

    我们还能够从 mmcblk0boot0分区加载 MLO、但在引导过程中遇到上述问题。

    这是我的日志、

    U-Boot SPL 边缘

    DRA722-GP ES2.0

    尝试从 MMC2引导

    在 d 中的 MMC_switch 中:设置= 1、索引= 179、值= 1

    在 x 中的 MMC_SWITCH 中:设置= 1、索引= B3、值= 1

    在 MMC_switch 中:cmdargs = 3b30100

    CMD_SEND:6

            ARG            0x03B30100

    OMAP-SEND_cmd 有趣的示例

    omap_hmc_send_cmd:线路:942

    omap_hmc_send_cmd:线路:951

    omap_hsmmc_send_cmd:线路:962

    omap_hsmmc_send_cmd:线路:1000

    omap_hsmmc_send_cmd:线路:1024

    omap_hsmmc_send_cmd:线路:1029

    omap_hsmmc_send_cmd:线路:1033

    omap_hsmmc_send_cmd:Line:1043,MMC_stat = 18001

            可重置            -19.

    在 MMC_switch 中:MMC_SEND_cmd 的 ret =-19

    在 MMC_switch 中:MMC_SEND_STATUS 的 ret =-19

    SPL:MMC 分区交换机出现故障

    SPL:无法从所有引导设备引导

    ###错误###请重置电路板###

     


    在这种情况下可以帮帮我吗?

    谢谢、

    Gunjal

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

    我在上面提到的错误中查找了 spl 的代码。
    因此、在从/dev/mmcblk0boot0引导 MLO 期间会发生什么情况、我的引导模式设置为 MMCSD_MODE_EMMCBOOT。
    在这种情况下、它尝试为 EXT_CSD_PART_CONF 寄存器发送 MMC_SWITCH 命令、在该命令期间、它在 MMC 的 MMCHS_ARG (命令参数寄存器)上写入 cmdargs、并读取 MMCHS_STAT (中断状态寄存器)。 在 MMCHS_STAT 中、设置读取值 CTO (命令超时错误)位。 因此、它由此引发错误。
    那么,您能告诉我如何解决此错误并从/mmcblk0boot0引导 u-boot 映像吗?

    您说“/dev/mmcblk0bootX 适用于各种配置设置”,这是否意味着我无法从/mmcblk0bootx 引导 u-boot 映像?

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

    当引导 ROM 跳转到 MLO 时、它在 r0中具有引导参数块的地址。 一个字段是引导 ROM 找到 MLO 的位置。 请参阅 TRM 中的初始化一章。 我认为 u-boot 代码有一个错误。 TRM 的 SD 卡(mmc1)值为5、eMMC 引导区值为6 、eMMC (mmc2)值为7。 如果您查看 u-boot 代码、您将在 arch/arm/include/asm/arch-omap5/spl.h 中找到

    #define BOOT_DEVICE_MMC1       0x05
    #define BOOT_DEVICE_MMC2       0x06
    #define BOOT_DEVICE_MMC2_2     0x07

    应交换6和7。 导致这种情况的原因是、当 MMC2_2本应是 MMC2_2时、我看到一条消息、提示尝试从 MMC2引导。

    我很好奇、您说 MLO/u-boot.img 位于 mmc1 (mmcblk0boot0)中、但引导 ROM 在 mmc2 (mmcblk1boot0)中查找引导分区。

    Steve K.

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

    您好、Steve、

    感谢您的回复。

    关于您在最后一行中提到的内容、实际上我们在 mmc1上有 SD 卡、在 mmc2上有 EMMC。 在文件系统中、当 SD 卡未连接时、eMMC 分区显示为 mmcblk0、但在引导序列中、EMMC 显示为 MMC2。 这就是它显示从 MMC2引导的原因。

    关于交换 MMC2 MMC2_2、我尝试这样做、但仍然遇到相同的问题。

    此外、我还看到在 spl_MMC.c 文件中的函数 spl_mmc_load_image ()中、我们的 SDK 具有以下代码、

        switch (boot_mode){

        案例 MMCSD_MODE_EMMCBOOT:

                /*

                *我们需要检查分区的配置。

                * 1和2匹配至 BOOT0/BOOT1、而7是用户数据

                *这是第一个物理分区(0)。

                *

                Part =(MMMC->PART_CONFIG >> 3)& PART_ACCESS_MASK;

                如果(部件==7)

                    部分= 0;

                ERR = MMC_SWITCH_part (0、part);

                如果(err){

    #ifdef CONFIG_SPL_LIBCOMMON_SUPPTL.

                    PUT ("spl:MMC 分区切换失败\n");

    #endif

                    退货错误;

                }


    当我签入最新的 SDK 时、它在同一函数中包含以下代码、

           switch (boot_mode){
           案例 MMCSD_MODE_EMMCBOOT:
                           /*
                            *我们需要检查分区的配置。
                            * 1和2匹配至 BOOT0/BOOT1、而7是用户数据
                            *这是第一个物理分区(0)。
                            *
                           Part =(MMMC->PART_CONFIG >> 3)& PART_ACCESS_MASK;

                           如果(部件==7)
                                   部分= 0;

                           if (CONFIG_IT_ENABLED (MMC_Tiny))
                                   ERR = MMC_SWITCH_part (MMC、part);
                           其他
                                   ERR = blk_dselect_hwpart (MMC_get_blk_desc (MMC)、part);

                           如果(err){
    #ifdef CONFIG_SPL_LIBCOMMON_SUPPTL.
                                   PUT ("spl:MMC 分区切换失败\n");
    #endif
                                   退货错误;
                           }

    因此、它还增加了一些功能。 我猜这是我们问题的原因。

    你能告诉我吗? 或者还有其他问题吗?

    此致、

    Gunjal

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

    我能够从 DRA7 EVM 上的 eMMC 引导分区0引导、因为我可以轻松地更改引导模式。 DRA7和 AM57xx 使用相同的系统引导模式。  我对源代码做了三个小改动:

    在 arch/arm/mach-omap5/boot.c 中、我添加了 boot_device_mc2_2

    静态 u32 boot_devices[]={
    #if 已定义(CONFIG_DRA7XX)
           BOOT_DEVICE_MMC2_2、
           BOOT_DEVICE_MMC2、
           BOOT_DEVICE_NAND、
           BOOT_DEVICE_MMC1、
           BOOT_DEVICE_SATA、
           BOOT_DEVICE_XIP、
           BOOT_DEVICE_XIP、
           BOOT_DEVICE_SPI、
           BOOT_DEVICE_SPI、
    其他

    2.交换了 arch/arm/include/asm/arch-omap5/spl.h 中的6和7

    #define BOOT_DEVICE_MMC1       0x05
    #define BOOT_DEVICE_MMC2       0x07
    #define BOOT_DEVICE_MMC2_2     0x06

    3.已将 CONFIG_EMMC_BOOT 添加至 CONFIGS/dra7xx_EVM_defconfig

    CONFIG_FIT = y
    CONFIG_SYS_Extra 选项="EMMC_Boot "
    CONFIG_of_Board_Setup=y

    我从 SD 卡引导、并从 Linux 执行以下操作

    DD IF=/dev/zero of=/dev/mmcblk1boot0 BS=512
    DD IF=MLO of=/dev/mmcblk1boot0 BS=512
    DD if=u-boot.img of=/dev/mmcblk1boot0 bs=512 seek=768

    假设 eMMC 位于 mmc2上。 控制台输出显示

    U-Boot SPL 2017.01-00319-gfe893f73f0e4-脏 污(2017年9月28日- 07:47:12)
    DRA752-GP ES1.1
    尝试从 MMC2_2引导
    ***警告- CRC 错误,使用默认环境

    U-Boot 2017.01-00319-gfe893f73f0e4-脏 污(2017年9月28日- 07:47:12 -0500)

    CPU :DRA752-GP ES1.1
    型号:TI DRA742
    电路板:DRA74x EVM 修订版 G.0
    DRAM: 1.5GiB
    MMC:  OMAP SD/MMC:0、OMAP SD/MMC:1.
    SCSI: SATA link 0 timeout。
    AHCI 0001.0300 32插槽1端口3 Gbps 0x1不支持 SATA 模式
    标志:64位 NCQ stag pm led clo only pmp pio 贫民窟 part ccc apst
    正在扫描设备总线...
    找到0个器件。
    NET:  eth0:以太网@48484000
    按任意键停止自动引导: 0
    MMC:无卡存在
    MMC:无卡存在
    MMC:无卡存在
    MMC:无卡存在
    切换到分区#0,确定
    mmc1 (第0部分)是当前器件
    在器件1上找到 SD/MMC
    **无效分区2**
    =>

    Steve K.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    忘记一个重要步骤,请在尝试写入引导分区之前将其设置为 RW

    echo 0 >/sys/block/mmcblk1boot0/force_ro

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

    尽管我无法通过执行您提到的更改来解决问题、但我找到了解决方案。
    它在该函数调用中、

    ERR = MMC_SWITCH_part (0、part);

    从 spl_mmc_load_image()函数中,它为 MMC 块设备0执行 MMC 切换。
    但是、在 MMC 块器件1上检测到了我们的 EMMC。
    因此、通过更改 MMC_SWITCH_part (1、part)、我能够从 eMMC 引导分区成功加载 uboot 映像。

    感谢您的回答。

    此致、
    Gunjal