LINUX IIO子系统分析之六 iio device的驱动开发流程说明
前面五章我们基本上把IIO 子系统的内部设计实现均作了说明,本章我们将说明iio device的驱动开发流程,本章的主要内容大致安排如下:
一、IIO子系统的关键技术点总结
二、IIO DEVICE的注册与注销接口说明
三、IIO DEVICE的驱动开发流程
一、IIO子系统的关键技术点总结
以上几篇文章已经对IIO子系统的设计实现做了大致说明,IIO子系统主要使用如下几个关键技术点实现其主要功能:
- 借助sysfs、kobject机制,实现IIO DEVICE各类的设备属性,并借助于sysfs暴露给应用程序。
- 实现iio event相关的设备属性,并将属性参数以sysfs文件的形式显示在IIO DEVICE的events子目录(/sys/bus/iio/devices/iio:deviceX/events),包括event的使能、event参数设置与读取文件等;
- 实现iio trigger设备及其属性,并将属性参数以sysfs文件的显示在trigger子目录(/sys/bus/iio/devices/triggerX),可查看trigger的名称;而iio device则可以通过文件/sys/bus/iio/devices/iio:deviceX/trigger查看或修改当前iio device绑定的trigger;
- 实现iio buffer相关的设备属性,用于进行iio buffer的使能与否、各channel 相关的数据采集缓存使能等,主要在目录/sys/bus/iio/devices/iio:deviceX/scan_elements、/sys/bus/iio/devices/iio:deviceX/buffer下;
- 实现iio device相关的raw 数据读取等设备属性(在目录/sys/bus/iio/devices/iio:deviceX/下),实现读取各channel的raw数据信息(可理解单次数据采集,其与iio buffer采集是互斥的,即一个channel若开启了iio buffer进行数据采集及缓存,则无法通过dir_type_raw文件获取该通道的raw data);
- 借助于字符设备文件机制,应用程序可获取到iio buffer缓存的采集数据以及iio device触发的iio event信息,这两个信息目前仅能通过字符设备文件进行获取;
- iio trigger内部通过实现虚拟的irq chip,实现iio trigger与iio trigger consumer的1:N绑定,而不需要关注iio trigger consumer具体的数据类型等信息;
IIO子系统实现以上三种技术完成了iio device及其内部iio buffer、iio event、iio trigger等模块的功能实现。
二、IIO DEVICE的注册与注销接口说明
iio device注册接口为devm_iio_device_register、iio_device_register,而devm_iio_device_register接口则实现了iio device的自动注销功能,因此iio device driver尽量使用该接口进行iio device的注册
iio_device_register实现的主要功能
iio device register主要实现如下几个功能:
- 完成该iio device对应的字符设备文件的创建,字符设备文件的操作接口为iio_buffer_fileops;
- 完成iio buffer对象指针的创建及iio buffer相关的设备属性的创建(主要通过函数iio_buffer_alloc_sysfs_and_mask实现);
- 完成iio event interface的内存申请及初始化,并完成iio event相关的设备属性的创建(iio_device_register_eventset);
- 完成iio device相关的设备属性的创建(即是上面所说的raw data获取相关的属性文件,通过iio_device_add_channel_sysfs、iio_device_register_sysfs接口调用实现);
- 若iio device支持trigger-buffer、trigger-event,则通过iio_device_register_trigger_consumer完成current_trigger属性的创建,以便进行iio device与trigger的绑定与解绑操作;
- 调用device_add完成iio device对应struct device类型变量的注册,因为上面所需创建的设备属性均是指struct device类型变量;
iio device register主要就完成以上6步的操作,也就是我们上面一中所说的大部分内容,而iio device的注销则主要完成相反的功能。
三、IIO DEVICE的驱动开发流程
以上主要讲的是iio 子系统内部的实现,下面我们说下如何实现一个iio device driver,iio device driver的实现相对来说还是比较清晰明了的。
- 针对iio device的每一个channel,定义其支持设备属性参数( struct iio_chan_spec类型的变量),以便在iio_device_register时,完成各类设备属性的创建,下图是我实现的虚拟iio temp device的channel定义,若某一channel支持iio buffer,则设置scan_index、scan_type信息;若支持iio event,则需要实现event_spec变量( struct iio_event_spec类型的变量,定义event类型等,以便生成iio event设备属性)
- 定义iio device相关info的读写接口,主要是struct iio_info类型的变量,如下即为struct iio_info定义的实例,其中read_raw、write_raw用于raw data 的读写操作(单次数据采集);而read_event_config、write_event_config、read_event_value、write_event_value接口则主要用于event使能控制、event相关值的读写(如温度告警阈值设置等)
- 调用devm_iio_device_alloc接口,申请一个iio device的内存空间;
- 根据上述步骤1、2定义的变量,初始化该iio device;
- 若该设备支持iio trigger-buffer,则调用iio_triggered_buffer_setup,完成iio trigger-buffer的初始化操作;
- 若该iio device提供iio trigger,则调用iio_trigger_register完成iio trigger的注册,并与iio device进行绑定;
- 若该iio device提供中断用于iio buffer的采集,则完成该中断的中断申请,并在中断处理函数中调用iio_trigger_poll,由iio trigger模块调用iio buffer的处理接口,实现iio device 使能channel的采集操作,并存储在iio buffer中
- 调用devm_iio_device_register完成iio device的注册。
完成以上几步,基本上也就可以实现一个iio device driver,下一章我们将通过一个虚拟的iio device driver实例进行动手实践,该虚拟iio device driver涉及虚拟i2c adapter driver、虚拟irq controller,可以实现数据的采集与温度告警中断触发操作。
LINUX IIO子系统分析之六 iio device的驱动开发流程说明相关推荐
- LINUX IIO子系统分析之五IIO BUFFER子模块实现分析
上一章我们介绍了iio子系统中的iio event模块,本章我们将介绍iio buffer模块,iio buffer主要用于连续数据采集与缓存功能.IIO buffer模块借助IIO DEVICE字符 ...
- LINUX IIO子系统分析之一 IIO子系统概述
从本章开始,我们进行IIO子系统专栏的分析文档,本次IIO子系统专栏分析文档大概包含如下几章: 一. IIO子系统概述 二.IIO子系统相关数据结构分析 三.iio trigger 介绍 四.iio ...
- LINUX IIO子系统分析之四 IIO EVENT介绍
上一章我们介绍了iio子系统中的iio trigger模块,本章我们将介绍iio event模块,iio event主要用于阈值监测.自由落体监测等监测功能.因为IIO EVENT涉及IIO DEVI ...
- linux input子系统分析--子系统核心.事件处理层.事件传递过程
linux input子系统分析--子系统核心.事件处理层.事件传递过程 一. 输入子系统核心分析. 1.输入子系统核心对应与/drivers/input/input.c文件,这个也是作为一个模块注 ...
- linux input子系统分析--主要函数
linux input子系统分析--主要函数 一. 各种注册函数 因为分析一所讲的每种数据结构都代表一类对象,所以每种数据结构都会对应一个注册函数,他们都定义在子系统核心的input.c文件中.主要有 ...
- Linux MMC子系统分析(二)——Host分析
Linux MMC子系统分析(二)--Host分析 前言 通过前面对mmc子系统的模型分析,我们能够知道host是对应于硬件控制器的具体操作.本文将以sdhci-s3c.c为例对host进行简单的分析 ...
- linux将tick变成日期,Linux时间子系统之:Tick Device layer综述
原标题:Linux时间子系统之:Tick Device layer综述 一.前言 时间子系统中的tick device layer主要涉及kernel/time/tick-*相关的文件,本文的主要内容 ...
- Linux V4L2子系统分析(一)
1.概述 Linux系统上的Video设备多种多样,如通过Camera Host控制器接口连接的摄像头,通过USB总线连接的摄像头等.为了兼容更多的硬件,Linux内核抽象了V4L2(Video fo ...
- linux IIC子系统分析(九)——实例分析通过设备节点访问I2c设备
在< linux IIC子系统分析(四)--I2c bus初始化> 中我们创建了I2C 总线驱动,I2C adapter device 和adapter drivers也在这时创建 在&l ...
最新文章
- 阿里园区生态技术联盟启动大会
- SAP CRM页面assignment block动态显示与否的控制逻辑
- Java Platform Module系统中的可选依赖项
- overflow c语言_C语言表结构(一)
- 五分钟快速过完Verilog HDL基本概念(3)语法讲解
- 笔记———No.1 使用matlab画圆
- 视频消除人声,适用于配音比赛等场合
- 通达OA2017按部门创建公共文件柜
- 刘宝瑞相声《珍珠翡翠白玉汤》台词
- 华为云图像标签使用之智慧相册
- Win10笔记本用雷电3接口外接显卡加速tensorflow深度学习步骤
- 0202了,你会用手机操控电脑吗?
- 任务描述本关任务:利用所学知识,按要求自行绘制一个 K 线图。
- 116 Ajax简单应用
- Clickhouse库引擎介绍
- Python Print函数用法
- 唯一摩尔斯密码词 leetcode Java篇
- 优化问题-GP(几何规划,Geometric Program)
- 零代码平台-iwx,是想革我们程序员命?
- 天线接收功率计算公式_天线增益的计算公式
热门文章
- CSMA/CD的基本工作过程
- fragment与activity之间的信息传递的两种方式
- 【JAVA】力扣第197场周赛代码+解题思路
- 一个身居中国的法国程序员谈Python与PHP
- 什么是待办事项?日常办事项清单怎么写
- ORB-SLAM2-----Frame()
- 使用Spring Environment遇到的问题, 如读取到配置不是自己实际想要的
- PASCAL VOC2012类型的数据集生成train.txt\val.txt等文件
- 做游戏与web的区别 - 服务器篇【1】
- STM32F103RB 实作笔记(九)- PWM + SPI +MAX6675 整合试验 (正点原子 STM32F103 nano开发板)程式解析