C 如何在Linux上连接到另一个驱动程序中的设备上下文
示例:我使用传感器TMP421,它的驱动程序是linux/drivers/hwmon/TMP421.c。它将导出到/sys/class/hwmon/hwon0/。。。。用户可以使用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命令 感
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框架很有用:(这将允许您将驱动程序的主要部分放在用户空间中,并提供所有明显的好处)。