i2c_set_clientdata函数
2016-05-08 14:22
288 查看
原文:http://blog.csdn.net/jk198310/article/details/43738367
在i2c驱动中有很多函数和数据结构,很多一时难以理解,所以写下本文共同学习。
一、i2c_set_clientdata函数
在probe方式的I2C驱动中的probe函数中经常出现i2c_set_clientdata函数,一直很不解这个函数什么意思,后来查看内核源码,发现了一点大家都知道的秘密。
这是某个I2C设备驱动中的probe函数,选取了部分代码:
struct i2c_mydev //struct i2c_mydev是自定义的设备结构
{
struct i2c_client *client;
...
};
static int xxx_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
struct i2c_mydev *dev;
...
dev->client=client;
i2c_set_clientdata(client, dev);
...
}
/*
client是在板级信息初始化的时候自动创建的设备,将client赋值给dev中的client
然后又将设备文件结构dev赋值给client的私有驱动数据指针。i2c_set_clientdata函数到底是什么作用呢?
在该函数中调用了dev_set_drvdata函数,在dev-set_drvdata函数实现代码中有一行代码:dev->p->driver_data=data
driver_data是什么呢,内核中一句注释:driver_data - private pointer for driver specific info。driver_data是驱动特殊信息的私有指针,i2c_set_clientdata(client, dev)就是将自定义的设备结构dev赋给设备驱动client的私有指针,目的是什么呢,我猜测是用来区别其他驱动client,不知道这样理解对不对。敬请指正,这也是本文面世的一个原因。
*/
static inline void i2c_set_clientdata(struct i2c_client *dev, void *data)
{
dev_set_drvdata(&dev->dev, data);
}
void dev_set_drvdata(struct device *dev, void *data)
{
...
dev->p->driver_data = data;
...
}
在i2c驱动中有很多函数和数据结构,很多一时难以理解,所以写下本文共同学习。
一、i2c_set_clientdata函数
在probe方式的I2C驱动中的probe函数中经常出现i2c_set_clientdata函数,一直很不解这个函数什么意思,后来查看内核源码,发现了一点大家都知道的秘密。
这是某个I2C设备驱动中的probe函数,选取了部分代码:
struct i2c_mydev //struct i2c_mydev是自定义的设备结构
{
struct i2c_client *client;
...
};
static int xxx_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
struct i2c_mydev *dev;
...
dev->client=client;
i2c_set_clientdata(client, dev);
...
}
/*
client是在板级信息初始化的时候自动创建的设备,将client赋值给dev中的client
然后又将设备文件结构dev赋值给client的私有驱动数据指针。i2c_set_clientdata函数到底是什么作用呢?
在该函数中调用了dev_set_drvdata函数,在dev-set_drvdata函数实现代码中有一行代码:dev->p->driver_data=data
driver_data是什么呢,内核中一句注释:driver_data - private pointer for driver specific info。driver_data是驱动特殊信息的私有指针,i2c_set_clientdata(client, dev)就是将自定义的设备结构dev赋给设备驱动client的私有指针,目的是什么呢,我猜测是用来区别其他驱动client,不知道这样理解对不对。敬请指正,这也是本文面世的一个原因。
*/
static inline void i2c_set_clientdata(struct i2c_client *dev, void *data)
{
dev_set_drvdata(&dev->dev, data);
}
void dev_set_drvdata(struct device *dev, void *data)
{
...
dev->p->driver_data = data;
...
}
相关文章推荐
- 从头认识多线程-2.14 解决由同步的synchronized (newobject()) 引起的脏读的方法
- 搜索引擎索引数据结构和算法
- Linux环境下查看Jmeter请求的响应数据
- Ubuntu系统使用Qt Designer设计界面
- Java实现算法之快速排序
- 理解面向对象编程(四)-Junit、反射和BeanUtils:
- 对fragment的学习
- ZOJ3777 Problem Arrangement 期望+状态压缩+meet in the middle中途相遇法
- 软件工程课程之建议
- Activity相关
- Android Gradle Plugin指南(五)——Build Variants(构建变种版本)
- github前100名的android开源库
- Linux学习之文件处理命令
- 重新学javaweb---过滤器 Filter基础知识
- 51CTO持续更新《通哥的运维笔记》
- android简单调色画板
- 64. Minimum Path Sum 路径最小总和
- Android Gradle Plugin指南(四)----测试
- OVFTool 4.1 vmdk格式换成OVF格式
- 第5课:基于案例一节课贯通Spark Streaming流计算框架的运行源码