Linux I2C 驱动的几个概念

本文介绍Linux I2C驱动相关的几个重要的数据结构,以及他们适用的 场合。

struct i2c_adapter

无法避免,我们必然碰到struct i2c_adapter这个数据结构。好在我们只是要编写I2C设备驱动,我们只需简单的认为,i2c_adapter是标识一个I2C总线的数据结构的,直白一点就是CPU这边的I2C控制器,I2C主设备。我们跟I2C设备的所有通信,都必须通过这个控制器进行。

struct i2c_client

用来表示一个I2C从设备,我们的驱动代码所对应的设备。用来表示从设备的数据结构还有 struct i2c_board_info。为了弄清楚两者的关系,我们先看一下struct i2c_client所包含的成员。

struct i2c_client {
unsigned short flags; /* div., see below */
unsigned short addr; /* chip address - NOTE: 7bit */
                /* addresses are stored in the */
                 /* _LOWER_ 7 bits */
unsigned long timing; /* parameters of timing */
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;
};


struct i2c_board_info

按照Linux代码的注释,这个数据结构是用于创建设备(i2c_client)的模板,  它提供了系统创建i2c_client的关键信息。其很多字段跟struct i2c_client存在对应关系。 

struct i2c_board_info {
char type[I2C_NAME_SIZE];    /* 初始化i2c_client.name*/
unsigned short flags;                           /* 初始化i2c_client.flags*/

unsigned short addr;                            /* i2c_client.addr */
void *platform_data;                         /* i2c_client.dev.platform_data */
struct dev_archdata *archdata;          /* i2c_client.dev.archdata */
int irq;                                               /*i2c_client.irq */
};

i2c_client 和 i2c_board_info 两者都是描述一个I2C设备,但是它们使用的地方是不一样的。 

i2c_client  应用于设备驱动的各个操作函数的参数中,用于指代当前操作的设备,而且它还包含了i2c_adapter, 指明了设备是挂载在哪个I2C总线上的。i2c_client是系统动态创建的。 

i2c_board_info, 用于在代码中静态声明I2C设备, 这些声明往往放在board相关的文件中。 board的初始化函数会调用i2c_register_board_info(), 将声明的静态I2C设备注册到系统的中。这些信息是生成对应的i2c_client的重要依据。

你可能感兴趣的:(Android,Linux)