【问题标题】:sysfs_create_group(): Where to call?sysfs_create_group():在哪里调用?
【发布时间】:2016-10-16 17:44:41
【问题描述】:

目前我编写了一个驱动模块,它在 sysfs 中提供了一些条目。我通过驱动程序源代码树和互联网阅读了很多内容。我发现了两个调用 sysfs_create_group() 的方法:

a) 最常见:在 Driver 的 probe() 函数中。喜欢这里的建议 How to attach file operations to sysfs attribute in platform driver?

我看到的随机事物: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/rtc/rtc-ds1307.c#n1580

b) 在驱动程序结构中。 http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/

我知道,Greg KH 是一位非常知名的开发人员。所以我试着听从他的建议。在 bla_show()/bla_store() 函数中,我试图获取我的驱动程序私有数据,但我的 printk() 显示的地址与我在 probe() 函数中打印的地址大不相同。我的私人数据是(空)。这是错误的。

当我使用 approch a) 时,它按预期工作,但正如 Greg KH 所暗示的那样,它也是错误的。我在不同驱动程序的稳定树中看到了很多。 Greg 写道,用户空间已经收到通知说有一个新设备,但是 LDD3 书指出,探测功能在那里确定设备是否存在。

总结一下我的问题:

  1. 为什么要通知用户空间,即使内核不知道它是否可以处理它?
  2. 调用 sysfs_create_group() 的正确位置在哪里?是 a) 还是 b)?

LDD3:https://static.lwn.net/images/pdf/LDD3/ch14.pdf PDF 第 24 页

probe 是一个调用来查询特定设备是否存在的函数 (以及此驱动程序是否可以使用它),当 设备从系统中删除,并在关机时调用关机 是时候让设备静默了。

我比以前更糊涂了.....

最好的问候 乔治

【问题讨论】:

    标签: linux linux-device-driver sysfs


    【解决方案1】:

    设备驱动程序是控制连接到您计算机的特定类型设备的程序。

    平台设备本质上是不可发现的,即硬件不能说“嘿!我在场!”到软件。因此,对于这类设备,我们需要一个称为平台驱动程序的驱动程序。驱动提供probe()和remove()方法。

     struct platform_driver {
       int (*probe)(struct platform_device *);
       int (*remove)(struct platform_device *);
       .
       .
       struct device_driver driver;// this file has 2 parameter name or    owner.
     };
    

    probe() 通常应验证指定的设备硬件 实际存在。首先我们注册我们的驱动程序。一旦找到设备,它就会调用驱动程序探测。它使用名称来搜索设备。


    Ans:您的设备可用,然后您需要 sysfs 条目进行通信(到用户空间)。所以从概念上讲,您需要在探针中定义您的 sysfs 条目。

    sys_notify 函数在你的属性上,它会导致你的用户空间代码被唤醒。当 sysfs 可用于用户空间时,它将触发。它只是避免阻塞调用。当内核没有 sysfs 时,它不会通知用户空间。

    sysfs是Linux内核提供的一个虚拟文件系统,它通过虚拟文件将内核的设备模型中各种内核子系统、硬件设备以及相关设备驱动的信息导出到用户空间。当您的设备可用时,您需要此条目来导出您的信息。

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 2015-08-11
      • 2019-11-06
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2013-11-01
      • 2013-11-20
      相关资源
      最近更新 更多