【问题标题】:How to attach to device context in another driver at Linux如何在 Linux 的另一个驱动程序中附加到设备上下文
【发布时间】:2014-03-06 06:53:29
【问题描述】:

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

那么我如何附加以获取设备上下文以使用该功能

tmp421_data *tmp421_update_device(struct device *dev)

读取温度?

或者还有其他方法吗? 我不想在我的代码中使用 cat 命令。

谢谢

【问题讨论】:

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


    【解决方案1】:

    只需在i2c_bus_type 上执行bus_find_device_by_name。它应该相对容易地为您提供正确的设备指针。您还必须将 tmp421_update_device 函数从“静态”更改为“导出”(并将 tmp421_data 结构移动到外部标头)。

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

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

    【讨论】:

    • 非常感谢。我仍然找不到这种情况的最佳方法。因为我不想更改 tmp421 驱动程序。所以我尝试使用在用户空间运行的 shell 脚本,然后它会通过 cat 命令从 tmp421 和另一个传感器读取温度。然后将值回显给我们的驱动程序来控制一些事情。
    • 用户空间助手是一种可接受的方式来做这些事情。根据您的应用程序,您可能还会发现 uio 框架很有用:kernel.org/doc/htmldocs/uio-howto(这将允许您将驱动程序的主要部分放在用户空间中,并具有所有明显的好处)。
    【解决方案2】:

    正如shodanexhttps://stackoverflow.com/a/4407051/196561(“如何在内核模块中使用 sysfs?”)中所说的那样

    这是一个坏主意(tm)

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

    让我发疯 - 你永远不应该在内核中做的事情 - 来自第 133 期 Linux 期刊,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

    【讨论】:

    • 这不是问题的真正答案,是吗? OP 宁愿自己不使用 sysfs。
    • 模块间通信是个好方法。但是我尝试将所有内容移至用户空间,首先这样做更容易。真的要感谢大家。
    猜你喜欢
    • 1970-01-01
    • 2015-07-17
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多