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)
驱动程序核心处理运行驱动程序的不同阶段.您可以考虑一个驱动程序代码为一组回调,如->probe(),->remove()等.有关详细信息,您可以检查struct platform_driver或struct pci_driver定义.
那么,你如何在回调之间进行通信?
对,你至少有两种方法:
struct device或其子节点(struct pci_dev例如)中指定回调参数中的内容.因此,我们有一个指向私有成员的指针,该成员可以用作应该通过回调传递的有用信息的容器.
为什么我们需要那个?大多数驱动程序请求一些资源并在probe阶段保存指向它们的指针.为了避免资源泄漏,您必须在remove阶段释放它们.这就是它的用法.
正如allsey87所指出的,另一个有用的模式是通过回调传递设备的当前状态.一个真实的例子是电源管理回调(->suspend(),->resume(),等).