LINUX IIO子系统专栏分析之一 IIO子系统概述

从本章开始,我们进行IIO子系统专栏的分析文档,本次IIO子系统专栏分析文档大概包含如下几章:

一、 IIO子系统概述

二、IIO子系统相关数据结构分析

三、iio trigger 介绍

四、iio event介绍

五、iio buffer介绍

六、iio device的注册与注销介绍

七、iio trigger驱动实现

八、虚拟iio device驱动实现

 

 

一、IIO子系统介绍

     本章我们对IIO子系统做一个简单的概述,IIO子系统主要提供对ADC、DAC相关的设备驱动框架,该子系统的设计目的主要是驱动那些分类时处于hwmon和input子系统之间的设备。同时查看linux内核的驱动代码,其实iio、hwmon之间的界限并不是那么明显。而iio子系统所面向的设备包含:

  1. ADC芯片;
  2. DAC芯片;
  3. 温度传感器;
  4. 光感器;
  5. 陀螺仪;
  6. 加速度计;
  7. CDCs;
  8. IMUs
  9. 压力传感器等等

 

 

二、IIO子系统架构

 

如下即为IIO子系统框架,针对IIO子系统而言,其主要提供两种方式与应用层交互:

  1. 通过字符设备文件,应用程序可读取IIO device 各通道的信息;
  2. 通过sysfs下的属性文件,应用程序也可以读取IIO device各通道的信息;

 

而在IIO子系统内部,则主要包括如下四部分的内容:

  1. iio buffer用于处理需要进行连续采集的数据,当一个IIO device的各通道数据支持连续采集时,则调用iio buffer模块提供的接口,创建iio buffer用于存储连续存储的数据,同时该模块提供字符设备文件的注册,因此应用程序通过字符设备文件即可读取该IIO device各通道连续采集的数据;
  2. 当IIO DEVICE支持连续采集时,一般需要绑定一种触发方法,作为数据到达的信号,而IIO子系统提个iio trigger实现该功能,当iio trigger信号到后,则将数据push到iio buffer中(目前IIO子系统提供了iio trigger的注册、注销与查找接口,且系统中已提供了iio-trig-sysfs、iio-trig-gpio、iio-trig-irq等通用的触发方法。这种方式是不是很眼熟,在led子系统中,也包含为led-trigger,一个led-class可以和一个led-trigger绑定,从而实现对led亮度的控制策略);
  3. 针对温度传感器等器件,也会进行事件触发(如温度传感器设置温度上限阈值,当温度高于该阈值后,则触发中断信号),因此IIO子系统提供了iio event模块,iio event模块提供了字符设备操作接口用于对event的监控(该字符设备操作接口并没有创建字符设备文件,而是在iio buffer的ioctl中开启event monitor,然后调用anon_inode_getfd创建了一个匿名inode节点,并设置inode的ops接口等)。
  4. 以上3个都是iio 子系统各子功能,而iio core则主要实现iio device的创建,并根据传递的参数决定是否需要创建iio buffer等,提供了iio device的内存申、请注册与注销接口。

LINUX IIO子系统专栏分析之一 IIO子系统概述

 

 

 

二、IIO DEVICE相关通道数据访问方式

IIO子系统针对IIO DEVICE中各通道的访问方式主要提供两种,即sysfs方式访问、字符设备方式访问.

  1. sysfs方式数据访问
    1. 针对IIO DEVICE的通道数据,仅需要通过ONE-SHOT方式访问时,则只需要通过sysfs方式访问即可,即在sysfs目录下通过IIO DEVICE提供的属性文件进行访问(如cat  in_voltage0_raw)
  2. 字符设备方式数据访问
    1. 针对IIO DEVICE的通道数据,需要支持连续采集功能时,则借助iio-trigger、iio-buffer实现数据的触发与存储功能,同时应用程序可通过对应的iio buffer提供的字符设备文件,访问存储的连续采集的数据。

 

 

     本篇文章主要是对IIO子系统进行简要说明,介绍IIO子系统的框架及主要子模块功能进行简要说明。下一章我们将通过IIO子系统的数据结构入手,分析IIO子系统的设计框架。