首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dev_set_drvdata和dev_get_drvdata的可能用途是什么

dev_set_drvdata和dev_get_drvdata的可能用途是什么
EN

Stack Overflow用户
提问于 2014-05-22 15:26:53
回答 1查看 9.3K关注 0票数 7

我只想知道当我们必须使用这些set和get驱动程序API时,可能的用例是什么。我所知道的就是数据被保存了,以后我们可以使用数据来做一些事情。我的问题是什么时候我们真的需要这样做?

代码语言:javascript
复制
     /*
      * These exports can't be _GPL due to .h files using this within them, and it
      * might break something that was previously working...
     */
     void *dev_get_drvdata(const struct device *dev)
     {
          if (dev && dev->p)
                  return dev->p->driver_data;
          return NULL;
     }
     EXPORT_SYMBOL(dev_get_drvdata);

     void dev_set_drvdata(struct device *dev, void *data)
     {
        int error;
 
        if (!dev)
                 return;
        if (!dev->p) {
                 error = device_private_init(dev);
                 if (error)
                         return;
        }
        dev->p->driver_data = data;
     }
     EXPORT_SYMBOL(dev_set_drvdata);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-14 00:17:51

驱动程序核心处理运行驱动程序的不同阶段。您可以将驱动程序代码视为一组回调,如->probe()->remove()等。有关详细信息,请查看struct platform_driverstruct pci_driver定义。

那么,如何在回调之间进行通信呢?

对,你至少有两种方法:

  • 在模块中引入全局变量通常是个坏主意
  • 在回调的参数中指定一些东西,在你的例子中是struct device或它的子级(例如struct pci_dev)。

因此,我们有一个指向私有成员的指针,该成员可用作应通过回调传递的有用信息的容器。

为什么我们需要它?大多数驱动程序都会请求一些资源,并将指向它们的指针保存在probe阶段的某个地方。为了避免资源泄漏,您必须在remove阶段释放它们。这就是它的用法。

正如allsey87所指出的,另一个有用的模式是跨回调传递设备的当前状态。一个真实的例子是电源管理回调(->suspend()->resume()等)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23800337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档