标签:
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来描述。
标签:
原文地址:http://www.cnblogs.com/mage-sun/p/4776657.html