驱动中私有数据的存放

版权声明:本文为博主原创文章,任何组织或者个人可以在任何媒介上发表或转载我的文章、图片等.且转载后必须注明出处和邮箱,博客地址(https://blog.csdn.net/u011011827),本人邮箱([email protected]) https://blog.csdn.net/u011011827/article/details/89429082

bdd

struct device {
    void        *platform_data; /* Platform specific data, device core doesn't touch it */
    void        *driver_data;   /* Driver data, set and get with dev_set/get_drvdata */
xxx_set_drvdata
	xxx->dev->driver_data = data;
xxx_get_drvdata
	data = xxx->dev->driver_data;

dev_get_platdata // static inline void *dev_get_platdata(const struct device *dev)
	return dev->platform_data;


到 probe 的时候
    
pdata: null
drvdata: null
    
这个东西对于每个设备来说都是私有数据.但是driver 怎么根据同种但是不同的设备来做事情呢?
他们一开始都为null,可以根据设备树里面的属性来分辨不同的节点,从而给不同设备的 pdata drvdata 赋不同的值
    

dev 与 drv数据 // 其实 这个过程 是 plat input i2c 的直接版本,效果一样
	dev->driver_data = bu21013_data;
	
	struct bu21013_ts_data *bu21013_data = dev_get_drvdata(dev);

dev 与plat数据
      // 平台数据

      struct device *dev = &client->dev;                                           
      const struct tca8418_keypad_platform_data *pdata =                           
                          dev_get_platdata(dev);
      将数据从pdata 中拿出来
      // 数据时什么时候放进去的呢 添加platfrom的时候会主动放入,驱动也可以放入
      int platform_device_add_data(struct platform_device *pdev, const void *data,size_t size) // GFP_KERNEL

bdd 的封装

platform 与 数据 // 只有这一种 drvdata
// 设置 s2mps11_clks 的数据指向
s2mps11_clks->pdev = pdev;

// 从 s2mps11_clks get 到 pdev
struct platform_device * pdev = s2mps11_clks->pdev

---

// 设置 pdev 的私有数据
platform_set_drvdata(pdev, s2mps11_clks);
// 拿 pdev 的私有数据
struct s2mps11_clk *s2mps11_clks = platform_get_drvdata(pdev);

input 与 数据 // 其实就是drvdata
      struct tca8418_keypad *keypad_data;
      struct input_dev *input;

      keypad_data = devm_kzalloc(dev, sizeof(*keypad_data), GFP_KERNEL);
      if (!keypad_data)
      	return -ENOMEM;

      input = devm_input_allocate_device(dev);                                     
      if (!input)                                                                  
          return -ENOMEM;

      keypad_data->input = input;
      input_set_drvdata(input, keypad_data);

      input_register_device(input);


i2c 与数据 // 其实就是 drvdata
static int apanel_probe(struct i2c_client *client
	struct apanel *ap;
	ap = &apanel; // 全局变量
	i2c_set_clientdata(client, ap); 

static int apanel_remove(struct i2c_client *client)
	struct apanel *ap = i2c_get_clientdata(client);

  • 赋值demo

// platform_data

char buff_p[6] = "hello";
char *pdata = NULL;                                                          

struct device *dev = &client->dev;
pdata = dev_get_platdata(dev);                                               

if (pdata)                                                                   
    printk("pdata:%d\n",pdata[0]);                                           
else{                                                                            
    printk("pdata: null\n");                                                 
    dev->platform_data = buff_p;                                             
    }                                                                            

pdata = dev_get_platdata(dev);                                               
printk("pdata:%s\n",pdata);                                                  
       
// driver_data                                                                      

char buff_d[6] = "12345";                                                                         
char * drvdata = NULL;     

drvdata = i2c_get_clientdata(client);                                        

if(drvdata)                                                                  
    printk("drvdata:%d\n",drvdata[0]);                                          
else{
    dev->driver_data= buff_d;                                                   
    printk("drvdata: null\n");                                                  
}                                                                               

drvdata = i2c_get_clientdata(client);                                           
printk("drvdata:%s\n",drvdata);


猜你喜欢

转载自blog.csdn.net/u011011827/article/details/89429082