工业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