2409773_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2409773_ja-JP

2409773_ja-JP

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に設定し、次にSET CLKを0x194に設定した場合、DDR50は再び故障しますか?

使っているusdhc DTSノードの全てを教えてもらえますか?さらに、ソフトウェアチームは、usdhcをDDR50モードに修正した方法を知りたいと考えています。




よろしくお願いします、
志明

Re: IMX8MP SDIO DDR50 clock issue
こんにちは@Zhiming_Liu

先ほど入力ミスをしてしまい、申し訳ありませんでした。私のデバイスツリーでは、state_100mhz の SD2_DATAx と SD2_CMD は 0x194 ではなく 0x1d4 です。
 
&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>;
           ステータス = "okay";
};
 
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のサポートを維持します。

----コード
if ( IS_ERR_OR_NULL ( imx_data -> pins_100mhz ))
val &= ~ ( SDHCI_SUPPORT_SDR50 | SDHCI_SUPPORT_DDR50 );
if ( IS_ERR_OR_NULL ( imx_data -> pins_200mhz ))
val &= ~(SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_HS400);

そしてSDIOアタッチフェーズでは、カードと能力について交渉した後、タイミングをDDR50に設定しました。

同様に「cat /sys/kernel/debug/mmc1/ios」でverfiedされています。
クロック: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で修正方法を見つけました。適用後はpinctrl状態state_100mhz正しく使われるようになりましたが、SDIOデバイス通信が完全に切断されてしまいます。
後でクロック設定を調整した結果、前述のメッセージで言及したように、0x194壊す設定だと絞り込みました。

敬具
ヴィシャル


Re: IMX8MP SDIO DDR50 clock issue

こんにちは、 @vishal088さん

同じdtsとカーネル設定で、i.MX8MP EVKボード上でテストを実施しました。今のところ、テストを迅速に進めるために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信号品質の問題を引き起こします。


よろしくお願いいたします。

志明

Tags (1)
No ratings
Version history
Last update:
a week ago
Updated by: