如何从内核中访问驱动程序信息?
How to access driver information from within the kernel?
我在 big.LITTLE 板上与 cpu 管理层一起工作,我正在开发的板上有一些 ina231 功率传感器。我相信这是由 ina2xx_driver 处理的(这对我来说很有意义)。我对驱动程序的了解仍在发展中,所以我不确定我应该如何从 driver/devices 中获取我的 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));
}
我还没有真正尝试过这个,这只是我在阅读头文件后想象的一种解决方案。鉴于我对推荐的做法缺乏了解,我认为最好在浪费一两天时间尝试实施注定要失败的事情之前先询问一下。
内核中是否有更标准化的方法来获取设备驱动程序或设备指针以访问信息或获取设备信息而不从文件中读取的方法?
希望我的问题有道理,谢谢。
您电路板上的 ina231 传感器很可能是从 DeviceTree 实例化的。如果是这种情况,并且您的驱动程序也是从 DT 实例化的,那么在您的 DT 节点中将 phandle 作为 属性 存储到 ina231 传感器是很自然的。然后你可以用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
实施作为示例,了解如何使用它。
请注意,其中的 none 会很好,因为您计划使用驱动程序私有内部数据,这本身并不是一个好的做法。
我在 big.LITTLE 板上与 cpu 管理层一起工作,我正在开发的板上有一些 ina231 功率传感器。我相信这是由 ina2xx_driver 处理的(这对我来说很有意义)。我对驱动程序的了解仍在发展中,所以我不确定我应该如何从 driver/devices 中获取我的 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));
}
我还没有真正尝试过这个,这只是我在阅读头文件后想象的一种解决方案。鉴于我对推荐的做法缺乏了解,我认为最好在浪费一两天时间尝试实施注定要失败的事情之前先询问一下。
内核中是否有更标准化的方法来获取设备驱动程序或设备指针以访问信息或获取设备信息而不从文件中读取的方法?
希望我的问题有道理,谢谢。
您电路板上的 ina231 传感器很可能是从 DeviceTree 实例化的。如果是这种情况,并且您的驱动程序也是从 DT 实例化的,那么在您的 DT 节点中将 phandle 作为 属性 存储到 ina231 传感器是很自然的。然后你可以用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
实施作为示例,了解如何使用它。
请注意,其中的 none 会很好,因为您计划使用驱动程序私有内部数据,这本身并不是一个好的做法。