Linux 系统下的I2C子系统
子系统架构
1. I2C核心
I2C 总线和 I2C 设备驱动的中间枢纽,它提供了I2C 总线驱动和设备驱动的注册、注销方法等。
2. i2c-dev
通用驱动
2.I2C控制器(适配器)驱动
对I2C 控制器驱动的实现,属于总线驱动程序,通常由适配器驱动(i2c_adapter)和adapter.algo成员(算法驱动程序;控制器(适配器)可在CPU外部,也可以集成在 CPU 内部
3. I2C设备驱动
对 I2C从设备的驱动实现,如AT24C02的驱动
i2c-dev 允许在用户态模式下实现I2C客户驱动程序。
图解:
通路1:用户程序直接通过/sys;/dev设备文件通过I2C设备驱动直接访问i2c设备.
通路2:直接使用用户态驱动通过i2c-dev(通用驱动程序),经过I2C核心控制适配器(struct i2c_adapter)驱动和算法(struct i2c_algorithm )驱动再控制I2C设备
通路2追踪分析:利用i2c-dev通用驱动开发用户态驱动
用户态驱动经过 i2c-dev,在这里面做了些什么?
-------------------------------------------i2c-dev------------------------------------------------------------------------
在模块初始化时除了注册通用字符设备外,使用以下语句:
/* Keep track of adapters which will be added or removed later */
res = bus_register_notifier(&i2c_bus_type, &i2cdev_notifier);
/* Bind to already existing adapters right away */
i2c_for_each_dev(NULL, i2cdev_attach_adapter);
主要看的是第二条,绑定已经存在的控制器(适配器),在这里面偷偷的干了啥
相关结构:
struct i2c_adapter *adap; /*