i2c_set_clientdata函数

Posted 请给我倒杯茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了i2c_set_clientdata函数相关的知识,希望对你有一定的参考价值。

本文转载自‘: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_set_clientdata函数的主要内容,如果未能解决你的问题,请参考以下文章

windows dns doh clien server dnscrypt

MetaException(message:For direct MetaStore DB connections, we don't support retries at the clien

json PHP服务中的SOAP服务在PHP中的SOAP客户端 - http://www.starstormdesign.de/soap-service-mit-einem-soap-client-

套接字:listen()函数中的结果太大[关闭]

MFC socket编程

用户定义的函数,有条件地将文本拆分为 Oracle 列