版权声明:本文为博主原创文章,未经博主允许不得转载。 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);