2409773_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2409773_zh-CN

2409773_zh-CN

IMX8MP SDIO DDR50 时钟问题

Hello

我们最近应用了内核 v7.2-rc4 中的以下 NXP 修复程序。

58c08eea91572df62d71731f1d1180a0dc8e3a6f
mmc:sdhci-esdhc-imx:修复 esdhc_change_pinstate() 以允许恢复默认状态

在此修复之前,esdhc_change_pinstate() 要求在应用任何特定于时序的引脚控制状态之前,设备树中必须存在所有名为 default、state_100mhz 和 state_200mhz 的引脚控制状态。因此,如果 USDHC 设备树节点中未定义任何引脚控制,即使 SDIO 设备切换到 DDR50 时序,驱动程序也不会应用 state_100mhz。
修复后,驱动程序仅验证并应用所选定时模式所需的引脚控制状态。因此,state_100mhz 现在已正确应用于 SDR50 和 DDR50 模式。

应用此修复程序后,我们发现 state_100mhz 下的 SD2 时钟焊盘配置存在问题。

SDIO 设备(DDR50 模式)与以下设备不兼容:

MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK 0x194

但是,SDIO 设备(在 DDR50 模式下)可与以下设备配合使用:

MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK 0x184
MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK 0x192
MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK 0x196

0x184 设置与 0x194 设置的区别仅在于转换速率。其他工作设置使用不同的驱动强度值。

我们认为这种现象可能与信号完整性有关。然而,结果并不简单:DDR50 使用 0x194 时会失败,但使用较慢的转换速率 (0x184) 和更强的驱动器设置 (0x196) 时都能正常工作。

此外,SDR50 可以与 0x194 正常工作。该问题仅在 DDR50 模式下出现。

请问i.MX8MP USDHC/SDIO配置还有其他要求或已知限制需要考虑吗?我们也希望得到一些调试步骤方面的建议。

问候
维沙尔

i.MX 8 系列 | i.MX 8QuadMax (8QM) | 8QuadPlusLinuxRe: IMX8MP SDIO DDR50 clock issue

@Zhiming_Liu

对于 state_100mhz SD2_DATA 为 0x194。

问候
维沙尔



Re: IMX8MP SDIO DDR50 clock issue

你好@vishal088

您能否也分享一下 SD2_DATA 设置?

此致,
志明

Re: IMX8MP SDIO DDR50 clock issue

你好@vishal088


如果将DATA 和 CMD 配置为0x1D4 ,然后将 CLK 设置为0x194 ,DDR50 还会再次出现故障吗?

请问您能否分享一下您正在使用的完整 USDHC DTS 节点?此外,软件团队想知道您是如何将 usdhc 修复为 DDR50 模式的。




此致,
志明

Re: IMX8MP SDIO DDR50 clock issue
@Zhiming_Liu

抱歉,我刚才打错了。在我的设备树中,状态为 state_100mhz 的 SD2_DATAx 和 SD2_CMD 为 0x1d4 而不是 0x194。
 
&usdhc2 {
pinctrl-names = "default", "state_100mhz";
pinctrl-0 = <&pinctrl_usdhc2>;
pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
           总线宽度 = <4>
不可拆卸;
cap-power-off-card;
vmmc-supply = <&reg_wifi_ena>
状态 = "好的"
};
 
pinctrl_usdhc2: usdhc2_grp {
           fsl,pins = <
MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK 0x190
                        MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD             0x1D0
                        MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0       0x1D0
                        MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1         0x1D0
                        MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2       0x1D0
                        MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3       0x1D0
>
};
 
pinctrl_usdhc2_100mhz: usdhc2_100mhz-grp {
           fsl,pins = <
                        MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK                0x194
                        MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD            0x1d4
                        MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0      0x1d4
                        MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1        0x1d4
                        MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2      0x1d4
                        MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3      0x1d4
>
};

由于我们没有定义 state_200mhz pinctrl,因此本函数中
esdhc_readl_le,驱动程序(sdhci-esdhc-imx.c) 移除了对主机 SDR104 和 HS400 的支持,并保留了对 DDR50 和 SDR50 的支持。

- - 代码
如果( IS_ERR_OR_NULL ( imx_data -> pins_100mhz ))
val &= ~ ( SDHCI_SUPPORT_SDR50 | SDHCI_SUPPORT_DDR50 );
如果( IS_ERR_OR_NULL ( imx_data -> pins_200mhz ))
val &= ~ ( SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_HS400 );

在 sdio 连接阶段,它在与显卡协商其功能后,将时序设置为 DDR50。

使用“cat /sys/kernel/debug/mmc1/ios”命令验证了这一点。
时钟频率:50000000 Hz
实际时钟频率:50000000 Hz
vdd:21(3.3 ~ 3.4 V)
总线模式:2(推挽式)
芯片选择:0(无所谓)
电源模式:2(开启)
总线宽度:2(4 位)
时序规格:7(SD UHS DDR50)
信号电压:1(1.80 V)
驱动类型:0(B型驱动)

注意:我们使用的是 6.12.49 内核,我们注意到“esdhc_change_pinstate”函数存在问题
,经过检查,我们发现 NXP 在 7.2-rc4 内核中提供了一个修复程序。应用该修复程序后,它开始正确使用 state_100mhz pinctrl 状态,但却完全破坏了 sdio 设备的通信。
后来,正如前面消息中提到的,我们反复调整时钟配置,最终发现时钟设置为 0x194 是导致问题的原因。

问候
维沙尔


Re: IMX8MP SDIO DDR50 clock issue

你好@vishal088

我在 i.MX8MP EVK 板上进行了测试,dts 和内核设置与之前相同。目前,为了加快测试速度,我使用的是 L6.18.20 内核,但我认为这个问题与内核版本关系不大。

使用补丁之前。

imx8mpevk login: root
root@imx8mpevk:~# cat /sys/kernel/debug/mmc1/ios
clock:          50000000 Hz
vdd:            21 (3.3 ~ 3.4 V)
bus mode:       2 (push-pull)
chip select:    0 (don't care)
power mode:     2 (on)
bus width:      2 (4 bits)
timing spec:    7 (sd uhs DDR50)
signal voltage: 1 (1.80 V)
driver type:    0 (driver type B)
root@imx8mpevk:~# dmesg | grep -i sd
[    2.445460] sdhci: Secure Digital Host Controller Interface driver
[    2.451674] sdhci: Copyright(c) Pierre Ossman
[    2.463953] sdhci-pltfm: SDHCI platform and OF driver helper
[    2.507075] mmc2: SDHCI controller on 30b60000.mmc [30b60000.mmc] using ADMA
[    3.635632] sdhci-esdhc-imx 30b40000.mmc: allocated mmc-pwrseq
[    3.636284] sdhci-esdhc-imx 30b50000.mmc: Got CD GPIO
[    3.669847] mmc0: SDHCI controller on 30b40000.mmc [30b40000.mmc] using ADMA
[    3.682520] mmc1: SDHCI controller on 30b50000.mmc [30b50000.mmc] using ADMA
[    3.818728] mmc1: new UHS-I speed DDR50 SDHC card at address 59b4
[    9.902634] imx-sdma 30e00000.dma-controller: firmware found.
[    9.902634] imx-sdma 30e10000.dma-controller: firmware found.
[    9.920146] imx-sdma 30bd0000.dma-controller: firmware found.
[    9.928124] imx-sdma 30bd0000.dma-controller: loaded firmware 4.6

root@imx8mpevk:~# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
mtdblock0     31:0    0   32M  0 disk
mmcblk2      179:0    0 29.2G  0 disk
|-mmcblk2p1  179:1    0  256M  0 part /run/media/boot-mmcblk2p1
`-mmcblk2p2  179:2    0 10.5G  0 part /
mmcblk2boot0 179:32   0    4M  1 disk
mmcblk2boot1 179:64   0    4M  1 disk
mmcblk1      179:96   0 29.8G  0 disk
|-mmcblk1p1  179:97   0  256M  0 part /run/media/boot-mmcblk1p1
`-mmcblk1p2  179:98   0   12G  0 part /run/media/root-mmcblk1p2
root@imx8mpevk:~# cp /run/media/boot-mmcblk1p1/Image ./
root@imx8mpevk:~# ls -la Image
-rwxr-x--- 1 root root 35678720 Mar 13 15:48 Image


使用补丁后,测试SD卡的读写功能。

root@imx8mpevk:~# cp /run/media/boot-mmcblk1p1/tee.bin ./
root@imx8mpevk:~# cp tee.bin tee_test.bin
root@imx8mpevk:~# cp tee_test.bin /run/media/boot-mmcblk1p1/
root@imx8mpevk:~# ls /run/media/boot-mmcblk1p1/
 Image                                          imx95-19x19-evk-dsi-serdes-jdi-wuxga-panel.dtb      imx95-19x19-evk-os08a20-dual.dtb                imx95-19x19-evk-ti-serdes-combo.dtb
'System Volume Information'                     imx95-19x19-evk-dsi-serdes-jdi-wuxga-panel.dtbo     imx95-19x19-evk-os08a20-isp-it6263-lvds0.dtb    imx95-19x19-evk-ti-serdes-combo.dtbo
 imx95-15x15-ab2.dtb                            imx95-19x19-evk-dsi-serdes.dtb                      imx95-19x19-evk-os08a20-isp-lvds-two-disp.dtb   imx95-19x19-evk-ti-serdes.dtb
 imx95-15x15-evk-adv7535-ap1302.dtb             imx95-19x19-evk-dsi-serdes.dtbo                     imx95-19x19-evk-os08a20.dtb                     imx95-19x19-evk-ti-serdes.dtbo
 imx95-15x15-evk.dtb                            imx95-19x19-evk-dual-os08a20-isp-it6263-lvds0.dtb   imx95-19x19-evk-os08a20.dtbo                    imx95-19x19-evk-tja1104-rgmii.dtb
 imx95-15x15-frdm-8mic-reve.dtb                 imx95-19x19-evk-it6263-lvds-dual.dtb                imx95-19x19-evk-ox03c10-all.dtb                 imx95-19x19-evk-tja1104-rmii.dtb
 imx95-15x15-frdm-ap1302.dtb                    imx95-19x19-evk-it6263-lvds-dual.dtbo               imx95-19x19-evk-ox03c10-combo.dtb               imx95-19x19-evk.dtb
 imx95-15x15-frdm-aud-hat.dtb                   imx95-19x19-evk-it6263-lvds-two-disp.dtb            imx95-19x19-evk-ox03c10-combo.dtbo              imx95-19x19-frdm-pro-aqr113c.dtb
 imx95-15x15-frdm-boe-wxga-lvds-panel.dtb       imx95-19x19-evk-it6263-lvds0.dtb                    imx95-19x19-evk-ox03c10-isp-it6263-lvds0.dtb    imx95-19x19-frdm-pro-aud-hat.dtb
 imx95-15x15-frdm-dual-os08a20-isp.dtb          imx95-19x19-evk-it6263-lvds0.dtbo                   imx95-19x19-evk-ox03c10.dtb                     imx95-19x19-frdm-pro-dual-os08a20-isp.dtb
 imx95-15x15-frdm-neutron.dtb                   imx95-19x19-evk-it6263-lvds1.dtb                    imx95-19x19-evk-ox03c10.dtbo                    imx95-19x19-frdm-pro-inmate.dtb
 imx95-15x15-frdm-os08a20-combo-isp.dtb         imx95-19x19-evk-it6263-lvds1.dtbo                   imx95-19x19-evk-ox05b1s-combo.dtb               imx95-19x19-frdm-pro-neutron.dtb
 imx95-15x15-frdm-os08a20-isp.dtb               imx95-19x19-evk-jdi-wuxga-lvds-panel.dtb            imx95-19x19-evk-ox05b1s-combo.dtbo              imx95-19x19-frdm-pro-os08a20-combo-isp.dtb
 imx95-15x15-frdm-root.dtb                      imx95-19x19-evk-jdi-wuxga-lvds-panel.dtbo           imx95-19x19-evk-ox05b1s-isp-it6263-lvds0.dtb    imx95-19x19-frdm-pro-os08a20-isp.dtb
 imx95-15x15-frdm-rpmsg.dtb                     imx95-19x19-evk-jtag.dtb                            imx95-19x19-evk-ox05b1s-isp-lvds-two-disp.dtb   imx95-19x19-frdm-pro-root.dtb
 imx95-15x15-frdm-waveshare-7inch-c-panel.dtb   imx95-19x19-evk-jtag.dtbo                           imx95-19x19-evk-ox05b1s.dtb                     imx95-19x19-frdm-pro-waveshare-7inch-c-panel.dtb
 imx95-15x15-frdm.dtb                           imx95-19x19-evk-lpspi-slave.dtb                     imx95-19x19-evk-ox05b1s.dtbo                    imx95-19x19-frdm-pro.dtb
 imx95-19x19-evk-adv7535-ap1302.dtb             imx95-19x19-evk-lt9611uxc-ap1302.dtb                imx95-19x19-evk-pcie1-ep.dtb                    imx95-jailhouse-inmate.dtb
 imx95-19x19-evk-adv7535.dtb                    imx95-19x19-evk-lt9611uxc.dtb                       imx95-19x19-evk-pcie1-ep.dtbo                   mcore-demos
 imx95-19x19-evk-adv7535.dtbo                   imx95-19x19-evk-lt9611uxc.dtbo                      imx95-19x19-evk-rm692c9.dtb                     tee.bin
 imx95-19x19-evk-ap1302.dtb                     imx95-19x19-evk-netc-rpmsg.dtb                      imx95-19x19-evk-rm692c9.dtbo                    tee_test.bin
 imx95-19x19-evk-ap1302.dtbo                    imx95-19x19-evk-neutron.dtb                         imx95-19x19-evk-root.dtb                        xen
 imx95-19x19-evk-cs42888.dtb                    imx95-19x19-evk-os08a20-combo.dtb                   imx95-19x19-evk-rpmsg.dtb
 imx95-19x19-evk-cs42888.dtbo                   imx95-19x19-evk-os08a20-combo.dtbo                  imx95-19x19-evk-sof.dtb

DTS 修改中, pinctrl_usdhc2_100mhz 是 linux-imx 的默认值。测试表明,这些修改并未影响 DDR50 下的 SD 卡读写操作。

&usdhc2 {
	assigned-clocks = <&clk IMX8MP_CLK_USDHC2>;
	assigned-clock-rates = <400000000>;
	pinctrl-names = "default", "state_100mhz";
	pinctrl-0 = <&pinctrl_usdhc2>, <&pinctrl_usdhc2_gpio>;
	pinctrl-1 = <&pinctrl_usdhc2_100mhz>, <&pinctrl_usdhc2_gpio>;
	// pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
	cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
	vmmc-supply = <&reg_usdhc2_vmmc>;
	bus-width = <4>;
	status = "okay";
};

	pinctrl_usdhc2_100mhz: usdhc2-100mhzgrp {
		fsl,pins = <
			MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK	0x194
			MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD	0x1d4
			MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0	0x1d4
			MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1	0x1d4
			MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2	0x1d4
			MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d4
			MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc0
		>;
	};

所以我认为你现在遇到的问题可能与定制主板有关。碰巧的是,0x194 会导致信号质量问题。


顺祝商祺!

志明

标记 (1)
无评分
版本历史
最后更新:
2 周之前
更新人: