如何在Linux上的另一个驱动程序中附加到设备上下文

时间:2014-03-06 06:53:30

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

示例:我使用传感器TMP421,其驱动程序是linux / drivers / hwmon / tmp421.c。它将导出到/ sys / class / hwmon / hwon0 / ....用户可以使用cat命令读取温度。但我的要求是:我希望在内核空间读取它以控制温度达到MAX值时的某些事情(例如)。

所以我如何附加以获取设备上下文来使用函数

tmp421_data *tmp421_update_device(struct device *dev)

读取温度?

还是有另一种方式吗? 我不想在我的代码中使用cat命令。

由于

2 个答案:

答案 0 :(得分:1)

只需bus_find_device_by_name i2c_bus_type。它应该相对容易地给你正确的设备指针。您还必须将tmp421_update_device函数从“static”更改为“exported”(并将tmp421_data结构移动到外部标题)。

如果您不想更改不属于您自己的驱动程序,您仍可以尝试模拟sysfs在访问设备信息时所采用的方法。您可以在dev-> kobj.sd字段访问sysfs dirent,它是一个相当简单的数据结构。

重要的是,你需要在收到的设备句柄上调用put_device()(否则你会因为“不可释放的”对象而最终导致内核锁定)。如果您正在使用kobj.sd访问者,则还需要sysfs_get()/ sysfs_put()。

答案 1 :(得分:0)

正如https://stackoverflow.com/a/4407051/196561中所述(“如何在内核模块中使用sysfs?”)shodanex

  

这是一个坏主意(tm)

链接http://www.linuxjournal.com/article/8110

  

推动我坚果 - 你永远不应该在内核中做的事情 - 来自问题#133 Linux Journal,2005作者:Greg Kroah-Hartman

文章says that it is possible使用模块中的sys_opensys_read来打开和阅读文件:

old_fs = get_fs();
set_fs(KERNEL_DS);

fd = sys_open(filename, O_RDONLY, 0);
if (fd >= 0) {
  /* read the file here */
  sys_close(fd);
}
set_fs(old_fs);

不知道它是否适用于/sys中的文件。

格雷格警告我们:

  

我从来没有告诉过你。   总之,从内核中读取和写入文件是一件糟糕的事情。永远不要这样做。如初。

更好的方法是学习inter module communications,可能需要修改hwmon/tmp421.c