前面五章我们基本上把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. netty服务器定时发送消息,netty+websocket+quartz实现消息定时推送
  3. Helios与Katana的区别
  4. Gentoo 安装日记 01 (工具准备)
  5. redis的分布式解决方式--codis
  6. jooq_jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友合作字节码...
  7. 22. 括号生成 golang 图解
  8. hint为什么不显示_英雄联盟手游kda活动为什么没有?kda女团活动在哪里怎么不显示...
  9. InfluxDB-Python 操作实践
  10. 如何杀死远程服务器到本机的tcp连接
  11. acm康复训练记4-world final 2017
  12. IDispatch接口原理与应用
  13. 企业微信接入第三方应用(以服务商身份)
  14. Python信息轰炸
  15. 人之最美,纯朴初心,有所不为
  16. 前端学习从入门到高级全程记录之31(JavaScript高级3)
  17. 【高级持续性威胁追踪】SolarWinds供应链攻击持续跟踪进展
  18. CodeForces - 32C Flea【数学】
  19. Android9.0 网络安全配置文件
  20. 基于SIR的社交网络谣言传播问题简单建模

热门文章

  1. Linux迁移home目录到根目录的操作步骤
  2. 2021爱分析・数据智能平台实践报告—重构数据智能时代的数据基础设施
  3. 生产者消费者模型的作用是什么
  4. npm和yarn清除缓存
  5. 毕业论文管理系统类图
  6. 调试器GDB的基本使用方法
  7. RXJAVA-FlatMap
  8. python中------decode解码出现的0xca问题解决方法
  9. 云图-CADViewerX 7.X OCX
  10. 【BZOJ 1305】[CQOI2009]dance跳舞