I2c-mux-gpio 的使用

i2c-mux-gpio 只能通过 修改设备树修改他的电平吗?不能在应用层对这个IO进行电平的高低修改吗?

你就算用sysfs也只能控制空的GPIO pin
如果這根pin已經被別的application佔用就沒辦法改了

恩呢,因为我现在用开发板的mipi接口,就想使用这个cam_mux_gpio 来控制值 iic拓展器的选择。

所以你有看懂我說的嗎?

我理解,你说的这种被复用的引脚,只能通过设备树的修改改变他的电平。或者修改设备屏蔽该gpio复用,让他成为一个普通的gpio,然后在用sysfs控制。

是的 沒錯

cam_i2cmux{
	compatible = "i2c-mux-gpio";
	#address-cells = <1>;
	#size-cells = <0>;
	i2c-parent = <&cam_i2c>;
	mux-gpios = <&tegra_aon_gpio CAM_I2C_MUX GPIO_ACTIVE_HIGH>;
	i2c@0 {
		reg = <0>;
		#address-cells = <1>;
		#size-cells = <0>;
		rbpcv2_imx219_a@10 {
			reset-gpios = <&tegra_main_gpio CAM0_PWDN GPIO_ACTIVE_HIGH>;
		};
	};
	i2c@1 {
		reg = <1>;
		#address-cells = <1>;
		#size-cells = <0>;
		rbpcv2_imx219_c@10 {
			reset-gpios = <&tegra_main_gpio CAM1_PWDN GPIO_ACTIVE_HIGH>;
		};
	};
};   那我想要这个 io为低电平 这个怎么修改呢?

改成GPIO_ACTIVE_LOW

好的,感谢

为什么我修改完后,并且替换的设备树文件。使用cat /sys/kernel/debug/gpio 命令查看,还是 hi 高电平呢?

你可以參考device tree裡面其他有gpio-hog關鍵字的檔案然後寫一個類似的給你要改的gpio

貌似我修改完也没有什么改变呢,这是我修改的代码:
/ {
{
compatible = “i2c-mux-gpio”;
#address-cells = <1>;
#size-cells = <0>;
i2c-parent = <&cam_i2c>;

	gpio-hog;
    output-low;
	mux-gpios = <&tegra_aon_gpio CAM_I2C_MUX GPIO_ACTIVE_LOW>;

	i2c@0 {
		reg = <0>;
		#address-cells = <1>;
		#size-cells = <0>;
		rbpcv2_imx219_a@10 {
			reset-gpios = <&tegra_main_gpio CAM0_PWDN GPIO_ACTIVE_HIGH>;
		};
	};
	i2c@1 {
		reg = <1>;
		#address-cells = <1>;
		#size-cells = <0>;
		rbpcv2_imx219_c@10 {
			reset-gpios = <&tegra_main_gpio CAM1_PWDN GPIO_ACTIVE_HIGH>;
		};
	};
};

gpio@2200000 {
	camera-control-output-low {
		gpio-hog;
		output-low;
		gpios = <CAM0_PWDN 0 CAM1_PWDN 0>;
		label = "cam0-pwdn","cam1-pwdn";
	};
};

};
那我想我问,我把设备树中的这个gpio描述屏蔽掉。作为一个普通IO。那么这个io是否可以控制IIC复用器呢?

  1. 不太確定你提供的device tree意義何在… 看起來完全不知道你要幹麻…

  2. 我把设备树中的这个gpio描述屏蔽掉。作为一个普通IO。那么这个io是否可以控制IIC复用器呢?

通常device tree要你提供gpio的原因是因為那個driver本身要控制那個gpio… 如果你可以完全手動作到那個kernel driver做的事情, 那麼就可以…

我想把这个 gpio 的电平改低,但是现在修改设备树中的mux-gpios = <&tegra_aon_gpio CAM_I2C_MUX GPIO_ACTIVE_LOW>;后 没有反应。查看cat /sys/kernel/debug/gpio。以上设备代码是按你说得加一个hog,我仿造其中一个带有hog的示例写的。我不确定我写的是否正确。

你所謂的 “我想把这个 gpio 的电平改低”. 這裡提到的 "這個gpio"是在說哪一根…

soc上的gpio6,这个IO不是控制了一个IIC复用器嘛。我要用整这个io来复用MIPI接口上的IIC。现在想要把这个io拉低,进行选择。

如果是AON gpio你得把gpio-hog寫在gpio@c2f0000 controller裡面…

以下檔案有很多例子

hardware/nvidia/platform/t19x/jakku/kernel-dts/common/tegra194-p3668-common.dtsi

我按照您的方法修改了 这个tegra194-p3668-common.dtsi,但是还没有效果啊,查看这个gpio后还是拉高。以下是我得修改的dts代码:
gpio@c2f0000 {
pex-refclk-sel-low {
gpio-hog;
output-low;
gpios = <TEGRA194_AON_GPIO(AA, 5) 0>;
label = “pex_refclk_sel_low”;
status = “disabled”;
};

	pex-refclk-sel-high {
		gpio-hog;
		output-high;
		gpios = <TEGRA194_AON_GPIO(AA, 5) 0>;
		label = "pex_refclk_sel_high";
		status = "disabled";
	};
	w-disable1 {
		gpio-hog;
		output-high;
		gpios = <TEGRA194_AON_GPIO(CC, 2) GPIO_ACTIVE_LOW>;
		label = "w-disable1";
		status = "okay";
	};
	w-disable2 {
		gpio-hog;
		output-high;
		gpios = <TEGRA194_AON_GPIO(CC, 0) GPIO_ACTIVE_LOW>;
		label = "w-disable2";
		status = "okay";
	};
	suspend_gpio: suspend-led-gpio {
		gpio-hog;
		output-high;
		gpio-suspend;
		suspend-output-low;
		gpios = <TEGRA194_AON_GPIO(CC, 1) GPIO_ACTIVE_HIGH>;
		label = "suspend-led-gpio";
		status = "okay";
	};
	cam_i2cmux{
		gpio-hog;
		output-low;
		gpios = <TEGRA194_AON_GPIO(CC, 3) GPIO_ACTIVE_LOW>;
		label = "CAM_I2C_MUX";
		status = "okay";
	};
};

不知道这样有没修改正确。
同时我替换设备树,是直接 在NX的/boot/dtb 路径下,直接替换的 kernel_tegra194-p3668-all-p3509-0000.dtb。

如果/sys/kernel/debug/gpio底下已經有另外一個不是你建出來的"i2c-mux-gpio" 在做output high, 代表說device tree裡面有其他東西做了這件事情 ,所以你改的東西沒有辦法生效…