打赏

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);
}

实际上就是和上面的一样的 

 

到此,记录完成

 

posted @ 2024-01-20 16:58  陈昌雄  阅读(7)  评论(0编辑  收藏  举报