1

我有一个问题,我为上升和下降阈值注册了 IIO 事件。我可以在 events 子文件夹中看到 sysfs 文件并可以读取它们,但是当我尝试编写新阈值时,它显示“权限被拒绝”。

以下设置:

static const struct iio_event_spec as6200_events[] = {
  {
    .type = IIO_EV_TYPE_THRESH,
    .dir = IIO_EV_DIR_RISING,
    .mask_separate = BIT(IIO_EV_INFO_VALUE),
  }, {
    .type = IIO_EV_TYPE_THRESH,
    .dir = IIO_EV_DIR_FALLING,
    .mask_separate = BIT(IIO_EV_INFO_VALUE),
  }
};

static const struct iio_chan_spec as6200_channels[] = {
  {
    .type = IIO_TEMP,
    .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
      BIT(IIO_CHAN_INFO_PROCESSED) |
      BIT(IIO_CHAN_INFO_SCALE),
    .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ),
    .event_spec = as6200_events,
    .num_event_specs = ARRAY_SIZE(as6200_events),
  }
};
4

2 回答 2

3

发现:当我将in_temp_thresh_rising_value文件的权限更改为666via时,它可以工作sudo。但是为什么不通过 IIO 子系统使用此权限创建它呢?

这是 sysfs 文件的常见做法,因为写入这些文件会改变系统的行为,甚至危及或破坏系统。因此,如果您想写入这些文件,您应该从 root 执行此操作,或者将您的用户添加到相应的组,或者更改该文件模式(通过 udev 规则或手动)。

以下是它在 IIO 代码中的实现方式:

  • IIO sysfs 节点名称来自drivers/iio/industrialio-event.c中的下一个表:iio_ev_type_textiio_ev_dir_textiio_ev_info_text
  • 接下来是节点创建路径:iio_device_add_event()-> __iio_add_chan_devattr()->__iio_device_attr_init()
  • sysfs 节点的文件模式在__iio_device_attr_init()中设置:

    • 阅读:dev_attr->attr.mode |= S_IRUGO;

      • 所以每个用户都可以读取节点(因为允许用户S_IRUGO其他读取
    • 写作:dev_attr->attr.mode |= S_IWUSR;

      • 所以它只能由root写入(因为S_IWUSR只允许为文件所有者写入,即root)
于 2016-08-03T15:51:29.660 回答
0

这个问题的另一个解决方案是结合使用 libiio 的网络和本地上下文。在这种情况下,一个 libiio 守护程序将以适当的权限启动以写入 sysfs 文件,然后用户应用程序将使用 libiio 网络上下文与该守护程序连接。

于 2018-07-12T09:36:44.500 回答