Linux GpioI2C
记录一次linux kernel gpio i2c的使用
背景
linux kernel支持i2cmaster 和 i2cdev, 一般是使能i2cdev进行使用。
有些情况下,系统IO不足,或者硬件设计时没有预留到支持i2c的IO上,此时不能直接使用CPU i2c的硬件控制器了。
出现这种情况,一般需要通过IO来模拟I2C信号来进行使用。当然,可以自己从头开始进行模拟,用户自己进行维护,这里不在说明。linux内核也支持通过IO来模拟i2c,实现一个i2cmaster和i2cdev,这里记录下配置过程
配置
-
.config配置
kernle 中 make menuconfig,需要开启i2c gpio 支持
-
dts配置
配置需要的即可。注意的是,需要在根节点下面添加,各个字段要正确
详细字段可以参考内核Documentation/devicetree/bindings/i2c/下面的文档和linux/drive/i2c/ 下相应驱动文件的探测部分,不同内核版本会有不同
这里的kernel版本是 5.10.161
Documentation\devicetree\bindings\i2c\i2c-gpio.yaml :
drivers\i2c\busses\i2c-gpio.c :
结果
如果上述操作都顺利的话,将会在/dev/下出现新的i2c设备
old:
new:
可以看到出现了新的i2c设备,之后可以在应用层通过ioctl对该设备进行操作
关于这里为什么是i2c-0的问题,这里不再深究,和i2c总线探测注册相关,虽然dts上写的是i2c2,但其余的i2c都是关闭的,没有继续使用,总线注册时会认为这是第一个,这点详细的问题后续再进行探讨。