dev_set_drvdata和dev_get_drvdata的可能用途是什么

mri*_*dra 7 linux-device-driver

我只想知道当我们必须使用这些set和get驱动程序API时可能的用例.所有我都知道数据已保存,稍后我们可以使用数据做某事.我的问题是我们真的需要这样做吗?

 /*
  * 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);
Run Code Online (Sandbox Code Playgroud)

0an*_*riy 9

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

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

对,你至少有两种方法:

  • 在模块中引入全局变量[通常是BAD想法]
  • 在您的情况下struct device或其子节点(struct pci_dev例如)中指定回调参数中的内容.

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

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

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