【问题标题】:Linux Kernel API to get struct device from platform driverLinux Kernel API 从平台驱动程序获取结构设备
【发布时间】:2016-01-13 23:42:45
【问题描述】:

我想知道是否有一个内核 API 允许基于一些参数获取struct device。我正在使用主线内核,版本 3.3。

情况如下: 我已经注册了平台设备A并设置了一些与A关联的驱动程序数据。A有多个实例具有不同的ID,所以A(1)、A(2)、A(3)...

现在,我正在注册平台设备BB 的驱动程序需要拥有与 A(1)A(2) 或相关联的 struct device 的特定实例 A(3)...

所以可以把它想象成B 在某种程度上拥有A(n)。我可以做到这一点的一种方法是让A 驱动程序有一个全局struct device 数组来跟踪所有注册的设备。但是,对于像平台驱动程序这样通用的东西,我想知道内核是否提供了一个 API 来基于一些参数(例如 platform driver name 和关联的 id)来获取它。

谢谢!

【问题讨论】:

  • 目前唯一的方法是在设备之间建立父子关系。当设备是多功能的时有一个例外,在这种情况下,MFD 框架会很有帮助。从您的问题中不清楚设备(A 和 B)有什么样的关系。
  • 我会说 MFD 驱动程序不适合我的情况。我很可能会按照 Federico 的回答创建自己的搜索方法。

标签: linux linux-device-driver device-driver


【解决方案1】:

不确定它是否存在。实际上我没有看到可以使用哪些参数来选择struct device 实例。

我认为您必须在 A 驱动程序中实现自己的搜索方法。 在 A 驱动程序中,您可以跟踪所有实例(全局变量)。

从驱动程序 A 导出一个函数 find_instance(<parameters>) 并在驱动程序 B 中使用它。

如果我记得很清楚的话,V4L2 框架中有类似的东西可以找到 I2C 设备。

【讨论】:

  • 如果是设备树或基于 ACPI 的平台,则无需这样做,您可以在表中提供此类依赖项。更难的情况是运行时依赖。我不确定启动者到底想做什么。
  • 当然可以,但如果是这种情况,我希望他知道它已经在设备树中完成了 :) 但我认为情况并非如此,因为他使用的是内核 3.3(设备树是静态的),他说他稍后注册设备。
  • 费德里科是正确的。不幸的是,我被 3.3 和静态树“卡住”了。我通过在驱动程序 A 中创建自己的 a_get 和 a_put 函数解决了这个问题,类似于 clk_get 或 clk_put 之类的函数,但用于 struct device。谢谢
猜你喜欢
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
相关资源
最近更新 更多