32 IIC(十)I2C GPIO
1. 设备树
gpio模拟iic
i2c_gpio: i2c-gpio {
/* gpio模拟iiccompatiable必须为i2c-gpio */
compatible = "i2c-gpio";
/* 指定子节点的reg addr为1个32为表示, 没有size */
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default";
/* 设置引脚配置 */
pinctrl-0 = <&pinctrl_i2c_gpio>;
/* 指定使用引脚 */
gpios = <
&gpio5 1 GPIO_ACTIVE_HIGH /* SDA */
&gpio5 0 GPIO_ACTIVE_HIGH /* SCL */
>;
/* 配置频率, 也可以使用i2c-gpio,delay-us来表示 */
clock-frequency = <400000>;
status = "okay";
/* i2c client */
ds1339: rtc@68 {
compatible = "dallas,ds1339";
reg = <0x68>;
status = "disabled";
};
};
2. i2c-gpio的使用
i2c-gpio模块已经做的很完善了,一般而言只需要根据实际情况修改dts文件即可
-
配置
compatible = "i2c-gpio";
-
pinctrl
把SDA
和SCL
配置为GPIO、开极(与下面的i2c-gpio,sda-open-drain
和i2c-gpio,scl-open-drain
互斥) -
指定
SDA
、SCL
引脚 -
指定frequency
i2c-gpio,delay-us = <5>;
clock-frquecy = <400000>;
-
指定addr和size解析
#address-cells = <1>;
#size-cell = <0>;
-
i2c-gpio,sda-open-drain; i2c-gpio,scl-open-drain;
表示SDA引脚已经被设置为为开极、开漏不需要驱动程序再次设置
表示SCL引脚已经被设置为为开极、开漏不需要驱动程序再次设置
两者如果存在则表示gpio已经被设置为开极、开漏(例如pinctl已经实现)。如果不存在则驱动程序会去将引脚再次设置为开极、开漏。所以此时则不需要设
pinctl
3. imx6ull使用gpio模拟i2c
3.1 实物图
3.2 原理图
3.3 设备树
此模块驱动为i2c-gpio模块,源码位于kernel中
-
make menuconfig将i2c-gpio编译成模块(M),或者编进内核(Y)
-
make modules编译所以modules
目标文件
Linux-4.9.88/drivers/i2c/busses/i2c-gpio.ko
-
修改dts文件,并上传到
arch/arm/boot/dts/
-
make dtbs
-
dtb文件拷贝到
/boot
目录重启