i2c驱动
一、i2c总线及linux对i2c总线的描述
一个i2c总线如下图所示,一般一个主控制器会挂载若干个i2c设备。
i2c总线分为两部分,一部分是soc中的i2c控制器,另一部分是i2c设备。linux中用了四个结构体来描述这两个部分,分别是:
struct i2c_adapter 代表soc的i2c控制器
二、从设备树到i2c设备
下面以hi3559为例说明
/kernel/arch/arm64/boot/dts/hisilicon/hi3559av100.dtsi文件对i2c控制器的描述如下图所示:
/kernel/arch/arm64/boot/dts/hisilicon/hi3559av100-demb.dts文件对i2c设备设置了status状态,如下所示:
其中i2c_bus0~ic2_bus11的status=“okay”,i2c_bus12~i2c_bus16的status=“disabled”。内核会将设备树中i2c控制器status=“okay”的节点会生成paltform_device,生成在目录/sys/devices/platform/soc/soc:amba下,如下所示:
从上图可以看出,生成的i2c设备就是status=“okay”的12个i2c节点。
如果在i2c_bus0下挂载了一个i2c设备,也可以在设备树中添加,如下图所示,在i2c_bus0下加了一个yy_i2c_dev设备。
这个yy_i2c_dev设备会被内核解析到/sys/devices/platform/soc/soc:amba/12110000.i2c/i2c-0中,如下图所示,0-002e就是添加在i2c_bus0下面的设备
可以看一下0-002e的name验证一下:
添加的yy_i2c_dev设备会被内核解析成i2c_client,有了i2c_client,只要自己写一个i2c_driver跟它匹配即可,代码见E:\test_program\test_linux_driver\test_i2c_driver\test_i2c_driver_devicetree
三、hi3559 i2c_adapter的注册过程
从上面的设备树可以看出,i2c控制器的compatible值都是 "hisilicon,hibvt-i2c",在/kernel/drivers/i2c/buses/i2c_hibvt.c中的定义的platform_driver的of_match_table中也有"hisilicon,hibvt-i2c",这就说明i2c_hibvt.c文件就是用来注册i2c_adapter。
我们知道,只要设备和驱动的compatible匹配,platform_driver的probe函数就会执行,下面就看一下hibvt_i2c_probe函数
hibvt_i2c_probe
->platform_get_resource
->hibvt_i2c_hw_init
->i2c_add_adapter