版权声明:本文为博主原创文章,任何组织或者个人可以在任何媒介上发表或转载我的文章、图片等.且转载后必须注明出处和邮箱,博客地址(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);