工业 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
¶
读/写正整数属性,指定要等待的最大扫描元素数量。
轮询将阻塞,直到达到水位线。
阻塞读取将等待,直到请求的读取量或低水位线之间的最小值可用。
非阻塞读取将从缓冲区检索可用样本,即使样本少于水位线级别。这允许应用程序使用超时阻塞轮询,并在超时过期后读取可用样本,从而具有最大延迟保证。
可用数据¶
只读属性,指示缓冲区中可用的数据字节数。在输出缓冲区的情况下,这指示可用于写入数据的空闲空间量。在输入缓冲区的情况下,这指示可用于读取的数据量。
扫描元素¶
与放置在缓冲区中的通道数据关联的元信息称为扫描元素。扫描元素属性如下所示。
_en
用于启用通道的读/写属性。当且仅当其值为非零时,触发的捕获将包含此通道的数据样本。
_index
只读无符号整数属性,指定通道在缓冲区中的位置。请注意,这些不依赖于启用了什么,并且可能不是连续的。因此,为了使用户空间建立完整的布局,必须将这些与所有 _en 属性结合使用,以确定存在哪些通道,并使用相关的 _type 属性来确定数据存储格式。
_type
只读属性,包含缓冲区中扫描元素数据存储的描述,以及从用户空间读取数据的形式。格式为 [be|le]:[s|u]bits/storagebits[Xrepeat][>>shift],其中
be 或 le 指定大端或小端。
s 或 u 指定有符号(2 的补码)或无符号。
bits 是有效数据位的数量。
storagebits 是它在缓冲区中占用的位数(填充后)。
repeat 指定 bits/storagebits 重复的次数。当重复元素为 0 或 1 时,将省略重复值。
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
+-----+---+---+---+---+---+---+-----+
通常,缓冲数据以原始格式(未缩放,未应用偏移)找到,但是,在某些特殊情况下,可能会以已处理的形式找到缓冲数据。请注意,本文档未解决这些特殊情况。
有关属性的完整描述,请参阅 Documentation/ABI/testing/sysfs-bus-iio
。