• 周五. 5月 2nd, 2025

Kernel 使用gpio口模拟I2C


使用gpio口模拟i2c 在kernel内核是一个已经实现的驱动,具体实现流程如下:

1. 配置menuconfig

CONFIG_I2C_GPIO=y

2. 配置dts, 可以参考以下文档进行配置:

Documentation/devicetree/bindings/i2c/i2c-gpio.txt

下面基于rk平台举例子:




	i2c@2 {
		compatible = "i2c-gpio";
		gpios = <&gpio5 15 GPIO_ACTIVE_HIGH>, /* sda */
			<&gpio5 16 GPIO_ACTIVE_HIGH>; /* scl */
		i2c-gpio,delay-us = <2>;        /* ~100 kHz */
		#address-cells = <1>;
		#size-cells = <0>;
		pinctrl-names = "default";
		pinctrl-0 = <&i2c2_gpio>;
		status = "disabled";
	};

	i2c@4 {
		compatible = "i2c-gpio";
		gpios = <&gpio5 9 GPIO_ACTIVE_HIGH>, /* sda */
			<&gpio5 8 GPIO_ACTIVE_HIGH>; /* scl */
		i2c-gpio,delay-us = <2>;        /* ~100 kHz */
		#address-cells = <1>;
		#size-cells = <0>;
		pinctrl-names = "default";
		pinctrl-0 = <&i2c4_gpio>;
		status = "okay";

		gt9xx: gt9xx@14 {
			compatible = "goodix,gt9xx";
			reg = <0x14>;
			touch-gpio = <&gpio5 11 IRQ_TYPE_LEVEL_LOW>;
			reset-gpio = <&gpio5 10 GPIO_ACTIVE_HIGH>;
			max-x = <1200>;
			max-y = <1900>;
			tp-size = <911>;
			tp-supply = <&vcc_tp>;
			status = "okay";
		};
	};

Documentation/devicetree/bindings/i2c/i2c-gpio.txt 原文

Device-Tree bindings for i2c gpio driver

Required properties:
	- compatible = "i2c-gpio";
	- sda-gpios: gpio used for the sda signal, this should be flagged as
	  active high using open drain with (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)
	  from <dt-bindings/gpio/gpio.h> since the signal is by definition
	  open drain.
	- scl-gpios: gpio used for the scl signal, this should be flagged as
	  active high using open drain with (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)
	  from <dt-bindings/gpio/gpio.h> since the signal is by definition
	  open drain.

Optional properties:
	- i2c-gpio,scl-output-only: scl as output only
	- i2c-gpio,delay-us: delay between GPIO operations (may depend on each platform)
	- i2c-gpio,timeout-ms: timeout to get data

Deprecated properties, do not use in new device tree sources:
	- gpios: sda and scl gpio, alternative for {sda,scl}-gpios
	- i2c-gpio,sda-open-drain: this means that something outside of our
	  control has put the GPIO line used for SDA into open drain mode, and
	  that something is not the GPIO chip. It is essentially an
	  inconsistency flag.
	- i2c-gpio,scl-open-drain: this means that something outside of our
	  control has put the GPIO line used for SCL into open drain mode, and
	  that something is not the GPIO chip. It is essentially an
	  inconsistency flag.

Example nodes:

#include <dt-bindings/gpio/gpio.h>

i2c@0 {
	compatible = "i2c-gpio";
	sda-gpios = <&pioA 23 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
	scl-gpios = <&pioA 24 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
	i2c-gpio,delay-us = <2>;	/* ~100 kHz */
	#address-cells = <1>;
	#size-cells = <0>;

	rv3029c2@56 {
		compatible = "rv3029c2";
		reg = <0x56>;
	};
};

发表评论

您的电子邮箱地址不会被公开。