示例:我使用传感器TMP421,其驱动程序是linux / drivers / hwmon / tmp421.c。它将导出到/ sys / class / hwmon / hwon0 / ....用户可以使用cat
命令读取温度。但我的要求是:我希望在内核空间读取它以控制温度达到MAX值时的某些事情(例如)。
所以我如何附加以获取设备上下文来使用函数
tmp421_data *tmp421_update_device(struct device *dev)
读取温度?
还是有另一种方式吗? 我不想在我的代码中使用cat命令。
由于
答案 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_open
和sys_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
。