bdd
struct device {
void *platform_data;
void *driver_data;
xxx_set_drvdata
xxx->dev->driver_data = data;
xxx_get_drvdata
data = xxx->dev->driver_data;
dev_get_platdata
return dev->platform_data;
到 probe 的时候
pdata: null
drvdata: null
这个东西对于每个设备来说都是私有数据.但是driver 怎么根据同种但是不同的设备来做事情呢?
他们一开始都为null,可以根据设备树里面的属性来分辨不同的节点,从而给不同设备的 pdata drvdata 赋不同的值
dev 与 drv数据
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 中拿出来
int platform_device_add_data(struct platform_device *pdev, const void *data,size_t size)
bdd 的封装
platform 与 数据
s2mps11_clks->pdev = pdev;
struct platform_device * pdev = s2mps11_clks->pdev
---
platform_set_drvdata(pdev, s2mps11_clks);
struct s2mps11_clk *s2mps11_clks = platform_get_drvdata(pdev);
input 与 数据
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 与数据
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
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);
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);
int axi_dma_open(struct inode *inode, struct file *filp)
{
struct axi_dma_dev *dev;
dev = container_of(inode->i_cdev, struct axi_dma_dev, cdev);
filp->private_data = dev;