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的联系。

 

82.Linux--IIC总线驱动框架(上)