82.Linux--IIC总线驱动框架(上)
我们的嵌入式中,外设经常通过IIC总线进行设备连接
gsenor: 重力传感器,eeprom: 存储设备等,但是在linux中基于平台总线抽象出了IIC总线模型,逻辑实现上变的复杂,但是我们在使用上就变的简单了,我们需要理解linux中的IIC总线框架。
一.IIC 总线驱动框架
I2C驱动有4个重要的东西,I2C总线、I2C驱动、I2C设备、I2C设备器
- I2C总线:维护着两个链表(I2C驱动、I2C设备),管理I2C设备和I2C驱动的匹配和删除等
- I2C驱动:对应的就是I2C设备的驱动程序
- I2C设备:是具体硬件设备的一个抽象
- I2C设配器:用于I2C驱动和I2C设备间的通用,是SOC上I2C控制器的一个抽象
i2c总线维护着两个链表,一个驱动链表,一个设备链表,每当注册进一个驱动(或设备),就会将其添加到总线上相应的链表上,然后遍历总线的设备(或驱动)链表的所有设备(或驱动),通过总线的匹配函数判断是够匹配,如果匹配,则调用驱动的probe函数,然后我们就可以在probe函数注册字符设备,创建设备节点,实现fops集等等
在I2C-core.c这个函数中,把握下面的几个关键函数就可以了。
1.//增加/删除i2c_adapter
int i2c_add_adapter(struct i2c_adapter *adapter)
int i2c_del_adapter(struct i2c_adapter *adap)
2.//增加/删除i2c_driver
int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
void i2c_del_driver(struct i2c_driver *driver)
3.//i2c_client依附/脱离
int i2c_attach_client(struct i2c_client *client)
int i2c_detach_client(struct i2c_client *client)
4.//I2C传输,发送和接收
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)
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
I2c_transfer这个函数实现了core与adapter的联系。