参考:http://blog.csdn.net/fanqipin/article/details/7940061
介绍
I2C(Inter-Intergratedcircuit)及子集smbus(system management Bus)接口是嵌入式系统中比较常见的接口。I2C设备主要有EEPROM,HWMON,RTC等。
I2C为两线接口,SDA和SCL。
I2C设备通常为7位地址,但也有10位地址。
在kernel加载时,会加载dts,遍历到dts文件中的i2c设备;
dts中至少包含设备名称和设备地址;
当设备驱动insmod时,driver中的name与dts中的name一致时,probe函数被调用,并将client传递给driver,如此设备与driver建立联系。
在probe中创建设备节点,供用户空间访问设备。
i2cdev->dev = device_create(i2c_dev_class, NULL, MKDEV(I2C_MAJOR, client->adapter->nr),
NULL,"i2c-%d",client->adapter->nr);
目前linux仅支持master模式,不支持slave。
一般来说,我们都会按照I2C驱动框架,将操作I2C从设备的代码整合为一个从设备驱动,注册到I2C-CORE中,通过i2c core提供的adapter接口,与从设备进行通信。
i2c驱动架构中有4中角色:core、adapter、client_driver、client_device。
core负责维护i2c bus匹配已经存在的adapter/driver/client;
adapter负责master控制器,提供通信API
client_device:描述从设备的属性
client_driver:从设备驱动。
设备驱动主要围绕struct i2c_driver和 struct i2c_client结构。
i2c_driver对外提供诸如设备枚举、电源管理等回调;
i2c_client由core在probe时提供给driver,描述关联的设备,比如名称、地址等操作设备的必要信息。
驱动完成设备枚举后,拿到设备对应的i2c_client和i2c_adapter结构,就可以调用core的API访