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子系统所面向的设备包含:
- ADC芯片;
- DAC芯片;
- 温度传感器;
- 光感器;
- 陀螺仪;
- 加速度计;
- CDCs;
- IMUs
- 压力传感器等等
二、IIO子系统架构
如下即为IIO子系统框架,针对IIO子系统而言,其主要提供两种方式与应用层交互:
- 通过字符设备文件,应用程序可读取IIO device 各通道的信息;
- 通过sysfs下的属性文件,应用程序也可以读取IIO device各通道的信息;
而在IIO子系统内部,则主要包括如下四部分的内容:
- iio buffer用于处理需要进行连续采集的数据,当一个IIO device的各通道数据支持连续采集时,则调用iio buffer模块提供的接口,创建iio buffer用于存储连续存储的数据,同时该模块提供字符设备文件的注册,因此应用程序通过字符设备文件即可读取该IIO device各通道连续采集的数据;
- 当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亮度的控制策略);
- 针对温度传感器等器件,也会进行事件触发(如温度传感器设置温度上限阈值,当温度高于该阈值后,则触发中断信号),因此IIO子系统提供了iio event模块,iio event模块提供了字符设备操作接口用于对event的监控(该字符设备操作接口并没有创建字符设备文件,而是在iio buffer的ioctl中开启event monitor,然后调用anon_inode_getfd创建了一个匿名inode节点,并设置inode的ops接口等)。
- 以上3个都是iio 子系统各子功能,而iio core则主要实现iio device的创建,并根据传递的参数决定是否需要创建iio buffer等,提供了iio device的内存申、请注册与注销接口。
二、IIO DEVICE相关通道数据访问方式
IIO子系统针对IIO DEVICE中各通道的访问方式主要提供两种,即sysfs方式访问、字符设备方式访问.
- sysfs方式数据访问
- 针对IIO DEVICE的通道数据,仅需要通过ONE-SHOT方式访问时,则只需要通过sysfs方式访问即可,即在sysfs目录下通过IIO DEVICE提供的属性文件进行访问(如cat in_voltage0_raw)
- 字符设备方式数据访问
- 针对IIO DEVICE的通道数据,需要支持连续采集功能时,则借助iio-trigger、iio-buffer实现数据的触发与存储功能,同时应用程序可通过对应的iio buffer提供的字符设备文件,访问存储的连续采集的数据。
本篇文章主要是对IIO子系统进行简要说明,介绍IIO子系统的框架及主要子模块功能进行简要说明。下一章我们将通过IIO子系统的数据结构入手,分析IIO子系统的设计框架。