libiio 提供了统一的接口来操作位于iio子系统下的设备。
结构
由上图可以看出: - libiio 具有 local backend
和
network backend
两种后端 + local backend
用于与本地的 sysfs
中的文件交互 +
network backend
通过 iiod
服务器运作,可以通过网络连接将测试数据发送到其他平台上
编译
- 在github 下载最新稳定版代码
- 编写工具链配置文件
toolchain.cmake
1 | mkdir build |
API
参考官方手册 做简单整理。
API由以下4部分组成:
- iio_channel : 代表一个设备上的一个通道
- iio_device : 代表一个具体的设备实例,一个
iio_device
可能会包含多个iio_channel
- iio_buffer : 针对设备的缓存,一个
iio_device
对应一个iio_buffer
- iio_context : 可能包含多个
iio_device
iio 设备在sysfs中可以读写的文件名为:
<in/out>_<channel>_<attr>
。
context
创建与消除
一般一个进程创建一个 iio_context
对象,以代表对 IIO
设备的打包使用: - 在创建 context
就会遍历
iio:device
以集合设备
1 | /** |
与设备的关系
1 | /** |
channels
注意: 两个channels可以具有相同的ID,分别代表输入和输出!
1 | /** |
属性
1 | /** |
参数的读写
- 读取设备参数
- iio_device_attr_read()
- iio_device_attr_read_all()
- iio_device_attr_read_bool()
- iio_device_attr_read_longlong()
- iio_device_attr_read_double()
- 读取通道参数
- iio_channel_attr_read()
- iio_channel_attr_read_all()
- iio_channel_attr_read_bool()
- iio_channel_attr_read_longlong()
- iio_channel_attr_read_double()
- 读取调试参数:并不是每个设备都有debugfs
- iio_device_debug_attr_read()
- iio_device_debug_attr_read_all()
- iio_device_debug_attr_read_bool()
- iio_device_debug_attr_read_longlong()
- iio_device_debug_attr_read_double()
- iio_device_get_debug_attrs_count() : 获取debug参数数目
- iio_device_get_debug_attr(): 得到attr
- iio_device_find_debug_attr(): 寻找attr
- 写设备参数
- iio_device_attr_write()
- iio_device_attr_write_all()
- iio_device_attr_write_bool()
- iio_device_attr_write_longlong()
- iio_device_attr_write_double()
- 写通道参数
- iio_channel_attr_write()
- iio_channel_attr_write_all()
- iio_channel_attr_write_bool()
- iio_channel_attr_write_longlong()
- iio_channel_attr_write_double()
- 写调试参数:并不是每个设备都有debugfs
- iio_device_debug_attr_write()
- iio_device_debug_attr_write_all()
- iio_device_debug_attr_write_bool()
- iio_device_debug_attr_write_longlong()
- iio_device_debug_attr_write_double()
- 寄存器的直接读写:并不是每个设备都有
- iio_device_reg_read()
- iio_device_reg_write()
触发
- iio_device_is_trigger() : 检查设备是否可以使用触发
- iio_device_get_trigger(): 是否已经绑定触发
- iio_device_set_trigger(): 绑定触发或解绑
获取采样的值
在 libiio
中使用 iio_buffer
来获取或设置设备的值。
- 在使用buffer之前需要先使能或关闭对应的采样通道:
- iio_channel_enable() / iio_channel_disable()
- iio_channel_is_scan_element() : 检查此通道是否可用于buffer
- 然后再创建buffer
- iio_device_create_buffer()
- iio_buffer_destroy() : 不使用时关闭
- 当为输入通道时,还需要刷新依次缓存
- iio_buffer_refill()
缓存的操作
- 向缓存写数据:
1 | size_t iio_buf_size = iio_buffer_end(buffer) - iio_buffer_start(buffer); |
- 回调: 当缓存读入数据或缓存发送时需要填入数据,都会触发回调
1 | ssize_t sample_cb(const struct iio_channel *chn, void *src, size_t bytes, void *d) |
- 循环的读写
1 | for (void *ptr = iio_buffer_first(buffer, channel); |
获取版本号
使用 iio_library_get_version()
来获取版本号进行区分,以使用对应的功能。
实例
基本思路如下: - 创建一个context - 找寻设备 - 获取通道 - 进行读写
以气压计 ms5611 为例:
1 | struct iio_context * context; |