本文主要是介绍Linux内核dev_set_drvdata()和dev_get_drvdata()存储自定义结构体用法(六),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
定义位置: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);
这篇关于Linux内核dev_set_drvdata()和dev_get_drvdata()存储自定义结构体用法(六)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!