如何从内核内部访问驱动程序信息?

时间:2018-11-14 16:37:09

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

我在big.LITTLE板上使用CPU管理,而我正在开发的板上有一些ina231功率传感器。我相信这是由ina2xx_driver处理的(这对我来说很有意义)。我对驱动程序的知识仍在开发中,因此我不确定如何从驱动程序/设备中获取我的CPU模块所需的信息,而这不会让Linux众神怒。

该板有4个传感器,我相信它们会存储在链接列表struct i2c_driver的{​​{1}}中。如果我正确理解了这一点,那么我最初的想法是将指针导出到驱动程序中

struct list_head clients

进入我的模块,然后可以逐步浏览i2c客户端的链接列表,使我可以通过执行以下操作来访问各个设备信息

   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);

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

内核中是否有一种更标准化的方法来获取设备驱动程序或设备指针以访问信息,或者获取设备信息而不从文件中读取信息?

我希望我的问题有意义并且谢谢。

1 个答案:

答案 0 :(得分:1)

最有可能从DeviceTree实例化板上的ina231传感器。如果真是这样,并且您的驱动程序也已从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实现。

请注意,由于您打算使用驱动程序私有内部数据,所以这都不是一件好事。