gpt4 book ai didi

linux-device-driver - dev_set_drvdata 和 dev_get_drvdata 的可能用途是什么

转载 作者:行者123 更新时间:2023-12-04 11:24:18 24 4
gpt4 key购买 nike

我只想知道当我们必须使用这些集合并获取驱动程序 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);

最佳答案

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

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

对,你至少有两种方法:

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

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

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

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

    关于linux-device-driver - dev_set_drvdata 和 dev_get_drvdata 的可能用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23800337/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com