本文目录导读:

截至我的知识库更新时间(2025年5月),IIO格式规范(IIO Format Specification)并非一个广泛普及或工业标准化的通用术语,它最常出现在以下几个特定领域的上下文或特定项目中:
- Linux内核的IIO子系统(Industrial I/O,工业输入/输出):这是最常见的可能性。
- 某些专有硬件或内部项目的接口定义:如特定传感器的数据格式或记录格式。
我将重点介绍最可能的情况(Linux IIO子系统)下的格式规范含义,并简要说明其他可能性。
最可能的背景:Linux 内核的 Industrial I/O (IIO) 子系统
在 Linux 内核中,IIO 是一个用于模数转换器(ADC)、加速度计、陀螺仪、磁力计、光照传感器、压力传感器等各种数模/模数转换设备的统一框架。
IIO 格式规范在这里通常指用户空间(Userspace)通过 sysfs 或字符设备读取数据时,数据的排列与表示方式,这并不是一个独立的文档名称,而是嵌入式系统开发中需要理解的关键概念。
核心格式定义(主要体现在 scan_element 和 buffer 中)
当通过 IIO 的触发缓冲区(triggered buffer)读取数据时,数据是按 struct iio_scan_type 结构体定义的格式打包的。
关键属性(通过 sysfs 的 scan_elements 目录查看):
- 类型 (type):
- 通常是
le:s16/16>>0这样的字符串。 le:字节序,小端序(Little Endian)。s:有符号整数(Signed)。u表示无符号。16:真实数据位宽(Realbits),一个12位的ADC,其真实位宽是12,但为了对齐,实际存储可能用16位。- 后的
16:存储位宽(Storagebits),数据在缓冲区中占用的总位数。 >>后的数字:移位量(Shift)。>>0表示不移位。X:有时会出现,表示数据是经过2的补码或特定缩放。
- 通常是
- 缩放 (scale):
- 通过
/sys/bus/iio/devices/iio:deviceX/in_voltage_scale等文件查看。 001,表示原始的ADC数值乘以这个系数才能得到真实的物理量(如毫伏mV)。
- 通过
- 偏移 (offset):
- 通过
in_voltage_offset等文件查看。 - 通常用于修正零点漂移,公式为:
真实值 = (原始值 + 偏移) * 缩放。
- 通过
数据包格式(多通道读取时)
如果你同时读取加速度计的X、Y、Z轴,缓冲区中数据包的典型结构是:
- 时间戳(Timestamp):通常以
le:s64/64>>0格式存在,位于数据包末尾或开头。 - 通道数据:按 sysfs 中
scan_elements定义的顺序排列。- 通道X:对齐的存储位宽(如16位)。
- 填充字节(Padding):如果当前通道结束位置和下一个通道起始位置不对齐(如8位、32位边界),插入填充。
- 通道Y:
- 通道Z:
格式解析示例:
假设你读取一个3轴加速度计,每个轴12位,存储为16位有符号小端整数,同时读取时间戳(64位)。 那么一个数据包(buffer element)的字节布局是:
| 字节0-1 (X轴, le16) | 字节2-3 (Y轴, le16) | 字节4-5 (Z轴, le16) | 字节6-7 (填充,为了对齐64位) | 字节8-15 (时间戳, le64) |
注意:实际填充取决于驱动实现和 scan_element 中的 storagebits,如果所有通道都是16位,时间戳是64位,那么可能没有填充,时间戳直接接在Z轴后面。
完整的数据流链路
传感器 (硬件) --> 驱动 (内核空间) --(触发缓冲区)--> 字符设备 (/dev/iio:deviceX)
|
+-----> sysfs 接口 (格式描述:type, scale, offset)
用户程序需要做的事情:
- 查询 sysfs:读取所有
scan_elements下的in_*_type、scale、offset等文件,知道每个通道的位宽、字节序、有符号性、缩放系数。 - 打开字符设备:打开
/dev/iio:deviceX。 - 使能通道:向
scan_elements/下的in_*_en写1。 - 设置缓冲区大小:向
buffer/length写入缓冲区大小(数据点数量)。 - 启用缓冲区:向
/sys/bus/iio/devices/iio:deviceX/buffer/enable写1。 - 读取数据:从字符设备读取原始二进制数据包。
- 解析:根据第一步的格式,提取每个通道的原始值,然后应用
(scale * raw_value) + offset得到物理量。
如何找到特定设备的格式规范?
这不是一个单一的PDF文档,你需要查看:
- 设备树(Device Tree):对于嵌入式设备,描述硬件连接。
- 内核驱动代码:在
drivers/iio/目录下,具体的传感器驱动会定义其iio_chan_spec结构体,其中写明了scan_type。 - 用户空间工具:
libiio库提供的代码或工具(如iio_readdev)可以直接解析这些格式。
其他可能性
A. 特定传感器或数据采集模块的私有协议
某些公司或开源硬件项目会定义自己的 IIO 数据格式规范(作为文档名称),用于描述如何通过 SPI/I2C 等接口与传感器通信并格式化数据。
- 格式可能是:
IIO_Data_TLV(Type-Length-Value) 或IIO_Compact_Stream。 - 内容通常包括: 数据包结构、帧头、通道ID、时间戳格式、校验和、缩放因子编码方式等。
- 应用场景: 高精度实时数据采集系统、特定FPGA固件配合的传感器直接内存访问(DMA)接口。
B. 应用程序内部的数据交换格式
开发者在进程间通信(IPC)或数据记录中,定义了名为 IIOFormat 的序列化协议,这种规范通常只在内部文档中出现,如 IIOFormat_Protocol_Buffer_v2.3.md。
总结与建议
| 上下文 | 最常见/最可能 | |
|---|---|---|
| Linux 内核 IIO 子系统 | ⭐ 极高 | scan_type (位宽、字节序、有符号性)、scale、offset、触发缓冲区数据包排列规则。 |
| 私有传感器协议 | ⭐⭐ 中等 | 特定传感器或数据采集模块的帧结构、编解码方式、时间戳格式、缩放规则。 |
| 内部应用协议 | ⭐ 较低 | 自定义的进程间数据交换格式,用于IIO相关数据。 |
如果你能提供更多上下文(例如是哪个硬件平台、哪个传感器型号、哪个开源项目),我可以给出更精确的指向。
针对 Linux IIO 的最实用参考:
- 内核文档 (最权威):
Documentation/ABI/testing/sysfs-bus-iio(描述了所有 sysfs 属性)Documentation/driver-api/iio/index.rst(驱动API)
- libiio 库:
- 地址: https://github.com/analogdevicesinc/libiio
- 它封装了对 IIO 设备的操作,自动处理格式解析,如果你只是使用,这是一个很好的选择。
- 内核源码树:
- 查看具体的传感器驱动(如
drivers/iio/accel/bmc150-accel-core.c),bmc150_accel_scan_masks和bmc150_accel_channels直接定义了格式。
- 查看具体的传感器驱动(如
如果你是在寻找如何使用 Linux 下的传感器,请参考内核 IIO 文档和 libiio,如果你是在开发硬件和驱动,请**实现符合内核 IIO 框架的 `iio_chan_spec``。