简介
I2C驱动由I2C核心,I2C总线驱动和I2C设备驱动组成.I2C核心是I2C总线驱动和I2C设备驱动的中间枢纽,以通用的,与平台无关的接口实现了I2C中设备与适配器的沟通.I2C总线驱动填充i2c_adapter和i2c_algorithm结构体,I2C设备驱动填充i2c_driver结构体并实现本身所对应的设备类型驱动
I2C体系结构
1.I2C核心
提供I2C总线驱动和设备驱动的注册,注销方法,I2C通信上次与具体适配器无关的代码以及探测设备,检测设备地址的上层代码等
2.I2C总线驱动
是对I2C硬件体系结构中适配器端的实现,主要包含I2C适配器数据结构i2c_adapter,I2C适配器的Algorithm数据结构i2c_algorithm和控制I2C适配器产生通信信号的函数,可以控制I2C适配器以主控方式产生开始位,停止位,等等
3.I2C设备驱动
是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,主要数据结构i2c_driver和i2c_client
代码目录
1.i2c-core.c
实现I2C核心的功能以及proc/bus/i2c*接口
2.i2c-dev.c
实现I2C适配器设备文件的功能,每一个I2C适配器都被分配一个设备,i2c-dev.c只提供了通用接口
3.busses文件夹
包含I2C主机控制器的驱动
4.algos文件夹
实现I2C总线适配器的通信方法
重要数据结构:i2c_adapter,i2c_algorithm,i2c_driver和i2c_client
1.i2c_adapter与i2c_algorithm
i2c_adapter对应于物理上的一个适配器,而i2c_algorithm对应一套通信方法,一个I2C适配器需要i2c_algorithm提供的通信函数来控制适配器产生特定的访问周期,i2c_adapter包含i2c_algorithm
2.i2c_driver和i2c_client
i2c_driver对应于一套驱动方法,如probe,remove等,i2c_client对应于真实的物理设备,每个设备都需要一个i2c_client描述,i2c_driver与i2c_client是一对多,i2c_device_id的id_table是该驱动所支持的I2C设备的ID表
3.i2c_adapter与i2c_client
i2c_client依附于i2c_adapter,一个适配器可以连接多个i2c设备
Linux I2C核心
主要函数:
增加/删除i2c_adapter
int i2c_add_adapter(struct i2c_adapter *adap)
void i2c_del_adapter(struct i2c_adapter *adap)
增加/删除i2c_driver
int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
void i2c_del_driver(struct i2c_driver *driver)
I2C传输,发送和接收
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs,int num)
int i2c_master_send(struct i2c_client *client, const char *buf, int count)
int i2c_master_recv(struct i2c_client *client, char *buf, int count)
linux I2C适配器驱动
涉及函数:
xxx_i2c_probe(..)
xxx_i2c_remove(...)
数据结构of_device_id,platform_driver
linux i2c设备驱动
数据结构i2c_driver
函数:
__init xxx_init(void)
__exit xxx_exit(void)