前言
本笔记基于linux5.10.xx内核,dht11温湿度传感器总结对IIO驱动子系统的使用,基于运行linux内核的arm系列处理器soc;
一、概念
IIO为industrial I/O的简称,为一些传感器的数据采集提供了一套方便的软件框架,作为内核驱动子系统可以和温度、湿度、压力、加速度等传感器的驱动相结合,为相应数据获取提供方便的访问方式;
二、系统拓扑结构
通过将传感器抽象为iio设备后,最终会将其注册为一个字符设备;
芯片和传感器之间的接口可以是多种形式,如i2c、spi、adc、本例中的dht11单总线等;
通过iio可以将传感器的物理数据建立一个数据模型,iio将其定义通道,如dht11可以采集温度和湿度则定义了温度和湿度通道,其它传感器同理;
三、IIO子系统文件
industrialio-core.c
iio子系统的核心层;
iio总线的注册接口;
提供iio_dev结构的分配、、成员初始化、注册接口;
提供iio对应的字符设备的file_operation接口;
提供iio设备属性操作接口;
industrialio-event.c
提供iio设备event事件方式获取数据的接口;
主要操作的是struct iio_dev_opaque结构的event_interface成员和其子成员;
industrialio-buffer.c
提供iio设备数据buffer的功能接口;
对struct iio_buffer结构的操作封装;
iio设备可以选择不使用buffer功能,具体考虑应用场景;
buffer/kfifo_buf.c
提供struct iio_buffer结构的分配结构;
提供struct iio_buffer结构的access成员操作函数集;
将struct iio_buffer作为struct iio_kfifo结构的成员进行操作;
buffer/industrialio-buffer-cb.c
对struct iio_cb_buffer结构的操作封装;
inkern.c
对struct iio_channel结构的操作封装;
industrialio-sw-trigger.c
industrialio-triggered-event.c
buffer/industrialio-triggered-buffer.c
trigger相关模式需要的驱动iio子系统的文件,具体的驱动也要实现相关机制;
四、主要数据结构
struct iio_dev_opaque
定义于include/linux/iio/iio-opaque.h
通过此结构的定义来定义iio_dev;
成员iio_event_interface封装用户层阻塞访问设备时的等待队列头;
buffer_list定义数据buffer的列表;
struct iio_dev_opaque {
struct iio_dev indio_dev;
struct iio_event_interface *event_interface;