空枝|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主要涉及如下几个知识点:
- 提供虚拟iio adapter controller , 并完成一个虚拟的温度传感器芯片 , 并提供sysfs下的属性文件 , 可以修改温度传感器芯片中的各寄存器的值 , 可以置位温度告警位等等;
- 提供虚拟的irq chip , 用于触发温度传感器温度告警中断、温度数据可读中断;
- 提供iio device driver , 实现温度传感器对应iio device的创建及注册 。
实现说明iio event实现(温度告警)基于温度告警 , 我们通过在温度告警中断处理函数中读取告警信息 , 并event信息发送给iio event的kfifo中 , 接口调度过程如下所示 , 通过该调度过程 , 应用程序即可监控到温度传感器上报的告警 。
温度告警中断处理函数的实现如下所示
iio buffer实现主要是连续采集各通道的当前温度 , 接口调度过程如下所示 , 通过该调度过程 , 应用程序即连续可读取温度传感器的当前温度 。
在本次的测试中 , 温度传感器通过温度数据可读中断从而将数据push到iio buffer中 , 用于连续数据采集的iio trigger , iio trigger-buffer的中断处理函数的实现如下
推荐阅读
- 精英联盟总队|最详细的Linux简史——Linux大神带你领略它的前世今生
- 轻拔琴弦|给你一个反悔的机会
- 空枝|一个漂亮的开源HTML5音乐播放器——APlayer
- 空枝|这台手机,我整整等了三年,终于要发布
- 空枝|华为云手机革新概念、与我书中未来手机革新概念同理
- 空枝|1368元 6GB+128GB+5000毫安电池四摄拍照手机
- 空枝|不看不知道,黄石还有这么硬核的地方
- 空枝|移动在学校又来搞事了
- 怅然|Glances:多功能 Linux 系统监控工具
- 空枝|为什么不敢禁用苹果?制裁苹果,我们得不偿失