SFIO无法正确设置

我在orin nx进行开发,使用了jetpack5.1.2的devkit,最近在进行audio的调试工作,在进行pinmux配置时发现了 一些问题:

  1. 通过修改Linux_for_Tegra/bootloader/t186ref/BCT/tegra234-mb1-bct-pinmux-p3767-dp-a03.dtsi中的pinmux配置时我发现无法将SFIO bit设置上。我的pinmux配置如下(删除了默认的修改并在原来基础上进行修改):
			soc_gpio41_ph7 {  ///clk
				nvidia,pins = "soc_gpio41_ph7";
				nvidia,function = "i2s2";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
				// nvidia,lpdr = <TEGRA_PIN_DISABLE>;
			};

			soc_gpio42_pi0 {  //dout
				nvidia,pins = "soc_gpio42_pi0";
				nvidia,function = "i2s2";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
				// nvidia,lpdr = <TEGRA_PIN_DISABLE>;
			};

			soc_gpio43_pi1 { //din
				nvidia,pins = "soc_gpio43_pi1";
				nvidia,function = "i2s2";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_ENABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
				// nvidia,lpdr = <TEGRA_PIN_DISABLE>;
			};

			soc_gpio44_pi2 { //word
				nvidia,pins = "soc_gpio44_pi2";
				nvidia,function = "i2s2";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
				// nvidia,lpdr = <TEGRA_PIN_DISABLE>;
			};

以上是配置HDR40的i2s功能,参考了Linux_for_Tegra/sources/hardware/nvidia/platform/tegra/common/kernel-dts/overlays/jetson-adafruit-uda1334a.dts
2. 进行烧录后我发现读取到的四个gpio均未设置上SFIO bit,正确的应该是0x14xx,但实际的值如下

root@zme-0020-backup-minimal:/home/zme# busybox devmem 0x02434088
0x00001045
root@zme-0020-backup-minimal:/home/zme# busybox devmem 0x02434090
0x00000005
root@zme-0020-backup-minimal:/home/zme# busybox devmem 0x02434098
0x00001055
root@zme-0020-backup-minimal:/home/zme# busybox devmem 0x024340a0
0x00001045

读取pinmux配置后
cat /sys/kernel/debug/pinctrl/2430000.pinmux/pinconf-groups > pinmux
相关引脚配置

173 (soc_gpio41_ph7):
        pull=1
        tristate=0
        enable-input=1
        open-drain=1
        io-reset=1
        rcv-sel=1
        io-hv=1
        loopback=0
        schmitt=1
        pull-down-strength=31
        pull-up-strength=31
        drive-type=0
        func=i2s2
        pad-power=0
174 (soc_gpio42_pi0):
        pull=1
        tristate=0
        enable-input=0
        open-drain=1
        io-reset=1
        rcv-sel=1
        io-hv=1
        loopback=0
        schmitt=0
        pull-down-strength=31
        pull-up-strength=31
        drive-type=0
        func=i2s2
        pad-power=0
175 (soc_gpio43_pi1):
        pull=1
        tristate=1
        enable-input=1
        open-drain=1
        io-reset=1
        rcv-sel=1
        io-hv=1
        loopback=0
        schmitt=1
        pull-down-strength=31
        pull-up-strength=31
        drive-type=0
        func=i2s2
        pad-power=0
176 (soc_gpio44_pi2):
        pull=1
        tristate=0
        enable-input=1
        open-drain=1
        io-reset=1
        rcv-sel=1
        io-hv=1
        loopback=0
        schmitt=1
        pull-down-strength=31
        pull-up-strength=31
        drive-type=0
        func=i2s2
        pad-power=0

pinmux显示func是i2s2,但是寄存器读取到的却不一样,这很奇怪。

  1. 如果这个时候我通过busybox进行设置后,寄存器设置正常,我也可以播放音乐。或者我通过/opt/nvidia/jetson-io/jetson-io.py设置i2s2或者Adafruit UDA1334A,i2s2的寄存器也配置正常。
    通过jetson-io.py和pinmux配置有什么区别吗?为何有不同的结果?

Could you run the jetson-io to configure the pin to verify.

Thanks

我在上面说明了jetson-io是可以正确配置i2s功能的。

tegra234-mb1-bct-pinmux-p3767-dp-a03.dtsi中的配置会被覆盖,需要在主设备树中增加pinmux才可以完成配置。
例如在tegra234-p3768-0000-a0.dtsi中增加以下内容

	pinmux@2430000 {
		pinctrl-names = "default";
		pinctrl-0 = <&jetson_io_pinmux>;

		jetson_io_pinmux: exp-header-pinmux {
			soc_gpio41_ph7 {
				  //clk
				nvidia,pins = "soc_gpio41_ph7";
				nvidia,function = "i2s2";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};

			soc_gpio42_pi0 {
				  //dout
				nvidia,pins = "soc_gpio42_pi0";
				nvidia,function = "i2s2";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
			};

			soc_gpio43_pi1 {
				 //din
				nvidia,pins = "soc_gpio43_pi1";
				nvidia,function = "i2s2";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_ENABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};

			soc_gpio44_pi2 {
				 //word
				nvidia,pins = "soc_gpio44_pi2";
				nvidia,function = "i2s2";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};
		};
	};

至于为什么被覆盖,我并没有找到原因

Suppose the tegra234-mb1-bct-pinmux-p3767-dp-a03.dts is device tree for bootloader.
For the pin configuration should use jetson-io or main device tree for it.

好的,kernel的pin我将使用主设备树进行设置

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.