空枝|LINUX IIO子系统分析之七 虚拟iio设备驱动实现

前面几章我们基本完成了IIO子系统的所有内容 , 而该章即为本专栏的结束篇 , 主要用来实现一个虚拟的IIO DEVICE DRIVER , 本章的内容主要包括如下几部分:
一、 虚拟IIO DEVICE的说明
二、虚拟IIO DEVICE DRIVER实现所需的知识点
三、虚拟IIO DEVICE DRIVER的数据结构及实现说明
四、虚拟IIO DEVICE DRIVER的测试验证
一、 虚拟IIO DEVICE的说明本次我们将实现一个虚拟的温度传感器芯片(芯片型号为virt0824) , 该设备提供2个channel , 并且提供7个寄存器 , 定义如下:
Channel0_current_temp(0x00 , 表示通道0的当前温度)
Channel1_current_temp(0x01 , 表示通道1的当前温度)
Channel0_high_alarm_temp(0x02 , 表示通道0的温度过高告警阈值)
Channel1_high_alarm_temp(0x03 , 表示通道1的温度过高告警阈值)
Channel0_low_alarm_temp(0x04 , 表示通道0的温度过低告警阈值)
Channel1_low_alarm_temp(0x05 , 表示通道0的温度过低告警阈值)
Channel_fault_mask//4个bit;(0x06 , 表示温度告警fault bit , bit0-bit1表示温度过高告警标志、bit2-bit3表示温度过低告警标志)
该温度传感器为iic device , 并且支持温度告警中断 , 同时该温度传感器支持温度数据ready中断(此中断主要用于支持iio buffer对应的数据连续采集功能 , 实际的芯片可能并不提供该中断)
二、虚拟IIO DEVICE DRIVER实现所需的知识点为了让本次实现的IIO DEVICE能够尽量实现数据单次采集、iio buffer、iio event等功能 , 本次虚拟iio device driver主要涉及如下几个知识点:

  1. 提供虚拟iio adapter controller , 并完成一个虚拟的温度传感器芯片 , 并提供sysfs下的属性文件 , 可以修改温度传感器芯片中的各寄存器的值 , 可以置位温度告警位等等;
  2. 提供虚拟的irq chip , 用于触发温度传感器温度告警中断、温度数据可读中断;
  3. 提供iio device driver , 实现温度传感器对应iio device的创建及注册 。
三、虚拟IIO DEVICE DRIVER的数据结构及实现说明数据结构定义定义数据结构virt0824_temp , 该结构体中包含iic client对应的regmap对象(用于读取virt0824设备的寄存器值)、该iio device对应的iio trigger , 用于处理温度传感器温度告警中断信息 ,
空枝|LINUX IIO子系统分析之七 虚拟iio设备驱动实现实现说明iio event实现(温度告警)基于温度告警 , 我们通过在温度告警中断处理函数中读取告警信息 , 并event信息发送给iio event的kfifo中 , 接口调度过程如下所示 , 通过该调度过程 , 应用程序即可监控到温度传感器上报的告警 。
空枝|LINUX IIO子系统分析之七 虚拟iio设备驱动实现温度告警中断处理函数的实现如下所示
空枝|LINUX IIO子系统分析之七 虚拟iio设备驱动实现iio buffer实现主要是连续采集各通道的当前温度 , 接口调度过程如下所示 , 通过该调度过程 , 应用程序即连续可读取温度传感器的当前温度 。
空枝|LINUX IIO子系统分析之七 虚拟iio设备驱动实现在本次的测试中 , 温度传感器通过温度数据可读中断从而将数据push到iio buffer中 , 用于连续数据采集的iio trigger , iio trigger-buffer的中断处理函数的实现如下