Linux I2C驱动

来源:互联网 发布:软件开发进度表模板 编辑:程序博客网 时间:2024/06/06 17:31

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函数设备操作集:


初次接触里面包含的东西看来真的不是一般的少。。。

0 0
原创粉丝点击