九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 3895|回复: 0
打印 上一主题 下一主题

[Linux笔记]platform_set_drvdata和platform_get_drvdata用法

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-22 00:09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在用到Linux设备驱动的platform框架时,常常会遇到两个函数platform_get_drvdata和platform_set_drvdata。通常,会在驱动的probe函数中获取device的相关信息,然后使用platform_set_drvdata进行保存。在其他函数中要用到时(比如remove),通过platform_get_drvdata来获取。
       内核中的定义为:
#define platform_get_drvdata(_dev) dev_get_drvdata(&(_dev)->dev)
#define platform_set_drvdata(_dev,data) dev_set_drvdata(&(_dev)->dev, (data))
       _dev指的是struct platform_device,可以看到其实调用的是dev_get_drvdata和dev_set_drvdata。
struct platform_device {
const char * name;
int  id;
struct device dev;
u32  num_resources;
struct resource * resource;

const struct platform_device_id *id_entry;

/* arch specific additions */
struct pdev_archdata archdata;
};

void *dev_get_drvdata(const struct device *dev)
{
if (dev && dev->p)
  return dev->p->driver_data;
return NULL;
}

void *dev_get_drvdata(const struct device *dev)
{
if (dev && dev->p)
  return dev->p->driver_data;
return NULL;
}
       下面来看看涉及到的struct device的相关成员。
struct device {
       ...
       struct device_private *p;
       struct device_driver *driver; /* which driver has allocated this
       void  *platform_data; /* Platform specific data, device core doesn't touch it */
       ...
};
       struct device_private中的成员:
struct device_private - structure to hold the private to the driver core portions of the device structure.这个结构用来保存struct device中的私有的设备驱动程序的核心部分。
struct device_private {
       ...
void *driver_data;
struct device *device;
};
       如果有定义struct platform_device *pdev;那设备相关的信息会保存在pdev->dev.platform_data中。在驱动中的probe配置好的设备信息则是通过platform_set_drvdata保存在pdev->dev->p->driver_data中,但是driver_data已经封装在函数platform_set_drvdata和platform_get_drvdata中了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-11-22 18:35 , Processed in 0.017734 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表