2016-08-03 77 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只允許文件所有者,這是根寫)