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.

[参考译文] AM6442:eMMC 引导满足复位问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1432304/am6442-emmc-boot-meet-resetting-problem

器件型号:AM6442
Thread 中讨论的其他器件:CSD

工具与软件:

尊敬的 TI 专家:

客户仅基于 AM64x 构建其电路板。 他们的电路板没有 SD 卡、只有 eMMC。 它们使用的是 SDK10.0。

如今、他们拿起电路板、并可以使用 USB-DFU 成功引导。

但是、当他们尝试 eMMC 引导时、会遇到以下问题。

似乎有重置问题、客户的主板卡在这里。

我们在下面发现了一个非常相似的情况。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1336852/am6442-warm-rst-in-spl-does-not-work-with-emmc-on-custom-board

但是、在我们尝试上面/下面链接中提到的常见问题解答后、问题仍然存在。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1168342/faq-am62x-how-to-check-and-configure-emmc-flash-rst_n-signal-to-support-warm_reset-from-emmc-booting-on-am62x-sk-e2

我们尝试了以下方法、但没有用处。

为了提供更多信息供您参考、客户使用4MB eMMC、而我们的 EVM 使用8MB。 客户已按照以下常见问题解答修改4MB eMMC 的代码。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1163840/faq-am62x-how-to-customize-emmc-and-ospi-flash-layout-for-spl-u-boot-booting-with-ti-am62x-linux-sdk

我们还怀疑这也可能是由硬件设计问题导致的、因此我们还在这里提供了 eMMC 的硬件原理图、供您查看。

客户迫切需要开发电路板、而这是使用 AM64x 来控制多轴伺服的非常重要的项目。

您能否提供一些建议供客户试用?

非常感谢、

Kevin

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

    您好、Bin、

         最后、我了解根本原因。

    昨天、我换了三星(Samsung)的另一款 eMMC 芯片。 更换 eMMC 芯片后、tiboot3中没有卡住的热复位。

    测量的热复位序列时序对于吸入和成功引导是相同的。

    问题就出在 eMMC 芯片上。

    原因是原始 eMMC 无法在引导模式下正确复位、但可以在正常运行模式下复位。

    然后、我向 tiboot3添加代码、并手动发送 CMD0+args0、以便在勘误表处理热复位问题之前将 eMMC 置于空闲状态。

    工作正常!

    我想这个主题可以结束了。  

    非常感谢 Bin 和 Kevin!

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

    尊敬的 Wangbin:

    很高兴问题得到解决。 感谢您的更新。

    您是否介意分享 U-Boot 补丁? 我们可能需要将其添加到 U-Boot 代码中、以便使勘误表可以更可靠地工作。

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

    大家好!  

    我将添加可能需要注意的原理图审阅观察结果。

    总结

    RESETSTATz 以 VDDSHV0为基准并连接到3.3V

    eMMC IO 为1.8V

    IO 电平不匹配会导致电压馈入。

    由于电源解决方案是不会检测到离散残余电压。

    客户需要为 eMMC 复位输入添加电阻分压器(总值为1K)。 稍后使用缓冲器。

     

     

    DNI C502

    0.1 μ F

    不建议在 SOC 输出上连接大电容器

    慢速斜坡会影响 eMMC 复位行为

     

    DNI R515 10K 上拉

    时钟需要一个下拉电阻

    SoC 在复位期间驱动时钟、因此无需拉取

     

    DNI R514

     

    将 R512串联电阻值降至0r

    此致、

    Sreenivasa

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

    供您参考、

    diff --git a/arch/arm/mach-k3/am642_init.c b/arch/arm/mach-k3/am642_init.c
    index 80c3cb34..d363cfad 100644
    --- a/arch/arm/mach-k3/am642_init.c
    +++ b/arch/arm/mach-k3/am642_init.c
    @@ -93,6 +93,44 @@ void k3_mmc_restart_clock(void)
                    mmc_set_clock(mmc, mmc->saved_clock, false);
            }
     }
    +
    +void k3_mmc_reset(void)
    +{
    +       if (spl_boot_device() == BOOT_DEVICE_MMC1) {
    +               struct mmc *mmc;
    +               struct mmc_cmd cmd;
    +               struct udevice *dev;
    +               int err;
    +               int ret;
    +
    +               printf("k3_mmc_reset\n");
    +
    +               ret = mmc_init_device(0);
    +               if (!ret) {
    +                       mmc = find_mmc_device(0);
    +                       if (mmc) {
    +                               ret = mmc_init(mmc);
    +                               if (ret) {
    +                                       printf("mmc init failed with error: %d\n", ret);
    +                               }
    +                       }
    +               }
    +
    +               //printf("mmc reset\n");
    +               cmd.cmdidx = MMC_CMD_GO_IDLE_STATE;
    +               cmd.cmdarg = 0;
    +               cmd.resp_type = MMC_RSP_NONE;
    +
    +               err = mmc_send_cmd(mmc, &cmd, NULL);
    +
    +               if (err)
    +                       return;
    +
    +               udelay(200);
    +               k3_mmc_stop_clock();
    +
    +       }
    +}
     #else
     void k3_mmc_stop_clock(void) {}
     void k3_mmc_restart_clock(void) {}
    @@ -163,13 +201,14 @@ static void enable_mcu_esm_reset(void)
            writel(stat, CTRLMMR_MCU_RST_CTRL);
     }
     #endif
    -
    
    
     #if defined(CONFIG_CPU_V7R)
    @@ -231,15 +270,26 @@ void board_init_f(ulong dummy)
                    printf("\n%s:uclass device error [%d]\n",__func__,ret);
    
            rst_src = readl(CTRLMMR_MCU_RST_SRC);
    +       printf("rst_src: 0x%x\n", rst_src);
    +
            if (rst_src == COLD_BOOT || rst_src & (SW_POR_MCU | SW_POR_MAIN)) {
                    printf("Resetting on cold boot to workaround ErrataID:i2331\n");
                    printf("Please resend tiboot3.bin in case of UART/DFU boot\n");
    +               k3_mmc_reset(); //fix emmc chip cannot reset in boot mode
                    do_reset(NULL, 0, 0, NULL);
    +
            }
    +
     #endif
    

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

    尊敬的 Kallikuppa:

    谢谢。 我们将修复硬件问题。

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

    尊敬的 Wangbin:

    谢谢你。

    此致、

    Sreenivasa