События 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)
- так что это может быть написано только root (потому что
Другим решением этой проблемы является использование комбинации сетевого и локального контекстов libiio. В этом случае демон libiio будет запущен с соответствующими правами для записи в файлы sysfs, а пользовательское приложение затем подключится к этому демону с использованием сетевого контекста libiio.