События Linux Kernel IIO только для чтения файлов sysfs

У меня проблема в том, что я зарегистрировал события 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),
  }
};

2 ответа

Решение

обнаружение: это работает, когда я меняю права доступа in_temp_thresh_rising_value подать в 666 с помощью sudo, Но почему он не создан с этими разрешениями через подсистему IIO?

Это обычная практика для файлов sysfs, так как запись в эти файлы может изменить поведение системы и даже поставить под угрозу или сломать систему. Поэтому, если вы хотите записать в эти файлы, вы должны сделать это из root, или добавить своего пользователя в соответствующую группу, или изменить этот режим файла (по правилу udev или вручную).

Вот как это делается в коде IIO:

  • Имена узлов sysfs IIO получены из следующих таблиц в drivers / iio / industrialio-event.c: iio_ev_type_text,iio_ev_dir_textа такжеiio_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разрешает чтение для U ser, G roup и O thers)
    • для записи: dev_attr->attr.mode |= S_IWUSR;

      • так что это может быть написано только root (потому что S_IWUSR позволяет писать только для владельца файла, который является root)

Другим решением этой проблемы является использование комбинации сетевого и локального контекстов libiio. В этом случае демон libiio будет запущен с соответствующими правами для записи в файлы sysfs, а пользовательское приложение затем подключится к этому демону с использованием сетевого контекста libiio.

Другие вопросы по тегам