Page 1 of 1

请教 软件I2C如何配置?

Posted: 2025-09-05 3:13
by wjh
lyra plus开发板

kernel配置开了软件I2C:
<*> GPIO-based bitbanging I2C
[ ] GPIO-based fault injector

一开始设置了有6个类似这样的软件I2C,在rk3506g-luckfox-lyra-plus.dts里,rk3502.dtsi内aliases加了对应的I2C,可以在/dev下挂载I2C设备。

Code: Select all

aliases {
		gpio0 = &gpio0;
		gpio1 = &gpio1;
		gpio2 = &gpio2;
		gpio3 = &gpio3;
		gpio4 = &gpio4;
		i2c0 = &i2c0;
		i2c1 = &i2c1;
		i2c2 = &i2c2;
		i2c3 = &i2c3;
		i2c4 = &i2c4;
		i2c5 = &i2c5;
		i2c6 = &i2c6;
		i2c7 = &i2c7;
		i2c8 = &i2c8;
		serial0 = &uart0;
		serial1 = &uart1;
		serial2 = &uart2;
		serial3 = &uart3;
		serial4 = &uart4;
		serial5 = &uart5;
		spi0 = &spi0;
		spi1 = &spi1;
		spi2 = &fspi;
		spi3 = &flexbus_fspi;
		spi4 = &flexbus_spi;
	};

Code: Select all

i2c3: i2c-gpio-3 {
		compatible = "i2c-gpio";
		gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>, /* PT1_SDA = GPIO4_A1_z  */
				<&gpio4 0 GPIO_ACTIVE_HIGH>; /* PT1_SCL = GPIO4_A0_z  */

		i2c-gpio,delay-us = <2>;
		#address-cells = <1>;
		#size-cells = <0>;
		status = "okay";
	};
但是实测发现有部分I2C引脚电平没有上拉,有些又是正常的,硬件上均有4.7k上拉电阻。
想设置软件上拉,就在rk3506-luckfox-lyra.dtsi文件里就加了pinctrl。

Code: Select all

i2c3: i2c-gpio-3 {
		compatible = "i2c-gpio";
		gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>, /* PT1_SDA = GPIO4_A1_z  */
				<&gpio4 0 GPIO_ACTIVE_HIGH>; /* PT1_SCL = GPIO4_A0_z  */

		i2c-gpio,delay-us = <2>;
		#address-cells = <1>;
		#size-cells = <0>;
        pinctrl-names = "default";
	    pinctrl-0 = <&gpio_i2c3_scl &gpio_i2c3_sda>;
		status = "okay";
	};

Code: Select all

&pinctrl {
	gpio_i2c3 {
		gpio_i2c3_sda: gpio-i2c3-sda {
			rockchip,pins =
				<4 RK_PA1 35 &pcfg_pull_up>;
		};
	};

	gpio_i2c3 {
		gpio_i2c3_scl: gpio-i2c3-scl {
			rockchip,pins =
				<4 RK_PA0 34 &pcfg_pull_up>;
		};
	};
};
然后再刷镜像这个I2C3就没有挂载了 :|

请问有没有完整的软件I2C配置示例可以参考一下,请教上述步骤有哪里搞错了

Re: 请教 软件I2C如何配置?

Posted: 2025-09-05 6:21
by Crocodile
您好,我们没有在Luckfox Lyra 上实测过该功能 ,比较明显的问题是pinctrl设置里面的

Code: Select all

&pinctrl {
	gpio_i2c3 {
		gpio_i2c3_sda: gpio-i2c3-sda {
			rockchip,pins =
				<4 RK_PA1 35 &pcfg_pull_up>;
		};
	};

	gpio_i2c3 {
		gpio_i2c3_scl: gpio-i2c3-scl {
			rockchip,pins =
				<4 RK_PA0 34 &pcfg_pull_up>;
		};
	};
};
将复用功能设置为 34 35 也就是i2c2-scl 和 i2c2-sda, 会在内部把引脚连接到 i2c2 控制器,有可能这就是导致 I2C3 没有挂载成功的原因,进一步确定建议您结合源码和内核的打印日志分析

Re: 请教 软件I2C如何配置?

Posted: 2025-09-05 6:52
by wjh
Crocodile wrote: 2025-09-05 6:21 您好,我们没有在Luckfox Lyra 上实测过该功能 ,比较明显的问题是pinctrl设置里面的

Code: Select all

&pinctrl {
	gpio_i2c3 {
		gpio_i2c3_sda: gpio-i2c3-sda {
			rockchip,pins =
				<4 RK_PA1 35 &pcfg_pull_up>;
		};
	};

	gpio_i2c3 {
		gpio_i2c3_scl: gpio-i2c3-scl {
			rockchip,pins =
				<4 RK_PA0 34 &pcfg_pull_up>;
		};
	};
};
将复用功能设置为 34 35 也就是i2c2-scl 和 i2c2-sda, 会在内部把引脚连接到 i2c2 控制器,有可能这就是导致 I2C3 没有挂载成功的原因,进一步确定建议您结合源码和内核的打印日志分析
这里我改了

Code: Select all

&pinctrl {
	i2c_pcfg_pull_up: i2c-pcfg-pull-up {
        bias-pull-up;
        drive-open-drain;
    };

	rm_io0 {
		rm_io0_i2c2_sda: rm-io0-i2c2-sda {
			rockchip,pins =
				<0 RK_PA0 35 &pcfg_pull_up>;
		};
	};

	rm_io1 {
		rm_io1_i2c2_scl: rm-io1-i2c2-scl {
			rockchip,pins =
				<0 RK_PA1 34 &pcfg_pull_up>;
		};
	};

	i2c3_gpio: i2c3-gpio {
		rockchip,pins =
			<4 RK_PA1 RK_FUNC_GPIO &i2c_pcfg_pull_up>,
			<4 RK_PA0 RK_FUNC_GPIO &i2c_pcfg_pull_up>;
	};
};

Code: Select all

i2c3: i2c-gpio-3 {
		compatible = "i2c-gpio";
		gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>, /* PT1_SDA = GPIO4_A1_z  */
				<&gpio4 0 GPIO_ACTIVE_HIGH>; /* PT1_SCL = GPIO4_A0_z  */

		i2c-gpio,delay-us = <2>;
		#address-cells = <1>;
		#size-cells = <0>;
        pinctrl-names = "default";
        pinctrl-0 = <&i2c3_gpio>;
		status = "okay";
	};
然后看启动日志,显示找不到i2c3-gpio这个组。
root@luckfox:~# dmesg |grep i2c
[ 1.428940] rockchip-pinctrl pinctrl: unable to find group for node i2c3-gpio
[ 1.429116] gpio-99 (i2c-gpio-4): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.429207] gpio-102 (i2c-gpio-4): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.429383] i2c-gpio i2c-gpio-4: using lines 99 (SDA) and 102 (SCL)
[ 1.429557] gpio-100 (i2c-gpio-5): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.429648] gpio-101 (i2c-gpio-5): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.429797] i2c-gpio i2c-gpio-5: using lines 100 (SDA) and 101 (SCL)
[ 1.429960] gpio-131 (i2c-gpio-6): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.430038] gpio-130 (i2c-gpio-6): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.430196] i2c-gpio i2c-gpio-6: using lines 131 (SDA) and 130 (SCL)
[ 1.430343] gpio-33 (i2c-gpio-7): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.430422] gpio-32 (i2c-gpio-7): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.430560] i2c-gpio i2c-gpio-7: using lines 33 (SDA) and 32 (SCL)
[ 1.430700] gpio-96 (i2c-gpio-8): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.430777] gpio-98 (i2c-gpio-8): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[ 1.430936] i2c-gpio i2c-gpio-8: using lines 96 (SDA) and 98 (SCL)
[ 1.570350] i2c_dev: i2c /dev entries driver

Re: 请教 软件I2C如何配置?

Posted: 2025-09-08 2:26
by Crocodile
您的pinctrl应该添加group去消除 unable to find group for node i2c3-gpio 报错,

Code: Select all

&pinctrl {
    i2c3 {
        i2c3_gpio: i2c3-gpio {
            rockchip,pins =
                <4 RK_PA1 0 &i2c_pcfg_pull_up>, /* SCL */
                <4 RK_PA0 0 &i2c_pcfg_pull_up>; /* SDA */
        };
    };
};

Re: 请教 软件I2C如何配置?

Posted: 2025-09-08 9:58
by wjh
Crocodile wrote: 2025-09-08 2:26 您的pinctrl应该添加group去消除 unable to find group for node i2c3-gpio 报错,

Code: Select all

&pinctrl {
    i2c3 {
        i2c3_gpio: i2c3-gpio {
            rockchip,pins =
                <4 RK_PA1 0 &i2c_pcfg_pull_up>, /* SCL */
                <4 RK_PA0 0 &i2c_pcfg_pull_up>; /* SDA */
        };
    };
};
好的,谢谢哥 :lol: