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配置还有其他要求或已知限制需要考虑吗?我们也希望得到一些调试步骤方面的建议。
问候
维沙尔
嗨@Zhiming_Liu
对于 state_100mhz SD2_DATA
问候
维沙尔
你好@vishal088
您能否也分享一下 SD2_DATA
此致,
志明
如果将DATA 和 CMD 配置为0x1D4 ,然后将 CLK 设置为0x194 ,DDR50 还会再次出现故障吗?
请问您能否分享一下您正在使用的完整 USDHC DTS 节点?此外,软件团队想知道您是如何将 usdhc 修复为 DDR50 模式的。
此致,
志明
我在 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 = <®_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 会导致信号质量问题。
顺祝商祺!
志明