Linux核心dev_set_drvdata()和dev_get_drvdata()儲存自定義結構體用法
阿新 • • 發佈:2018-12-14
定義位置: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);