2016-08-03 6 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 файла до 666 через sudo. Но почему он не создан с этими разрешениями через подсистему IIO? – lobi

ответ

3

находкой: он работает, когда я изменить права доступа к файлу in_temp_thresh_rising_value к 666 через sudo. Но почему он не создан с этими разрешениями через подсистему IIO?

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

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

  • IIO sysfs имена узлов выводятся из следующих таблиц в 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 позволяет R eading для U сер, G Роап и О Про ч ее)
    • для записи: dev_attr->attr.mode |= S_IWUSR;

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