struct pca9555_led {
u8 id;
struct i2c_client *client;
char *name;
struct led_classdev ldev;
struct work_struct work;
enum pca9555_state state;
};
struct pca9555_btn {
int irq;
char *name;
u8 id;
int keycode;
struct input_dev idev;
struct i2c_client *client;
};
struct pca9555_platform_data {
struct pca9555_led leds[5];
struct pca9555_btn btns[8];
};
上面的结构体定义在pca9555.h中,PCA9555有16个I/O,5个接led,8个接按键,结构体pca9555_platform_data描述了9555的使用情况。结构体类型pca9555_led和pca9555_btn分别用于描述led和Button,他们都属于i2c设备,因此都包括结构体指针变量struct i2c_client *client,led需要向led-class中注册,其注册的设备结构类型为led_classdev,Button为输入设备,在设备结构体中包含向input子系统注册的类型input_dev,并且包含中断号,按键码等信息。点击(此处)折叠或打开
static struct i2c_driver pca9555_driver = {
.driver = {
.name = "pca9555",
},
.probe = pca9555_probe, //当有i2c_client与i2c_driver匹配时调用
.remove = pca9555_remove, //注销时调用
.id_table = pca9555_id, //根据id进行匹配
}
struct pca9555_data{
struct i2c_client *client;
struct pca9555_led leds[5];
struct pca9555_btn btns[8];
struct mutex update_lock;
};
这两个结构体定义在驱动文件pca9555.c中,pca9555_driver在i2c驱动注册时作为参数被调用。pca9555_data中除了定义leds、btns之外定义了互斥变量update_lock,在通过i2c总线读写设备时用到。I2C设备的注册
在Linux2.6内核中支持两种编写i2c驱动程序的方式(这里所有内核版本为linux2.6.28):Adapter方式(LEGACY)和Probe方式(new style)。对于LEGACY方式的驱动设备部分在驱动运行的时候动态创建,新式的驱动(probe方式)倾向于向传统的Linux下设备驱动看齐,采用静态定义的方式来注册设备。使用接口为:int __init i2c_register_board_info(int busnum,
struct i2c_board_info const *info, unsigned len)
该函数定义在linux2.6.28/driver/i2c/i2c-boardinfo.c中。在平台代码中将会调用该函数完成i2c_board_info的注册。注册过程会根据info参数提供的设备信息封装一个devinfo的结构体,并添加到全局链表_i2