Linux内核dev_set_drvdata()和dev_get_drvdata()存储自定义结构体用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010164190/article/details/84635154
定义位置:kernel/msm-3.18/include/linux/device.h
static inline void dev_set_drvdata(struct device *dev, void *data){
  dev->driver_data = data;
}
static inline void *dev_get_drvdata(const struct device *dev){
  return dev->driver_data;
}

kernel/msm-3.18/include/linux/i2c.h
struct i2c_client{
  unsigned short addr;
  struct device dev;
};

//自定义结构体
struct data{
  int num;
  char *name;
};

栗子一:i2c_set_clientdata和i2c_get_clientdata也是调用这两个函数
kernel/msm-3.18/include/linux/i2c.h
static inline void i2c_set_clientdata(struct i2c_client *dev, void *data){
  dev_set_drvdata(&dev->dev, data);
}
static inline void *i2c_get_clientdata(const struct i2c_client *dev){
  return dev_get_drvdata(&dev->dev);
}

struct data set_stu;
struct i2c_client *i2c;
//1.申请内存,devm_kzalloc()函数自动释放内存
devm_kzalloc(&i2c->dev, sizeof(struct stu), GFP_KERNEL);

//2.设置结构体stu到kernel结构体void*
dev_set_drvdata(&i2c->dev, set_stu);

//3.获取结构体stu
struct data get_stu;
get_stu = dev_get_drvdata(&i2c->dev);

//4.置空,不用时
dev_set_drvdata(&i2c->dev, NULL);


栗子二:struct snd_soc_dai{};
<1>.kernel/msm-3.18/include/sound/soc-dai.h
struct snd_soc_dai{
  struct snd_soc_codec *codec;
}; 

<2>.kernel/msm-3.18/include/sound/soc.h
struct snd_soc_codec { 
  struct snd_soc_component component;
};

<3>.kernel/msm-3.18/include/sound/soc.h
struct snd_soc_component {
  struct device *dev;
};

struct data set_stu;
struct data get_stu;
struct snd_soc_dai *dai;

//1.申请内存,devm_kzalloc()函数自动释放内存
devm_kzalloc(dai->codec->component.dev, sizeof(struct stu), GFP_KERNEL);

//2.设置结构体stu到kernel结构体void*
dev_set_drvdata(dai->codec->component.dev, set_stu);

//3.获取结构体stu
get_stu = (struct data*)dev_get_drvdata(dai->codec->component.dev); 

//4.置空,不用时
dev_set_drvdata(dai->codec->component.dev, NULL);

猜你喜欢

转载自blog.csdn.net/u010164190/article/details/84635154
Dev
今日推荐