linux中i2c子系统包含i2c核心层,i2c主机驱动层,i2c设备驱动层
i2c核心主要是提供了主机驱动的注册/注销方法,i2c通信方法(alogrithm),以及上层的与具体适配器硬件无关的代码以及探测设备,检测设备地址的上层代码,代码文件目录:kernel/drivers/i2c/i2c-core.c
i2c主机驱动层是i2c的主设备程序,是i2c适配器的实现代码,适配器是受CPU直接控制的,一般直接集成在CPU内部,因此这部分代码是cpu芯片厂家去实现的。如果板子上的硬件i2c资源不够用的时候,用gpio口去模拟i2c的适配器代码的话,这一部分代码就需要用到两个的gpio口资源去实现i2c的通信波形,俗称软件i2c,一般用在单片机这种硬件资源少的控制器中,传输速率相比硬件i2c较慢。
i2c设备驱动层是指i2c的从设备,是指挂接在i2c适配器上的从设备,通过i2c协议和CPU实现数据交换,这部分驱动是从设备芯片厂家去实现的。
总结下来,在i2c子系统中,有六个非常重要的结构体,是我们在写主机设备和从设备驱动的过程中需要重点关注的,下面对这六个结构体的意义和重要成员做如下注释
/kernel/include/linux/i2c.h
struct i2c_adapter{
struct module *owner;
unsigned int class;
*const struct i2c_alogrithm algo;
void *algo_data;
struct rt_mutex bus_lock;
int timeout;
int retries;
struct device de