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;

...

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章