内核默认支持模拟i2c,那应该怎么用呢,参考https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/i2c/i2c-gpio.txt?h=v4.14-rc6 是不是跟平常用的硬件i2c dts配置很类似呢
i2c@0 {
compatible = "i2c-gpio";
gpios = <&pioA 23 0 /* sda */
&pioA 24 0 /* scl */
>;
i2c-gpio,sda-open-drain;
i2c-gpio,scl-open-drain;
i2c-gpio,delay-us = <2>; /* ~100 kHz */
#address-cells = <1>;
#size-cells = <0>;
rv3029c2@56 {
compatible = "rv3029c2";
reg = <0x56>;
};
};
同时加上CONFIG_I2C_GPIO CONFIG_I2C_ALGOBIT
drivers/i2c/busses/i2c-gpio.c 注册i2c总线
drivers/i2c/algos/i2c-algo-bit.c 实现模拟i2c协议
const struct i2c_algorithm i2c_bit_algo = {
.master_xfer = bit_xfer,
.functionality = bit_func,
};
static int __i2c_bit_add_bus(struct i2c_adapter *adap,int (*add_adapter)(struct i2c_adapter *))
{
adap->algo = &i2c_bit_algo;
ret = add_adapter(adap);
}
int i2c_bit_add_numbered_bus(struct i2c_adapter *adap)
{
return __i2c_bit_add_bus(adap, i2c_add_numbered_adapter);
}
EXPORT_SYMBOL(i2c_bit_add_numbered_bus);
是不是瞬间就搞定了呢,i2c驱动用硬件的i2c驱动就行了。