**
Linux I2C architecture
1.I2C仅使用SCL、SDA 两根信号线实现通信
2.I2C驱动由I2C core、I2C bus driver、I2C device driver三部分组成
**
1. I2C core
为I2C bus driver and device driver提供register 、unregister、communication
2. I2C bus driver
对应硬件adapter的实现,adapter可由CPU控制,甚至可以直接集成在CPU内部
包含:struct i2c_adapter(对该adapter的描述)、struct i2c_algorithm(负责通信)、functions(产生通信信号)
通过I2C bus driver,我们可以控制I2C adapter,来达到主或者从的方式读写,产生启止,ACK等
3. I2C device driver
对应硬件设备端的实现,这些设备挂在I2C adapter上,通过I2C适配器与CPU交换数据
包含:struct i2c_driver、struct i2c_client、functions(具体设备具体实现)
可以通过sysfs文件系统中/sys/bus/i2c/* 来查看当前i2c adapter上已挂在的device
4. i2c_driver、i2c_client、i2c_adapter 和 i2c_algorithm 这 4 个数据结构的作用及关系
struct i2c_adapter {
对应物理上的一个adapter,其上可以被多个i2c_client依附(链表连起来)
struct i2c_algorithm {
对应一套通信方法
master_xfer();
}
}
缺少i2c_algorithm的i2c_adapter什么也做不了,因此i2c_adapter中包含其使用的i2c_algorithm的指针
master_xfer()用于产生I2C访问周期需要的信号,以i2c_msg为单位
struct i2c_msg {
__u16 addr;
__u16 flags;
__u16 len;
__u8 *buf;
};
i2c_client 对应一个真实的物理设备,每个I2C设备都需要一个i2c_client来描述,其依附于i2c_adapter
i2c_driver对应一套驱动方法,主要是当探测物理设备的存在与否,然后使设备与adapter关联起来,纯粹用于辅助作用