中级会员
- 积分
- 325
- 金钱
- 325
- 注册时间
- 2022-4-12
- 在线时间
- 41 小时
|
楼主 |
发表于 2022-5-18 15:38:24
|
显示全部楼层
经过百度各路网友的相关分享和内核源码中的驱动的比较,已经成功实现GPIO模拟I2C了
我自己来回答下吧~
Linux已经发展了这么久,这种GPIO模拟I2C的应用场景肯定已经被包含进内核了~
主要的步骤流程如下:
1、配置内核,需要使能GPIO和I2C的一些相关配置
Device Drivers---->
-*-GPIO Support---->
确认GPIO Support使能
Device Drivers---->
I2C support---->
I2C Hardware Bus support---->
<*>GPIO-based bitbanging I2C
确认GPIO-based bitbanging I2C使能
2、配置设备树
在跟节点增加自定义的i2c节点及其设备子节点,该节点中需要根据实际修改的是gpios属性,和pinctrl-0属性,注意i2c的compatible属性值要是“i2c-gpio”,i2c-gpio是内核自带的驱动,在内核的drivers/i2c/busses目录下,imx的i2c驱动也在这个目录下,设备节点没什么特别跟教程里的i2c实验一样
i2c99@0 {
compatible = "i2c-gpio";
gpios = <&gpio1 29 GPIO_ACTIVE_HIGH /* sda */
&gpio1 28 GPIO_ACTIVE_HIGH /* scl */
>;
i2c-gpio,sda-open-drain;
i2c-gpio,scl-open-drain;
i2c-gpio,delay-us = <2>; /* ~100 kHz */
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
ap3216c@1e {
compatible = "fa,iWaterX-fa_i2c";
reg = <0x1e>;
};
};
因为我是把开发板上真的i2c1改为gpio模拟i2c,所以我要把设备树中的i2c1节点去掉,同时还要修改iomuxc中的pinctrl_i2c1,大家根据自己的事情情况修改引脚配置
/*
&i2c1 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
status = "okay";
ap3216c@1e {
compatible = "fa,iWaterX-fa_i2c";
reg = <0x1e>;
};
};
*/
/*
pinctrl_i2c1: i2c1grp {
fsl,pins = <
MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0
MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x4001b8b0
>;
};
*/
pinctrl_i2c1: i2c1grp {
fsl,pins = <
MX6UL_PAD_UART4_TX_DATA__GPIO1_IO28 0x4001b8b0
MX6UL_PAD_UART4_RX_DATA__GPIO1_IO29 0x4001b8b0
>;
};
3、编写设备驱动,这个没什么好说的,直接用教程里的AP3216C的驱动就可以了,注意设备节点的compatible属性和驱动匹配,不要直接复制黏贴哦 |
|