注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

LINUX驱动之IIC子系统之三I2C的数据结构  

2012-11-14 20:34:21|  分类: LINUX内核驱动 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

LINUX驱动之IIC子系统之三I2C的数据结构

仍然是按照老的规矩,讲一下I2C的数据结构,让大家在学习I2C前,形成一个整体上的知识结构的认知。它的数据结构也不多,主要的有下面几个:(I2C.h)

1、i2c总线类型结构体:

struct bus_type i2c_bus_type = {

    .name      = "i2c",

    .match     = i2c_device_match,

    .probe     = i2c_device_probe,

    .remove       = i2c_device_remove,

    .shutdown  = i2c_device_shutdown,

    .suspend   = i2c_device_suspend,

    .resume       = i2c_device_resume,

};

2、I2C从设备数据结构体:

struct i2c_client {

    unsigned short flags;       /* div., see below       */

    unsigned short addr;     /* chip address - NOTE: 7bit    */

                  /* addresses are stored in the  */

                  /* _LOWER_ 7 bits    */

    char name[I2C_NAME_SIZE];

    struct i2c_adapter *adapter;    /* the adapter we sit on */

    struct i2c_driver *driver;  /* and our access routines  */

    struct device dev;       /* the device structure     */

    int irq;          /* irq issued by device     */

    struct list_head detected;

};

3、I2C从设备驱动结构体:

struct i2c_driver {

    unsigned int class;

 

    /* Notifies the driver that a new bus has appeared or is about to be

     * removed. You should avoid using this if you can, it will probably

     * be removed in a near future.

     */

    int (*attach_adapter)(struct i2c_adapter *);

    int (*detach_adapter)(struct i2c_adapter *);

 

    /* Standard driver model interfaces */

    int (*probe)(struct i2c_client *, const struct i2c_device_id *);

    int (*remove)(struct i2c_client *);

 

    /* driver model interfaces that don't relate to enumeration  */

    void (*shutdown)(struct i2c_client *);

    int (*suspend)(struct i2c_client *, pm_message_t mesg);

    int (*resume)(struct i2c_client *);

 

    /* a ioctl like command that can be used to perform specific functions

     * with the device.

     */

    int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);

 

    struct device_driver driver;

    const struct i2c_device_id *id_table;

 

    /* Device detection callback for automatic device creation */

    int (*detect)(struct i2c_client *, int kind, struct i2c_board_info *);

    const struct i2c_client_address_data *address_data;

    struct list_head clients;

};

4、表征I2C设备的一些特征的数据结构体,组成链表的基本单元:

struct i2c_board_info {

    char       type[I2C_NAME_SIZE];

    unsigned short    flags;

    unsigned short    addr;

    void       *platform_data;

    struct dev_archdata  *archdata;

    int    irq;

};

在SPI里大家也发有这么一个吧,而且它还有一个管理这个的链表结构,这里就不再讲那个了,因为i2C直接使用的链表没有新建立一个类似的结构。

5、I2C传输数据的一种算法

struct i2c_algorithm {

    /* If an adapter algorithm can't do I2C-level access, set master_xfer

       to NULL. If an adapter algorithm can do SMBus access, set

       smbus_xfer. If set to NULL, the SMBus protocol is simulated

       using common I2C messages */

    /* master_xfer should return the number of messages successfully

       processed, or a negative value on error */

    int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,

              int num);

    int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,

              unsigned short flags, char read_write,

              u8 command, int size, union i2c_smbus_data *data);

 

    /* To determine what the adapter supports */

    u32 (*functionality) (struct i2c_adapter *);

};

I2C的通信最终都必须调用该结构中master_xfer的方法来实现。这套通信方法是跟底层I2C控制器硬件相关的。

6、I2C主设备数据结构:

struct i2c_adapter {

    struct module *owner;

    unsigned int id;

    unsigned int class;        /* classes to allow probing for */

    const struct i2c_algorithm *algo; /* the algorithm to access the bus */

    void *algo_data;

 

    /* data fields that are valid for all devices */

    u8 level;         /* nesting level for lockdep */

    struct mutex bus_lock;

 

    int timeout;         /* in jiffies */

    int retries;

    struct device dev;       /* the adapter device */

 

    int nr;

    char name[48];

    struct completion dev_released;

};

这个叫控制器也叫适配器,大家一定要记清。

7、I2C消息数据结构体:

struct i2c_msg {

    __u16 addr;   /* slave address         */

    __u16 flags;

#define I2C_M_TEN    0x0010 /* this is a ten bit chip address */

#define I2C_M_RD     0x0001 /* read data, from slave to master */

#define I2C_M_NOSTART       0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_REV_DIR_ADDR  0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_NO_RD_ACK     0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */

#define I2C_M_RECV_LEN      0x0400 /* length will be first received byte */

    __u16 len;    /* msg length            */

    __u8 *buf;    /* pointer to msg data          */

};

看着它发现与SPI有相类似的地方没有。

8、smbus数据结构体(一种通信算法)

union i2c_smbus_data {

    __u8 byte;

    __u16 word;

    __u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */

                  /* and one more for user-space compatibility */

};

这些个数据结构会自始至终的跟在整个I2C设备的通信过程中,大家一定要有一个清楚的认识,别弄混了,象SPI里就有一个设备的遍历和驱动的遍历,很容易把人弄糊涂了。

先讲这么一点点,明天开始讲注册部分。

注重一个字,恒!

  评论这张
 
阅读(935)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017