I2C总线只有两根线,分别是串行数据线SDA和时钟线SCL,方便了工程人员的布线。I2C是多主机制。I2C协议不再多说。
参考文档:http://blog.sina.com.cn/s/blog_a56ef549010187m2.html
Linux的i2c分为i2c核心、i2c总线驱动和i2c设备驱动。
I2C核心:I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(algorithm),上层的,与具体适配器(adapter)无关的代码以及探测设备、检测设备地址的上层代码。对应的主要文件为i2c-core.c。这一部分是linux本身提供的,我们都不需要修改。但是知道函数是什么功能,还是很有帮助的。因为在驱动中发送数据时往往会调用到i2c-core.c中的函数。比较常用的函数主要有:i2c_add_adapter、i2c_register_driver、i2c_smbus_read_byte、i2c_smbus_write_byte、i2c_smbus_xfer等等等等。
I2C总线驱动:I2C总线驱动是I2C适配器的软件实现。I2C适配器可由CPU控制,也可以集成在CPU内部。davinci的I2C总线驱动主要是i2c-davinci.c文件,dm365也是使用的这个文件。
I2C设备驱动:I2C设备驱动是对I2C设备的软件实现。由于一般I2C总线驱动一般都有提供,我们主要编写的也就是这一部分设备驱动。
I2C总线驱动的工作流程:
在devices.c中添加总线设备,即定义platform_device,并调用platform_device_register函数对总线设备进行注册。
个人理解:这里应该就是定义并注册了一个i2c adapter。
在i2c-davinc.c文件中添加总线驱动。
这里开始就需要提到几个文件:
1、devices.c:位于arch/arm/mach-davinci中。devices.c中主要是定义了一些davinci的相关设备,在文件的注释中有:DaVinci platform device setup/initialization
即对platform device的设置/初始化。
在devices.c中开始部分宏定义中定义了相关外设的起始地址等相关信息,若I2C、MMCSD0、MMCSD1等。
函数davinci_map_sysmod中调用了函数:ioremap_nocache( ),ioremap_nocache作用是把内存映射到CPU空间,返回值为线性地址,此时CPU就可以访问设备的内存了,可以像访问内存一样使用访问内存的指令访问设备的内存(寄存器)。