我在理解如何正确使用sysfs_notify_dirent()时遇到了一些问题。基本上,我正在编写一个设备驱动程序,并且我需要该驱动程序导出的一个sysfs属性能够从用户空间“轮询”。根据我的理解,因为我知道什么时候可以从设备的ISR (这是一个原子上下文)中获得新数据,所以我必须使用sysfs_notify_dirent()而不是sysfs_notify()。然而,我正在努力寻找关于这个主题的任何文档或示例。请谁给我举一个例子,说明如何正确使用sysfs_notify_dirent()或一些有用的文档。
提前谢谢。
发布于 2021-02-03 04:13:33
我一直在努力解决同样的问题。我成功地使用了sysfs_notify(),但需要将其更改为sysfs_notify_dirent(),以便能够在hrtimer回调中使用它。我能够弄明白它,所以我想分享它。
问题是sysfs_notify_dirent()需要与您想要通知更改的sysfs属性相对应的kernfs_node。使用sysfs_notify()时,您需要传递设备kobj、子目录名称(如果没有子目录,则为NULL )和属性名称。问题是:如何找到属性的kernfs_node?
struct kobject有一个成员struct kernfs_node *sd,它是指向对应于kobj目录路径的kernfs_node的指针。
因此,从device kobject中,您已经拥有了sysfs设备根目录的kernfs_node。使用它,您需要使用函数sysfs_get_dirent()获取属性的kernfs_node,您需要将kernfs_node和您想要其kernfs_node的属性或子目录的名称传递到该函数。
让我们来看一个小例子。假设您的设备kobject指针是mykobj,它的名称是"mydevice",并且您有一个名为"mysubdir"的子目录和一个属性"myattr"。下面是获取子目录的kernfs_node和属性的方法:
/* This is our main kernfs_node */
struct kernfs_node *mydevice_kn = mykobj->sd;
/* This is our subdirectory kernfs_node */
/* We get the mydevice_kn child node thats named "mysubdir" */
struct kernfs_node *mysubdir_kn = sysfs_get_dirent(mydevice_kn, "mysubdir");
/* This is our attribute kernfs_node */
/* We get the mysubdir_kn child node thats named "myattr" */
struct kernfs_node *myattr_kn = sysfs_get_dirent(mysubdir_kn, "myattr");一旦获得了所需属性的kernfs_node,就可以将其传递给sysfs_notify_dirent()函数。如果没有子目录,那么只需直接搜索属性的节点即可。
https://stackoverflow.com/questions/59411944
复制相似问题