2016-08-03 51 views
1

我有问题,我注册IIO事件的上升和下降阈值。 我可以在事件子文件夹中看到sysfs文件并可以读取它们,但是当我尝试写入新阈值时,它会显示“权限被拒绝”。Linux Kernel IIO事件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), 
    } 
}; 
+0

发现:当我改变了in_temp_thresh_rising_value文件的权限,它的工作原理通过sudo 666。但为什么它不是通过IIO子系统创建的这种权限? – lobi

回答

3

发现:当我通过sudo改变in_temp_thresh_rising_value文件的权限666它的工作原理。但为什么它不是通过IIO子系统创建的这种权限?

这是sysfs文件的常见做法,因为写入这些文件可能会改变系统的行为,甚至损害或破坏系统。所以如果你想写这些文件,你应该从根目录开始,或者将你的用户添加到相应的组中,或者改变该文件模式(通过udev规则或手动)。

这里是它是如何在IIO代码完成:

  • IIO SYSFS节点名称是从未来的表导出drivers/iio/industrialio-event.ciio_ev_type_textiio_ev_dir_textiio_ev_info_text
  • 节点创建路径是未来:iio_device_add_event() - >__iio_add_chan_devattr() - >对于sysfs的节点__iio_device_attr_init()
  • 文件模式被设置在__iio_device_attr_init()

    • 用于读取:dev_attr->attr.mode |= S_IRUGO;

      • 所以每一个用户可以读取节点(因为S_IRUGO允许ř eading为ü丝氨酸,ģ roup和ö thers)
    • 写作:dev_attr->attr.mode |= S_IWUSR;

      • 所以它只能由root写入(因为S_IWUSR只允许文件所有者,这是根写)