前面五章我们基本上把IIO 子系统的内部设计实现均作了说明,本章我们将说明iio device的驱动开发流程,本章的主要内容大致安排如下:

一、IIO子系统的关键技术点总结

二、IIO DEVICE的注册与注销接口说明

三、IIO DEVICE的驱动开发流程

一、IIO子系统的关键技术点总结

以上几篇文章已经对IIO子系统的设计实现做了大致说明,IIO子系统主要使用如下几个关键技术点实现其主要功能:

  1. 借助sysfs、kobject机制,实现IIO DEVICE各类的设备属性,并借助于sysfs暴露给应用程序。

    1. 实现iio event相关的设备属性,并将属性参数以sysfs文件的形式显示在IIO DEVICE的events子目录(/sys/bus/iio/devices/iio:deviceX/events),包括event的使能、event参数设置与读取文件等;
    2. 实现iio trigger设备及其属性,并将属性参数以sysfs文件的显示在trigger子目录(/sys/bus/iio/devices/triggerX),可查看trigger的名称;而iio device则可以通过文件/sys/bus/iio/devices/iio:deviceX/trigger查看或修改当前iio device绑定的trigger;
    3. 实现iio buffer相关的设备属性,用于进行iio buffer的使能与否、各channel 相关的数据采集缓存使能等,主要在目录/sys/bus/iio/devices/iio:deviceX/scan_elements、/sys/bus/iio/devices/iio:deviceX/buffer下;
    4. 实现iio device相关的raw 数据读取等设备属性(在目录/sys/bus/iio/devices/iio:deviceX/下),实现读取各channel的raw数据信息(可理解单次数据采集,其与iio buffer采集是互斥的,即一个channel若开启了iio buffer进行数据采集及缓存,则无法通过dir_type_raw文件获取该通道的raw data);
  2. 借助于字符设备文件机制,应用程序可获取到iio buffer缓存的采集数据以及iio device触发的iio event信息,这两个信息目前仅能通过字符设备文件进行获取;
  3. 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主要实现如下几个功能:

  1. 完成该iio device对应的字符设备文件的创建,字符设备文件的操作接口为iio_buffer_fileops;
  2. 完成iio buffer对象指针的创建及iio buffer相关的设备属性的创建(主要通过函数iio_buffer_alloc_sysfs_and_mask实现);
  3. 完成iio event interface的内存申请及初始化,并完成iio event相关的设备属性的创建(iio_device_register_eventset);
  4. 完成iio device相关的设备属性的创建(即是上面所说的raw data获取相关的属性文件,通过iio_device_add_channel_sysfs、iio_device_register_sysfs接口调用实现);
  5. 若iio device支持trigger-buffer、trigger-event,则通过iio_device_register_trigger_consumer完成current_trigger属性的创建,以便进行iio device与trigger的绑定与解绑操作;
  6. 调用device_add完成iio device对应struct device类型变量的注册,因为上面所需创建的设备属性均是指struct device类型变量;

iio device register主要就完成以上6步的操作,也就是我们上面一中所说的大部分内容,而iio device的注销则主要完成相反的功能。

三、IIO DEVICE的驱动开发流程

以上主要讲的是iio 子系统内部的实现,下面我们说下如何实现一个iio device driver,iio device driver的实现相对来说还是比较清晰明了的。

  1. 针对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设备属性)

  1. 定义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相关值的读写(如温度告警阈值设置等)
  2. 调用devm_iio_device_alloc接口,申请一个iio device的内存空间;
  3. 根据上述步骤1、2定义的变量,初始化该iio device;
  4. 若该设备支持iio trigger-buffer,则调用iio_triggered_buffer_setup,完成iio trigger-buffer的初始化操作;
  5. 若该iio device提供iio trigger,则调用iio_trigger_register完成iio trigger的注册,并与iio device进行绑定;
  6. 若该iio device提供中断用于iio buffer的采集,则完成该中断的中断申请,并在中断处理函数中调用iio_trigger_poll,由iio trigger模块调用iio buffer的处理接口,实现iio device 使能channel的采集操作,并存储在iio buffer中
  7. 调用devm_iio_device_register完成iio device的注册。

完成以上几步,基本上也就可以实现一个iio device driver,下一章我们将通过一个虚拟的iio device driver实例进行动手实践,该虚拟iio device driver涉及虚拟i2c adapter driver、虚拟irq controller,可以实现数据的采集与温度告警中断触发操作。

LINUX IIO子系统分析之六 iio device的驱动开发流程说明相关推荐

  1. LINUX IIO子系统分析之五IIO BUFFER子模块实现分析

    上一章我们介绍了iio子系统中的iio event模块,本章我们将介绍iio buffer模块,iio buffer主要用于连续数据采集与缓存功能.IIO buffer模块借助IIO DEVICE字符 ...

  2. LINUX IIO子系统分析之一 IIO子系统概述

    从本章开始,我们进行IIO子系统专栏的分析文档,本次IIO子系统专栏分析文档大概包含如下几章: 一. IIO子系统概述 二.IIO子系统相关数据结构分析 三.iio trigger 介绍 四.iio ...

  3. LINUX IIO子系统分析之四 IIO EVENT介绍

    上一章我们介绍了iio子系统中的iio trigger模块,本章我们将介绍iio event模块,iio event主要用于阈值监测.自由落体监测等监测功能.因为IIO EVENT涉及IIO DEVI ...

  4. linux input子系统分析--子系统核心.事件处理层.事件传递过程

    linux input子系统分析--子系统核心.事件处理层.事件传递过程 一.  输入子系统核心分析. 1.输入子系统核心对应与/drivers/input/input.c文件,这个也是作为一个模块注 ...

  5. linux input子系统分析--主要函数

    linux input子系统分析--主要函数 一. 各种注册函数 因为分析一所讲的每种数据结构都代表一类对象,所以每种数据结构都会对应一个注册函数,他们都定义在子系统核心的input.c文件中.主要有 ...

  6. Linux MMC子系统分析(二)——Host分析

    Linux MMC子系统分析(二)--Host分析 前言 通过前面对mmc子系统的模型分析,我们能够知道host是对应于硬件控制器的具体操作.本文将以sdhci-s3c.c为例对host进行简单的分析 ...

  7. linux将tick变成日期,Linux时间子系统之:Tick Device layer综述

    原标题:Linux时间子系统之:Tick Device layer综述 一.前言 时间子系统中的tick device layer主要涉及kernel/time/tick-*相关的文件,本文的主要内容 ...

  8. Linux V4L2子系统分析(一)

    1.概述 Linux系统上的Video设备多种多样,如通过Camera Host控制器接口连接的摄像头,通过USB总线连接的摄像头等.为了兼容更多的硬件,Linux内核抽象了V4L2(Video fo ...

  9. linux IIC子系统分析(九)——实例分析通过设备节点访问I2c设备

    在< linux IIC子系统分析(四)--I2c bus初始化> 中我们创建了I2C 总线驱动,I2C adapter device 和adapter drivers也在这时创建 在&l ...

最新文章

  1. 阿里园区生态技术联盟启动大会
  2. SAP CRM页面assignment block动态显示与否的控制逻辑
  3. Java Platform Module系统中的可选依赖项
  4. overflow c语言_C语言表结构(一)
  5. 五分钟快速过完Verilog HDL基本概念(3)语法讲解
  6. 笔记———No.1 使用matlab画圆
  7. 视频消除人声,适用于配音比赛等场合
  8. 通达OA2017按部门创建公共文件柜
  9. 刘宝瑞相声《珍珠翡翠白玉汤》台词
  10. 华为云图像标签使用之智慧相册
  11. Win10笔记本用雷电3接口外接显卡加速tensorflow深度学习步骤
  12. 0202了,你会用手机操控电脑吗?
  13. 任务描述本关任务:利用所学知识,按要求自行绘制一个 K 线图。
  14. 116 Ajax简单应用
  15. Clickhouse库引擎介绍
  16. Python Print函数用法
  17. 唯一摩尔斯密码词 leetcode Java篇
  18. 优化问题-GP(几何规划,Geometric Program)
  19. 零代码平台-iwx,是想革我们程序员命?
  20. 天线接收功率计算公式_天线增益的计算公式

热门文章

  1. CSMA/CD的基本工作过程
  2. fragment与activity之间的信息传递的两种方式
  3. 【JAVA】力扣第197场周赛代码+解题思路
  4. 一个身居中国的法国程序员谈Python与PHP
  5. 什么是待办事项?日常办事项清单怎么写
  6. ORB-SLAM2-----Frame()
  7. 使用Spring Environment遇到的问题, 如读取到配置不是自己实际想要的
  8. PASCAL VOC2012类型的数据集生成train.txt\val.txt等文件
  9. 做游戏与web的区别 - 服务器篇【1】
  10. STM32F103RB 实作笔记(九)- PWM + SPI +MAX6675 整合试验 (正点原子 STM32F103 nano开发板)程式解析