I2C总线介绍:
1. I2C硬件结构
1.1 I2C电气特性
I2C总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
I2C总线只有两根双向信号线。
SDA: Serial Data Line 数据线
SCL: Serial Clock 时钟线
I2C总线协议规定:从设备采用7位的地址。D7~D1:从设备地址。D0位:数据传送方向位,为‘0’时表示主设备向从设备写数据,为‘1’时表示主机由从设备读数据。主设备发送地址时,总线上的每一个从设备都将这七位地址码与自己的地址进行比较,如果相同,则认为自己正被主设备寻址,根据R/W位将自己确定为发送器或接收器
1.2 总线寻址
总线时序:
2.1 空闲状态
2.2 起始状态
2.3 结束状态
2.4 数据位的传送
2.5 应答位
3. I2C裸机驱动主要分为
I2C初始化
写数据设计
读数据设计
Linux I2C 子系统
子系统架构:
1. I2C核心
I2C总线和I2C设备驱动的中间枢纽,它提供了I2C总线驱动和设备的注册,注销方法等。
2. I2C控制器驱动
对I2C控制器的驱动实现,控制器可在CPU外部,也可以集成在CPU内部。
3. I2C设备驱动
对I2C从设备的驱动实现,如AT24C02的驱动
I2C控制器驱动
每一个I2C 驱动控制器都会有一个I2C adapter结构:
其中const struct i2c_algorithm *algo; 这个成员类型里面都是函数指针
其中有个非常重要:
2440 210 6410 的I2C的控制器驱动都在一个文件里面I2C-S3C2410.c文件里面!
模块初始化函数:
static int __init i2c_adap_s3c_init(void) { return platform_driver_register(&s3c24xx_i2c_driver); }从上边可以看出I2C驱动原来是以平台驱动的方式来驱动的!
在probe中有比较重要的一行:ret = s3c24xx_i2c_init(i2c);
这个函数里面实际上和I2C裸机驱动步骤差不多!这里注释比较详细!
I2C设备驱动里面有数据的需要在I2C总线上发送的时候,路径是I2C设备驱动--->I2C-core--->I2C adapte/algorithm里面的方法来实现数据的传输
可以看到probe函数初始化部分:
第二个箭头,填充算法处理部分!其实这个结构定义如下:
跳到上面的箭头函数中:
继续跳,这里先重点关注箭头所指部分:
其实上面的步骤就是按照手册来的IIC-BUS Interface
当然后边一段循环的流程是在中断里面实现的!request_irq函数,这里先不详述!
I2C通用驱动代码:I2c-dev.c文件,首先还是看模块初始化函数
第一个箭头:早期的注册字符设备函数 通用IIC驱动呈现给用户的实际上是一个字符设备
第二个箭头:自动的创建设备文件
第三个箭头:注册一个IIC的设备驱动
IIC函数设备操作集:
初次接触里面包含的东西看来真的不是一般的少。。。