i2c私有数据保存
相信在i2c驱动中,会经常看到有
i2c_set_clientdata
i2c_get_clientdata
这两个经常碰到,知道就是保存是有数据,但是一直没有跟下去,今天得空跟了一下,一目了然
不同的版本内核会有区别,我这个是基于kernel-4.19
首先看下原函数
static inline void i2c_set_clientdata(struct i2c_client *dev, void *data) { dev_set_drvdata(&dev->dev, data); } -----> include/linux/device.h static inline void dev_set_drvdata(struct device *dev, void *data) { dev->driver_data = data; } -----> 在文件 include/linux/device.h 中定义有 struct device *parent; ...... void *driver_data; /* Driver data, set and get with dev_set/get_drvdata */ ...... }
本质上就是使用了struct device这个结构体中的 driver_data
也就是i2c_client->dev->driver_data = void *data 把传入的参数保存在driver_data中,使用的时候直接读取
下面看下读取,实际上也是一样的,文件位置不变
static inline void *i2c_get_clientdata(const struct i2c_client *dev) { return dev_get_drvdata(&dev->dev); } ---> static inline void *dev_get_drvdata(const struct device *dev) { return dev->driver_data; }
直接返回了保存的私有数据
到这里应该一目了然了,下面看下使用案例
static int wacom_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id) { ..... int *testnumber
testnumber = kzalloc(sizeof(*testnumber), GFP_KERNEL); //申请一块内存 不然空指针
*testnumber = 126 ;
i2c_set_clientdata(client, testnumber); // 保存私有数据到 i2c_client->dev->driver_data
testnumber = i2c_get_clientdata(client) ; //读取保存的数据
printk("chencx test i2c_get_clientdata=%d---\n", *testnumber) ; //打印显示 ...... }
实际打印
chencx test i2c_get_clientdata=126---
测试完成
同理,input_get_drvdata input_set_drvdata是一样的,看下函数原型
static inline void *input_get_drvdata(struct input_dev *dev) { return dev_get_drvdata(&dev->dev); } static inline void input_set_drvdata(struct input_dev *dev, void *data) { dev_set_drvdata(&dev->dev, data); }
实际上就是和上面的一样的
到此,记录完成