始创于2000年 股票代码:831685
咨询热线:0371-60135900 注册有礼 登录
  • 挂牌上市企业
  • 60秒人工响应
  • 99.99%连通率
  • 7*24h人工
  • 故障100倍补偿
您的位置: 网站首页 > 帮助中心>文章内容

Linux I2C 驱动分析

发布时间:  2012/9/10 17:23:04
 最近在看Linux 2.6.21内核的I2C驱动,也在网上查了一下资料,有错也有对,有些心得,记录下来吧。里面认识或许多有不当之处,还恳请指正。
   
    1. I2C 协议
   
    1.1  I2C总线工作原理
   
    I2C总线是由数据线SDA和时钟SCL构成的串行总线,各种被控制器件均并联在这条总线上,每个器件都有一个唯一的地址识别,可以作为总线上的一个发送器件或接收器件(具体由器件的功能决定)
   
    1.2  I2C总线的几种信号状态
   
    1.  空闲状态:SDA和SCL都为高电平。
   
    2.  开始条件(S):SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
   
    3.  结束条件(P):SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
   
    4.  数据有效:在SCL的高电平期间, SDA保持稳定,数据有效。SDA的改变只能发生在SCL的底电平期间。
   
    5.  ACK信号: 数据传输的过程中,接收器件每接收一个字节数据要产生一个ACK信号,向发送器件发出特定的低电平脉冲,表示已经收到数据。
   
    1.3  I2C总线基本操作
   
    I2C总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL),同时控制总线的传输方向,并产生开始和停止条件。
   
    数据传输中,首先主器件产生开始条件,随后是器件的控制字节(前七位是从器件的地址,最后一位为读写位 )。接下来是读写操作的数据,以及 ACK响应信号。数据传输结束时,主器件产生停止条件
   
    2. Linux I2C 结构分析
   
    2.1 层次分析
   
    1. I2C Core
   
    I2C Core用于维护Linux的I2C核心部分,其中维护了两个静态的List,分别记录系统中的I2C driver结构和I2C adapter结构。
   
    static LIST_HEAD(adapters);
   
    static LIST_HEAD(drivers);
   
    I2C core提供接口函数,允许一个I2C adatper,I2C driver和I2C client初始化时在I2C core中进行注册,以及退出时进行注销。具体可以参见i2c_core.c代码。
   
    同时还提供了I2C总线读写访问的一般接口(具体的实现在与I2C控制器相关的I2C adapter中实现),主要应用在I2C设备驱动中。
   
    常用的主要是
   
    i2c_master_send()
   
    i2c_master_recv()
   
    i2c_transfer()
   
    2. I2C bus driver
   
    总线驱动的职责,是为系统中每个I2C总线增加相应的读写方法。但是总线驱动本身并不会进行任何的通讯,它只是存在在那里,等待设备驱动调用其函数。
   
    在系统开机时,首先装载的是I2C总线驱动。一个总线驱动用于支持一条特定的I2C总线的读写。一个总线驱动通常需要两个模块,一个struct i2c_adapter和一个struct i2c_algorithm来描述:
   
    在 buses目录下的i2c-pxa.c中实现了PXA的I2C总线适配器,I2C adapter 构造一个对I2C core层接口的数据结构,并通过接口函数向I2C core注册一个控制器。I2C adapter主要实现对I2C总线访问的算法,iic_xfer() 函数就是I2C adapter底层对I2C总线读写方法的实现。同时I2C adpter 中还实现了对I2C控制器中断的处理函数。
   
    1) i2c-pxa.c定义了i2c_algorithm,并且实现了master的发送函数i2c_pxa_xfer(),以及设备查询总线的模式的函数i2c_pxa_functionality()
   
    static const struct i2c_algorithm i2c_pxa_algorithm = {
   
    .master_xfer = i2c_pxa_xfer,
   
    .functionality = i2c_pxa_functionality,
   
    };
   
    2) i2c-pxa.c中,实现了i2c_adapter,主要是在定义pxa-i2c时进行初始化,并且i2c_pxa_probe()中进行填充parent指针,并且调用
   
    ret = i2c_add_adapter(&i2c->adap);
   
    进行添加。
   
    static struct pxa_i2c i2c_pxa = {
   
    .lock = SPIN_LOCK_UNLOCKED,
   
    .adap = {
   
    .owner  = THIS_MODULE,
   
    .algo  = &i2c_pxa_algorithm,
   
    .name  = "pxa2xx-i2c.0",
   
    .retries = 5,
   
    },
   
    };
   
    总的来说,在i2c-pxa中,使用platform驱动模型,完成了i2c的总线两种模块struct i2c_adapter和struct i2c_algorithm
   
    3. I2C device driver
   
    I2C只有总线驱动是不够的,必须有设备才能工作。这就是I2C device driver的必要性。I2C的device是有两个模块来描述的,struct i2c_driver和struct i2c_client.
   
    在介绍chips目录下的device driver前有必要介绍一下i2c-dev.c文件。
   
    i2c-dev.c中提供了一个通用的I2C设备的驱动程序,实现了字符类型设备的访问接口,对设备的具体访问是通过I2C adapter来实现的。构造一个对I2C core层接口的数据结构,通过接口函数向 I2C Core注册一个I2C设备驱动。同时构造一个对用户层接口的数据结构,并通过接口函数向内核注册为一个主设备号为89的字符类型设备。
   
    static struct i2c_driver i2cdev_driver = {
   
    .driver = {
   
    .name = "dev_driver",
   
    },
   
    .id  = I2C_DRIVERID_I2CDEV,
   
    .attach_adapter = i2cdev_attach_adapter,
   
    .detach_adapter = i2cdev_detach_adapter,
   
    .detach_client = i2cdev_detach_client,
   
    };
   
    struct i2c_dev {
   
    struct list_head list;
   
    struct i2c_adapter *adap;
   

本文出自:亿恩科技【www.enkj.com】

服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM]

  • 您可能在找
  • 亿恩北京公司:
  • 经营性ICP/ISP证:京B2-20150015
  • 亿恩郑州公司:
  • 经营性ICP/ISP/IDC证:豫B1.B2-20060070
  • 亿恩南昌公司:
  • 经营性ICP/ISP证:赣B2-20080012
  • 服务器/云主机 24小时售后服务电话:0371-60135900
  • 虚拟主机/智能建站 24小时售后服务电话:0371-60135900
  • 专注服务器托管17年
    扫扫关注-微信公众号
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 亿恩科技 版权所有  地址:郑州市高新区翠竹街1号总部企业基地亿恩大厦  法律顾问:河南亚太人律师事务所郝建锋、杜慧月律师   京公网安备41019702002023号
      0
     
     
     
     

    0371-60135900
    7*24小时客服服务热线