LinuxI2C核心、总线驱动与设备驱动

I2C体系结构分为三个部分:I2C核心、总线驱动、设备驱动

 

I2C核心

  I2C核心提供了一组不依赖硬件的接口函数,I2C总线驱动和设备驱动之间依赖于I2C核心作为纽带

  (1)增加/删除i2c_adapter

   int i2c_add_adapter(struct i2c_adapter *adap);

   int i2c_del_adapter(struct i2c_adapter *adap); 

 

  (2)增加/删除i2c_driver

   int i2c_register_driver(struct module *owner, struct i2c_driver *drever);

   int i2c_del_driver(struct i2c_driver *drever);

   inline int i2c_add_driver(struct i2c_driver *drever);

 

  (3)i2c_client依附/脱离

   int i2c_attach_client(struct i2c_client *client);

   int i2c_detach_client(struct i2c_client *client);

 

  (4)I2C传输、发送和接收

   int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);/*用于I2C适配器和I2C设备之间通信*/

   int i2c_master_send(struct i2c_client *client, const char *buf, int count);//调用i2c_transfer()函数

   int i2c_master_recv(struct i2c_client *client, char *buf, int count);

 

I2C总线驱动:

  I2C总线驱动是对I2C硬件体系中适配器的实现。主要包含适配器数据结构i2c_adapter和适配器的algorithm结构体i2c_algorithm

  i2c_adapter

 1  struct i2c_adapter
 2  {
 3     struct module *owner;/*所属模块*/
 4     unsigned int id;   /*algorithm的类型,定义于i2c-id.h,以I2C_ALGO_开始*/
 5     unsigned int class;
 6     struct i2c_algorithm *algo;/*总线通信方法结构体指针 */
 7     void *algo_data; /* algorithm数据 */
 8     int (*client_register)(struct i2c_client *);  /*client注册时调用*/
 9     int (*client_unregister)(struct i2c_client *); /*client注销时调用*/
10     struct semaphore bus_lock;    /*控制并发访问的自旋锁*/
11     struct semaphore clist_lock;
12     int timeout;
13     int retries;    /*重试次数*/
14     struct device dev;  /* 适配器设备 */
15     struct class_device class_dev; /* 类设备 */
16     int nr;
17     struct list_head clients;  /* client链表头*/
18     struct list_head list;
19     char name[I2C_NAME_SIZE];  /*适配器名称*/
20     struct completion dev_released;    /*用于同步*/
21     struct completion class_dev_released;
22 };

  i2c_algorithm

1 struct i2c_algorithm
2 {
3     int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); 
4     int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, unsigned short flags, char read_write, u8 command, int size, union i2c_smbus_data *data); 
5     u32 (*functionality) (struct i2c_adapter *); 
6 };

  i2c_algorithm结构体主要实现了master_xfer()函数和functionalityh()函数,其中master_xfer()函数定义了适配器和设备之间的通信方式,functionalityh()函数用于返回algorithm支持的通信协议。

  i2c_adapter对应物理上的一个适配器,i2c_algorithm对应一套通信方法。

 

I2C设备驱动:

  I2C设备驱动包含i2c_driver和i2c_client两个数据结构。

  i2c_driver

 1 struct i2c_driver 
 2 {
 3     int id;
 4     unsigned int class;
 5     int (*attach_adapter)(struct i2c_adapter *); /*依附i2c_adapter函数指针 */
 6     int (*detach_adapter)(struct i2c_adapter *); /*脱离i2c_adapter函数指针*/
 7     int (*detach_client)(struct i2c_client *);  /*i2c client脱离函数指针*/
 8     int (*probe)(struct i2c_client *, const struct i2c_device_id *); //现行通用的与对应设备进行绑定的接口函数
 9     int (*remove)(struct i2c_client *);  //现行通用与对应设备进行解绑的接口函数
10     void (*shutdown)(struct i2c_client *);  //关闭设备
11     int (*suspend)(struct i2c_client *, pm_message_t mesg); //挂起设备,与电源管理有关,为省电
12     int (*resume)(struct i2c_client *); //从挂起状态恢复
13     void (*alert)(struct i2c_client *, unsigned int data);
14     int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);
15     struct device_driver driver;  //I2C设备的驱动模型
16     const struct i2c_device_id *id_table;  //匹配设备列表
17     int (*detect)(struct i2c_client *, struct i2c_board_info *);
18     const unsigned short *address_list;
19     struct list_head clients;
20 };

  i2c_client

 1 struct i2c_client
 2 {
 3     unsigned short flags;        //I2C_CLIENT_TEN表示设备使用10bit从地址,I2C_CLIENT_PEC表示设备使用SMBus检错
 4     unsigned short addr;        //设备从地址,7bit。这里说一下为什么是7位,因为最后以为0表示写,1表示读,通过对这个7bit地址移位处理即可。addr<<1 & 0x0即写,addr<<1 | 0x01即读。
 5     char name[I2C_NAME_SIZE];  //从设备名称
 6     struct i2c_adapter *adapter;    //此从设备依附于哪个adapter上
 7     struct i2c_driver *driver;    // 此设备对应的I2C驱动指针
 8     struct device dev;        // 设备模型
 9     int irq;            // 设备使用的中断号
10     struct list_head detected;  //用于链表操作
11 };

  i2c_driver 对应一套驱动方法,i2c_client对应真实的物理设备,每个i2c设备都需要一个i2c_client来描述。

 

posted @ 2015-09-01 19:27  Mage.Sun  阅读(252)  评论(0编辑  收藏  举报