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:U-Boot MMC_HS_52模式 eMMC

Guru**** 2468610 points
Other Parts Discussed in Thread: TMDS64EVM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1463727/am6442-u-boot-mmc_hs_52-mode-emmc

器件型号:AM6442
主题中讨论的其他器件:TMDS64EVM

工具与软件:

我与一位客户合作、试图让他们的 eMMC 在 MMC_HS_52模式(高速52MHz)的 U-Boot 中使用 AM64x。 他们在这个问题上遇到了一些困难。 它们使用的是 Processor-SDK-Linux 9.00.00.03。 我们知道、在9.00.00.03与最新的10.01.10.04 SDK 版本之间、MMC 发生了许多可能很重要但很小的变更。 我们实际上已经分析了其中的一些差异、尤其是 k3-am64-main.dtsi 中的设备树差异。 虽然更新到较新的 SDK 版本可能是个好主意、并且客户有时可能会这样做、但需要采取的措施比目前希望的要多。 如果可能、我们需要在 SDK 版本9.00.00.03上提供近期解决方案。

首先、我们认为我们已经在 am654_sdhci.c 中发现一个关键错误、该错误仍存在于最新的10.01.10.04 SDK 中。 "static const struct timing_data td MMC[]"结构针对 MMC_HS 包含一个带有拼写错误的条目。 我们认为它应该是 ti,itap-del-sel-mms-hs、而不是 ti,itap-del-sel-mcu-hs。 此拼写错误不会影响我们、但它使我们怀疑表中的所有不同模式是否确实都是测试。

我们注意到的第二件事是、"MMC_HS_52模式从" td []"表中完全缺失。 可以通过将其与必要的器件树条目一起添加到表中来支持此模式吗?

在 AM654_sdhci.c 中:

MMC_HS_52 ={"NULL、ti、ITAP-DEL-SEL-MMC-hs52、MMC_CAP (MMC_HS_52)}

在设备树中:

TI、ITAP-DEL-SEL-MMC-Hs52 =<0xA>

我认为省略"OTAP"项会将 OTAPLYEN 设置为0。 请确认。

值取自下表:

另一个有点令人困惑的问题是 MMCSD0_HOST_CONTROL1寄存器中的 HIGH_SPEED_ENA 字段的正确值。 在该位清零后、信号时序与下面的图6-61匹配。 如果该位设置为高电平、则数据将在时钟的正边沿开始转换。

以下是 TRM 的摘录:

通过建议将其设置为 MMC_HS_52模式、从而将数据转换移到正时钟边沿、这似乎与数据表中的预期图6-61时序图相矛盾。 在 MMC_HS_52模式下、此位的正确设置是什么? U-boot 似乎遵循 TRM 解释。

如果使用 MMC_HS_52、我认为这符合表6-73 (如果您忽略该52并将其视为50;50 MHz 是示波器上看到的值)、则 u-boot 会设置 HIGH_SPEED_ENA 位。 这会导致上升沿启动并中断时序(至少在数据表建议的 OTAPLYENA = 0时)。

最后、客户似乎确实已使 MMC_DDR_52模式工作。 验证正在进行中。 他们最终可能只是使用 MMC_DDR_52模式。 但是、他们不需要增加带宽、并计划保持 MMC_HS_52模式以增加设计裕度。

谢谢!

Stuart

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

    您好、我会在内部核实这些 不一致之处并与您联系。

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

    您好!

    [报价 userid="111013" url="~/support/processors-group/processors/f/processors-forum/1463727/am6442-u-boot-mmc_hs_52-mode-emmc ]eMMC 在 MMC_HS_52模式下的 U-Boot 中与 AM64x 搭配使用(高速52MHz)。 他们在此问题上遇到了一些困难。

    您能解释一下究竟是什么 困难吗? 此模式下是否存在 U-Boot 故障? 如果是、您能否共享启动日志。

    谢谢、Prashant

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

    Prashant,

    我已经与客户讨论过这个问题。 客户将:

    1. 进行我在初始 E2E 博文中建议的 U-Boot 修改
    2. 捕获 U-Boot 日志
    3. 捕获示波器波形

    同时:

    1. 您能否确认我建议的 U-Boot 更改是否正确、以便添加对 MMC_HS_52的支持?
    2. 您能否确认 MMC_HS_52模式的 HIGH_SPEED_ENABLE 设置正确?

    谢谢!

    Stuart

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

    对两个查询都是。

    以下补丁应启用 MMC_HS_52模式、并相应地设置 HIGH_SPEED_ENABLE 位:

    diff --git a/arch/arm/dts/k3-am64-main.dtsi b/arch/arm/dts/k3-am64-main.dtsi
    index e17ea49e790..5879bb82bb2 100644
    --- a/arch/arm/dts/k3-am64-main.dtsi
    +++ b/arch/arm/dts/k3-am64-main.dtsi
    @@ -633,10 +633,12 @@
     		ti,trm-icp = <0x2>;
     		ti,otap-del-sel-legacy = <0x0>;
     		ti,otap-del-sel-mmc-hs = <0x0>;
    -		ti,otap-del-sel-ddr52 = <0x6>;
    -		ti,otap-del-sel-hs200 = <0x7>;
    +		ti,otap-del-sel-mmc-hs52 = <0x0>;
    +		// ti,otap-del-sel-ddr52 = <0x6>;
    +		// ti,otap-del-sel-hs200 = <0x7>;
     		ti,itap-del-sel-legacy = <0x10>;
     		ti,itap-del-sel-mmc-hs = <0xa>;
    +		ti,itap-del-sel-mmc-hs52 = <0xa>;
     		ti,itap-del-sel-ddr52 = <0x3>;
     		status = "disabled";
     	};
    diff --git a/drivers/mmc/am654_sdhci.c b/drivers/mmc/am654_sdhci.c
    index 8f109553974..66d5afa49f9 100644
    --- a/drivers/mmc/am654_sdhci.c
    +++ b/drivers/mmc/am654_sdhci.c
    @@ -127,6 +127,9 @@ static const struct timing_data td[] = {
     	[MMC_HS]	= {"ti,otap-del-sel-mmc-hs",
     			   "ti,itap-del-sel-mms-hs",
     			   MMC_CAP(MMC_HS)},
    +	[MMC_HS_52]	= {"ti,otap-del-sel-mmc-hs52",
    +			   "ti,itap-del-sel-mmc-hs52",
    +			   MMC_CAP(MMC_HS_52)},
     	[SD_HS]		= {"ti,otap-del-sel-sd-hs",
     			   "ti,itap-del-sel-sd-hs",
     			   MMC_CAP(SD_HS)},
    @@ -387,6 +390,7 @@ static void am654_sdhci_write_b(struct sdhci_host *host, u8 val, int reg)
     		 */
     		case SD_HS:
     		case MMC_HS:
    +		case MMC_HS_52:
     		case UHS_SDR12:
     		case UHS_SDR25:
     			val &= ~SDHCI_CTRL_HISPD;
    

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

    Prashant,

    客户已通过以下更改修补了其 U-Boot ...

    器件树:

    &sdhci0 {
         /* emmc */
         bus-width = <8>;
         non-removable;
         ti,driver-strength-ohm = <50>;
         disable-wp;
    ti,clkbuf-sel = <0x7>;
    ti,itap-del-sel-mmc-hs52 = <0xa>;
    ti,otap-del-sel-mmc-hs52 = <0x0>;
         /* deleting higher speed otaps-del-sel, so they are not selected */ 
         /delete-property/ ti,otap-del-sel-ddr52;
         /delete-property/ ti,otap-del-sel-hs200;
    };

    编辑为 am654_SDHC.c:

    向 sdhci.c 添加了 print 语句、用于解码错误返回结果并打印具有错误位的寄存器:

    最后、打开 kconfig 中的 MMC_TRACE。 这是日志、MMC 写入命令保留在日志的第363行中。 跟踪错误消息从第484行开始:

    e2e.ti.com/.../u_2D00_boot_2D00_log_5F00_emmc_5F00_write_5F00_error.txt

    尽管进行了所有这些更改、写入仍然会失败。 根据附加的示波器图像、看起来波形没有正确的设置/保持时间:

    日志中还显示了对 PHY_CTRL 寄存器的寄存器读取、从而查看在设置数据表的值时驱动程序是否有效表6-68:

    => md.l 0fa1810c 1
    0fa1810c: 0010000a                             ....
    => md.l 0fa18110 1
    0fa18110: 00030007                             ....
    =>

    ITAPDLYSEL 已正确设置为0xA。 但 ITAPLYENA 未设置为1、这仍可能是驱动器差异。 我曾尝试从 uboot 命令行中手动设置此位、但是这并没有对最终结果产生任何影响;MMC 写入仍然错误、范围看起来相同。

    该日志还包括整个 MMCSD0_SS_CFG 和 MMCSD0_CTL_CFG 空间的转储(如果有助于进行故障排除)。

    您对后续步骤有何建议?

    谢谢!

    Stuart

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

    尊敬的 Stuart:

    对于 eMMC HS SDR、我在 TMDS64EVM 上看到局部写入故障。 包括传统模式在内的所有其他模式在 EVM 上似乎都可以正常工作。 我会尝试使 HS SDR 模式正常工作并返回给您。

    此致、

    Prashant

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

    您好!

    以下补丁至少在 TI EVM 上解决 eMMC 写入失败问题。

    diff --git a/drivers/mmc/am654_sdhci.c b/drivers/mmc/am654_sdhci.c
    index 8f109553974..05a65d92a26 100644
    --- a/drivers/mmc/am654_sdhci.c
    +++ b/drivers/mmc/am654_sdhci.c
    @@ -272,10 +272,12 @@ static int am654_sdhci_set_ios_post(struct sdhci_host *host)
     	sdhci_set_clock(host->mmc, speed);
     
     	/* switch phy back on */
    -	otap_del_sel = plat->otap_del_sel[mode];
    -	mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
    -	val = (1 << OTAPDLYENA_SHIFT) |
    -	      (otap_del_sel << OTAPDLYSEL_SHIFT);
    +	if(mode != MMC_HS_52) {
    +		otap_del_sel = plat->otap_del_sel[mode];
    +		mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
    +		val = (1 << OTAPDLYENA_SHIFT) |
    +			(otap_del_sel << OTAPDLYSEL_SHIFT);
    +	}
     
     	/* Write to STRBSEL for HS400 speed mode */
     	if (host->mmc->selected_mode == MMC_HS_400) {
    

    该补丁确保未为 MMC_HS_52模式启用 OTAPLYENA (如数据表中所述)。

    => mmc dev 0
    switch to partitions #0, OK
    mmc0(part 0) is current device
    => mmc info
    Device: mmc@fa10000
    Manufacturer ID: 13
    OEM: 4e
    Name: S0J56X
    Bus Speed: 52000000
    Mode: MMC High Speed (52MHz)
    Rd Block Len: 512
    MMC version 5.1
    High Capacity: Yes
    Capacity: 14.8 GiB
    Bus Width: 8-bit
    Erase Group Size: 512 KiB
    HC WP Group Size: 8 MiB
    User Capacity: 14.8 GiB WRREL
    Boot Capacity: 31.5 MiB ENH
    RPMB Capacity: 4 MiB ENH
    Boot area 0 is not write protected
    Boot area 1 is not write protected
    => mmc write $loadaddr 0x0 0x1
    
    MMC write: dev # 0, block # 0, count 1 ... 1 blocks written: OK

    此致、

    Prashant

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

    Prashant,

    客户尝试了您的补丁、但它无法正常工作。 客户使用的是9.00.00.03 SDK。 您是否可能使用了不同的 SDK 版本且这种版本有着显著的区别?

    以下是客户提供的一些附加信息...

    我应用了补丁、并确认 PHY_CTRL_4_REG 中确实未设置 OTAPLYENA:

    使用相同的日志输出时、写入命令失败。 示波器显示、数据现在与数据更加接近(在错误的边缘)、正如您预期的无输出抽头情况。

    为了证明这确实是一个设置/保持时间违规问题、我做了另外一个实验。 我将 OTAPDLYSEL 设置为最大值0xF 并将 OTAPDLYENA 设置为1。

    这导致了可正常运行的 MMC 写入。 在本例中、范围如下所示:

     

    如您所见、现在设置时间为~16ns、保持时间为~3ns。 从技术上讲、该值满足 JEDEC 表208的3ns 要求;但该波形仍然不完全是数据表图6-61所承诺的波形。 数据表保证数据在时钟负边沿附近的-2.3ns/+2.9ns。

    谢谢!

    Stuart

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

    Prashant,

    您有什么建议可供我们尝试吗?

    谢谢!

    Stuart

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

    您好!

    客户正在使用9.00.00.03 SDK。 您是否可能使用了不同的 SDK 版本、这会带来重大影响?[/QUOT]

    我也尝试过此 SDK 版本、在应用 补丁后没有发现写入失败

    [19:01:30.110] U-Boot 2023.04-dirty (Feb 05 2025 - 19:01:01 +0530)
    
    [19:01:30.111] SoC:   AM64X SR2.0 HS-FS
    [19:01:30.111] Model: Texas Instruments AM642 EVM
    [19:01:30.126] Board: AM64-GPEVM rev C
    [19:01:30.126] DRAM:  2 GiB
    [19:01:30.542] Core:  59 devices, 29 uclasses, devicetree: separate
    [19:01:30.542] MMC:   mmc@fa10000: 0, mmc@fa00000: 1
    [19:01:30.558] Loading Environment from MMC... *** Warning - bad CRC, using default environment
    
    [19:01:30.622] In:    serial@2800000
    [19:01:30.622] Out:   serial@2800000
    [19:01:30.622] Err:   serial@2800000
    [19:01:30.686] Net:   eth0: ethernet@8000000port@1
    [19:01:30.702] Hit any key to stop autoboot:  0
    [19:01:30.798] => mmc dev 0
    [19:01:32.206] switch to partitions #0, OK
    [19:01:32.206] mmc0(part 0) is current device
    [19:01:32.222] => mmc info
    [19:01:33.214] Device: mmc@fa10000
    [19:01:33.214] Manufacturer ID: 13
    [19:01:33.214] OEM: 4e
    [19:01:33.214] Name: S0J56X
    [19:01:33.214] Bus Speed: 52000000
    [19:01:33.214] Mode: MMC High Speed (52MHz)
    [19:01:33.214] Rd Block Len: 512
    [19:01:33.215] MMC version 5.1
    [19:01:33.215] High Capacity: Yes
    [19:01:33.215] Capacity: 14.8 GiB
    [19:01:33.230] Bus Width: 8-bit
    [19:01:33.230] Erase Group Size: 512 KiB
    [19:01:33.230] HC WP Group Size: 8 MiB
    [19:01:33.230] User Capacity: 14.8 GiB WRREL
    [19:01:33.231] Boot Capacity: 31.5 MiB ENH
    [19:01:33.231] RPMB Capacity: 4 MiB ENH
    [19:01:33.246] Boot area 0 is not write protected
    [19:01:33.246] Boot area 1 is not write protected
    [19:01:33.246] => mmc write $loadaddr 0x0 0x1
    
    [19:01:38.798] MMC write: dev # 0, block # 0, count 1 ... 1 blocks written: OK

    我不是硬件专家、因此不能对这些设置或保持计时进行评论。

    他们是否在多个电路板上进行了尝试且在所有电路板上都看到了相同的问题?

    此致、

    Prashant