目录
1.I2C在Linux的体系架构
在Linux内核路径下 kernel\drivers\i2c 可以看到I2C相关的源码其中:
(1)i2c-core.c 实现i2cd的核心功能
(2)i2c-dev.c 此文件可以当作是一个学习i2c设备(作slave)驱动的一个模板,他并不是针对特定的设备去设计的。
(3)busses文件夹包含了一些i2c主机控制器(作host的)的驱动。
2.其中重要的结构体
代码路径:kernel\include\linux\i2c.h
2.1 i2c_adapter
adapter对应物理上的一个适配器,列如一个SOC可能有多个i2c,列如i2c0,i2c1就有各自对应的adapter可以看到adapter里面有一个i2c_algorithm,此结构体其实会包含一套通信方法,没有这个adapter什么也做不了。
2.2 i2c_algorithm
其中在i2c_algorithm可以看到,通信接口其实有用到i2c_msg *msgs这个结构体,这个也是在通信过程中相当重要的一个结构体,定义在kernel\include\uapi\linux\i2c.h。
2.3 i2c_msg *msgs
从这个结构体是不是在联想到上节讲到的i2c传输协议是如何发送数据的,是不是就很容易联系起来了?
2.4 I2c_client
此结构体就是对一个I2c slave的抽象,其描述的就是对应的一个i2c设备,并且这些设备都需要使用到对应的adapter,才能工作。那么有i2c_client那肯定也得有i2c_driver了。
2.5 i2c_driver
i2c_driver与client可以是一对多的关系,就是说同一个dirver其实共给不同的设备去使用,这点其实同platform总线驱动。dirver中也包含了许多相关功能的实现方法。
3.一些关键的接口
收发接口:kernel\drivers\i2c\i2c-core.c
发: i2c_master_send(const struct i2c_client *client, const char *buf, int count);
收:i2c_master_recv(const struct i2c_client *client, char *buf, int count);
这些都是经过封装过的这两个函数都会调用到 i2c_transfer再调用到 __i2c_transfer 最后调用到 一下这个 结构体中的函数 也就是上面我提到的 i2c_algorithm 来传输数据。
master_xfer 模板 一般在主控的i2c驱动会有。
下期将分别主设备 与从设备的注册来分析i2c驱动。