1. 程式人生 > >Linux核心dev_set_drvdata()和dev_get_drvdata()儲存自定義結構體用法

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