工業IIO裝置緩衝區

1. 概述

工業I/O核心提供了一種基於觸發源的連續資料捕獲方式。可以從/dev/iio:deviceX字元裝置節點一次性讀取多個數據通道,從而降低CPU負載。

支援緩衝區的裝置在/sys/bus/iio/devices/iio:deviceX/目錄層次結構中有一個額外的子目錄,名為bufferY,對於單個緩衝區的裝置,Y預設為0。

2. 緩衝區屬性

IIO緩衝區在/sys/bus/iio/iio:deviceX/bufferY/下有一個關聯的屬性目錄。屬性描述如下。

length

讀/寫屬性,表示緩衝區可儲存的資料樣本總數(容量)。

enable

讀/寫屬性,用於啟動/停止緩衝區捕獲。此檔案應在設定長度和選擇掃描元素後最後寫入。如果例如給定不支援的通道組合,寫入非零值可能導致錯誤,例如EINVAL。

watermark

讀/寫正整數屬性,指定等待的最大掃描元素數量。

Poll將阻塞直到達到watermark。

阻塞讀將等待直到請求的讀取量或低watermark中的最小值可用。

非阻塞讀將從緩衝區檢索可用樣本,即使樣本數量少於watermark水平。這允許應用程式在poll操作時設定超時並阻塞,然後在超時過期後讀取可用樣本,從而獲得最大延遲保證。

可用資料

只讀屬性,指示緩衝區中可用資料的位元組數。對於輸出緩衝區,這表示可用於寫入資料的空閒空間量。對於輸入緩衝區,這表示可供讀取的資料量。

掃描元素

與放置在緩衝區中的通道資料相關的元資訊稱為掃描元素。掃描元素屬性如下所示。

_en

讀/寫屬性,用於啟用通道。當且僅當其值為非零時,觸發的捕獲才會包含該通道的資料樣本。

_index

只讀無符號整數屬性,指定通道在緩衝區中的位置。請注意,這些不依賴於啟用的通道,並且可能不連續。因此,使用者空間必須結合所有_en屬性來確定哪些通道存在,並結合相關的_type屬性來確定資料儲存格式,以建立完整的佈局。

_type

只讀屬性,包含掃描元素資料在緩衝區內的儲存描述,因此也指示了從使用者空間讀取時的格式。格式為 [be|le]:[s|u]bits/storagebits[Xrepeat][>>shift],其中

  • bele 指定大端或小端。

  • su 指定有符號(二進位制補碼)或無符號。

  • bits 是有效資料位的數量。

  • storagebits 是它在緩衝區中佔用的位數(填充後)。

  • repeat 指定 bits/storagebits 的重複次數。當repeat元素為0或1時,repeat值被省略。

  • shift 如果指定,是在遮蔽掉未使用位之前需要應用的移位。

例如,一個12位解析度的三軸加速度計驅動,其資料儲存在兩個8位暫存器中,如下所示

  7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+
|D3 |D2 |D1 |D0 | X | X | X | X | (LOW byte, address 0x06)
+---+---+---+---+---+---+---+---+

  7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+
|D11|D10|D9 |D8 |D7 |D6 |D5 |D4 | (HIGH byte, address 0x07)
+---+---+---+---+---+---+---+---+

每個軸將具有以下掃描元素型別

$ cat /sys/bus/iio/devices/iio:device0/buffer0/in_accel_y_type
le:s12/16>>4

使用者空間應用程式將把從緩衝區讀取的資料樣本解釋為兩位元組的小端有符號資料,在遮蔽掉12個有效資料位之前需要向右移位4位。

值得一提的是,緩衝區中的資料將自然對齊,因此使用者空間應用程式必須相應地處理緩衝區。

例如,一個具有四個通道的驅動程式,描述如下: - channel0: index: 0, type: be:u16/16>>0 - channel1: index: 1, type: be:u32/32>>0 - channel2: index: 2, type: be:u32/32>>0 - channel3: index: 3, type: be:u64/64>>0

如果所有通道都啟用,資料將在緩衝區中按如下方式對齊

  0-1   2   3   4-7  8-11  12  13  14  15  16-23   -> buffer byte number
+-----+---+---+-----+-----+---+---+---+---+-----+
|CHN_0|PAD|PAD|CHN_1|CHN_2|PAD|PAD|PAD|PAD|CHN_3|  -> buffer content
+-----+---+---+-----+-----+---+---+---+---+-----+

如果只啟用channel0和channel3,資料將在緩衝區中按如下方式對齊

  0-1   2   3   4   5   6   7  8-15    -> buffer byte number
+-----+---+---+---+---+---+---+-----+
|CHN_0|PAD|PAD|PAD|PAD|PAD|PAD|CHN_3|  -> buffer content
+-----+---+---+---+---+---+---+-----+

通常,緩衝資料以原始格式(未縮放,未應用偏移)存在,但在某些特殊情況下,緩衝資料可能以處理後的形式存在。請注意,本文件不涉及這些特殊情況。

有關屬性的完整描述,請參閱ABI檔案測試/sysfs-bus-iio