linux下i2c与pca9555通信,Linux下Led&Button设备驱动PCA9555

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值