Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在Linux上连接到另一个驱动程序中的设备上下文_C_Linux Kernel_Linux Device Driver - Fatal编程技术网

C 如何在Linux上连接到另一个驱动程序中的设备上下文

C 如何在Linux上连接到另一个驱动程序中的设备上下文,c,linux-kernel,linux-device-driver,C,Linux Kernel,Linux Device Driver,示例:我使用传感器TMP421,它的驱动程序是linux/drivers/hwmon/TMP421.c。它将导出到/sys/class/hwmon/hwon0/。。。。用户可以使用cat命令读取温度。但我的要求是:我想在内核空间读取它,以便在温度达到最大值时控制某些事情(例如) 因此,我如何连接以获取设备上下文以使用该函数 tmp421_data *tmp421_update_device(struct device *dev) 读取温度 还是有别的办法? 我不想在我的代码中使用cat命令 感

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

因此,我如何连接以获取设备上下文以使用该函数

tmp421_data *tmp421_update_device(struct device *dev)
读取温度

还是有别的办法? 我不想在我的代码中使用cat命令

感谢

如在中所述(“如何在内核模块内使用sysfs?”),作者

这是个坏主意(tm)

带链接

让我发疯-在内核中你永远不应该做的事情-摘自Greg Kroah Hartman 2005年出版的#133 Linux Journal

使用模块中的
sys\u open
sys\u 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
中的文件

格雷格警告我们:

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


更好的方法可能是学习,可能是修改
hwmon/tmp421.c

只要在
i2c\u总线类型上执行
bus\u find\u device\u by\u name
。它应该相对容易地为您提供正确的设备指针。您还必须将
tmp421\u update\u device
功能从“静态”更改为“导出”(并将tmp421\u数据结构移动到外部标头)

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


关键的是,您需要在接收到的设备句柄上调用
put_device()
(否则,由于“不可释放”的对象,最终会导致内核锁定)。如果您使用的是
kobj.sd
访问器,那么还需要在其上加上sysfs_get()/sysfs_put()。

这不是问题的真正答案,是吗?OP不希望自己使用sysfs。模块间通信是一种好方法。但我尝试将所有内容移动到用户空间,首先这样做更容易。非常感谢你们,非常感谢。我仍然找不到解决这个问题的最好办法。因为我不想改变tmp421驱动程序。因此,我尝试使用在用户空间运行的shell脚本,然后它将通过cat命令从tmp421和另一个传感器读取温度。然后将值回传给我们的驱动程序来控制一些事情。用户空间助手是一种可以接受的方式来做这些事情。根据您的应用程序,您可能还会发现uio框架很有用:(这将允许您将驱动程序的主要部分放在用户空间中,并提供所有明显的好处)。