【问题标题】:How to access driver information from within the kernel?如何从内核中访问驱动程序信息?
【发布时间】:2019-04-17 16:43:13
【问题描述】:

我在 big.LITTLE 板上进行 cpu 管理,我正在开发的板上有一些 ina231 功率传感器。我相信这是由 ina2xx_driver 处理的(这对我来说很有意义)。我对驱动程序的了解仍在开发中,所以我不确定应该如何从驱动程序/设备中获取我的 CPU 模块所需的信息,以一种不会让 Linux 之神生气的方式。

该板有 4 个传感器,我相信这些传感器随后存储在链表 struct list_head clients 中的 struct i2c_driver 中。如果我理解正确的话,那么我最初的想法是导出一个指向驱动程序的指针

   static struct i2c_driver ina2xx_driver = { 
       .driver = { 
           .name   = "ina2xx",
       },  
       .probe      = ina2xx_probe,
       .remove     = ina2xx_remove,
       .id_table   = ina2xx_id,
   };

   +struct i2c_driver *ina2xx_driver_p = &ina2xx_driver;

   +EXPORT_SYMBOL(ina2xx_driver_p);

到我的模块,然后可以单步执行 i2c 客户端的链接列表,允许我通过执行类似操作来访问单个设备信息

struct i2c_client *tmp
struct list_head *pos;
struct list_head *clients_head = &ina2xx_driver_p->clients; 

list_for_each(pos, clients_head){
    tmp = list_entry(pos, struct i2c_client, detected)
    struct ina2xx_data *data = ina2xx_update_device(tmp.dev);
    ina2xx_get_value(data, $(attribute));
}

我实际上并没有尝试过,这就是我在阅读头文件后想象的一种解决方案。鉴于我对推荐的做法缺乏了解,我认为最好在浪费一两天时间尝试实施注定要失败的事情之前问清楚。

是否有更标准化的方式在内核中用于获取设备驱动程序或设备指针以访问信息或获取设备信息而不从文件中读取信息的方式?

希望我的问题有意义,谢谢。

【问题讨论】:

  • 在设备树中搜索,如何在那里添加设备。您正在尝试做的事情是完全错误的。
  • @0andriy 但我不需要添加设备。只需从现有和初始化的设备访问设备信息
  • 如果您需要什么样的信息?
  • @0andriy 在客户端数据 (client->dev->p->driver_data) 中存储设备的寄存器,在调用 ina2xx_update_device 时更新。我需要访问这些私人数据。
  • 为什么需要它们?

标签: c linux-kernel linux-device-driver kernel-module device-driver


【解决方案1】:

您板上的ina231 传感器很可能是从DeviceTree 实例化的。如果是这种情况,并且您的驱动程序也是从 DT 实例化的,那么将一个 phandle 存储到 ina231 传感器作为您的 DT 节点中的属性是很自然的。然后你可以用of_find_node_by_phandle()得到一个struct device_node,然后用of_find_i2c_device_by_node把它变成struct i2c_client

另一种方法是使用bus_find_device()&i2c_bus_type 作为第一个参数,并使用您的自定义match function。请参阅 of_find_i2c_device_by_node 实现作为示例,了解如何使用它。

请注意,这些都不是很好,因为您计划使用驱动程序私有内部数据,这本身并不是一个好的做法。

【讨论】:

  • 在阅读本文之前与一位同事进行了交谈,他的建议完全相同。谢谢!!
猜你喜欢
  • 2013-01-17
  • 2011-03-24
  • 2014-09-19
  • 2015-07-08
  • 2015-11-14
  • 2012-04-11
  • 2016-06-10
  • 2023-01-08
  • 1970-01-01
相关资源
最近更新 更多