0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux 开发IIO子系统入门

工程师 来源:一口Linux 作者:一口Linux 2020-10-27 10:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前阵子工作上做了一些关于 ADC 的支持,由于现在 ADC 相关的支持都被移动到了 IIO (Industrial I/O) 子系统下,我查阅了一些关于 IIO 资料,包括书籍、文章、内核文档和代码。个人感觉最好的入门文章应该是 ST WiKi 网站上 的 IIO Overview(2019) 和Analog Device Wiki 网站上的 Linux Industrial I/O Subsystem(2017),为了方便爱偷懒或者英文不好的小伙伴,我提炼了多篇文章的精华内容并在其基础上进行完善,尽量控制篇幅,希望能给大家提供一点小小的帮助。

Linux 驱动开发 / IIO子系统入门1

正文目录:

1. 什么是 IIO 子系统? 1.1 IIO 概述 1.2 IIO 相关的组件2. IIO 功能特性3. IIO 相关配置 3.1 配置内核 3.2 配置设备树 3.2.1 IIO providers 3.2.2 IIO consumers4. IIO API 4.1 用户空间 API 4.1.1 4种接口 4.1.2 操作实例5. 更多值得学习的知识点6. 相关参考

写作目的:

整理一些 IIO 子系统的入门知识。

1. 什么是 IIO 子系统?

1.1 IIO 概述

Industrial I/O 子系统旨在为某种意义上是模数或数模转换器 (ADC,DAC) 的设备提供支持,于2009年由 Huawei 的 Jonathan Cameront 添加。

简单框图:

支持的设备包括:

ADC / DAC加速度计磁力计陀螺仪压力传感器湿度传感器温度传感器。。.

很久以前,对于上述硬件的支持散落在 Linux 源码中的各种地方。

IIO 的出现,提供了一个统一的框架用于访问和控制上述各种类型的传感器,并且为用户态应用访问传感器提供了标准的接口:sysfs/devfs,并且填补了 Hwmon 和 Input 子系统之间的空白。

另外,IIO 不仅可以支持低速的 SoC ADC,还可支持高速、高数据速率的工业设备,例如 100M samples/sec 工业 ADC。

1.2 IIO 相关的组件

IIO-overview

上图基于 STM32 MPU,来源见文末。

1) 客户端应用程序(用户空间):

该组件会使用 libiio 库来配置 IIO 设备,然后从 IIO 设备读数据或者写数据到 IIO 设备中。客户端程序可以细分为 local client 和 remote client。

2) libiio 库(用户空间):

libiio 是 Analog Device 公司发起的一个用于访问 IIO 设备的开源库。

它封装了对 /sys/bus/iio/devices(配置 iio) 和/dev/iio/deviceX(读写iio) 的访问,并且提供了便于测试的 iio 命令行工具 (iio_info / iio_readdev) 和 iiod server。

iiod server 内含 local backend 和 remote backend 以支持 local client 和 remote client 的访问。

libiio 的源码位于:github libiio

3) 访问接口(用户空间):

iio 支持多种标准的 Linux 设备访问接口:

char device, sysfs, configfs, debugfs。

4) 内核空间的 iio 消费者(即 IIO consumers):

除了用户空间的应用程序能访问 iio 设备之外,在内核里也有其他设备驱动需要使用 iio 子系统的 API 来编写符合自身框架的设备驱动。

例如在 iio 子系统里支持了某款 Soc ADC 后,可能会有不同的硬件设备接到该 ADC 通道上,典型的例子是触摸芯片,开发人员需要在 input 子系统的框架下编写 touch driver,在 touch driver的 irq handler 中 调用 iio in-kern API 来读取触摸屏的 X、Y 值。

iio in-kernl API的定义位于头文件:

include/linux/iio/consumer.h

5) IIO framework(内核空间):

IIO 子系统的核心实现。

6) IIO device driver(或称 IIO providers):

7) Linux 内核自带的 IIO 调试工具:

2. IIO 的功能特性

1) 基础的设备注册和访问

类似于 hwmon 子系统,它们都可以通过 sysfs 以轮循的方式访问设备;

2) 可读取事件的字符设备(Event chrdevs)

类似于 input 子系统,iio 子系统也可以向应用层上报事件(hardware triggered events),例如阈值检测事件,自由落体检测事件、更复杂的动作检测事件;

目前 event 的格式为:event code + 时间戳;

3) 支持硬件 buffer

4) 支持 Trigger 和软件 buffer

3. IIO 相关配置

3.1 配置内核

Linux-4.14:

$ make menuconfigDevice Drivers ---》 《*》 Industrial I/O support ---》 [*] Enable buffer support within IIO 《 》 IIO callback buffer used for push in-kernel interfaces 《*》 Industrial I/O HW buffering 《*》 Industrial I/O buffering based on kfifo 《 》 Enable IIO configuration via configfs [*] Enable triggered sampling support (2) Maximum number of consumers per trigger 《 》 Enable software triggers support Accelerometers ---》 Analog to digital converters ---》 Amplifiers ---》 Chemical Sensors ---》 Hid Sensor IIO Common ---- SSP Sensor Common ---》 Digital to analog converters ---》 IIO dummy driver ---》 Frequency Synthesizers DDS/PLL ---》 Digital gyroscope sensors ---》 Health Sensors ---》 Humidity sensors ---》 Inertial measurement units ---》 Light sensors ---》 Magnetometer sensors ---》 Inclinometer sensors ---- Triggers - standalone ---》 Digital potentiometers ---》 Pressure sensors ---》 Lightning sensors ---》 Proximity sensors ---》 Temperature sensors ---》

从配置项的数目来看,IIO 的用途真的很广泛。

3.2 配置设备树

3.2.1 IIO providers

1) 相关要点:

IIO channels 源在设备树中用 IIO providers 来指定;

2) 必要属性:

io-channel-cells,0 表示只有 1 路 IIO output,1 表示有多路 IIO output;

io-channel-ranges: 一个 empty 属性(即不用赋值),会在 driver/iio/inkern.c/iio_channel_get() 中被引用,它表明继承了当前节点的子节点可以引用当前节点的 IIO channel;

3) 例子1 (no trigger)

adc: voltage-sensor@35 { compatible = “maxim,max1139”; reg = 《0x35》; #io-channel-cells = 《1》;};

4) 例子2 (with trigger)

adc@35 { compatible = “some-vendor,some-adc”; reg = 《0x35》; adc1: iio-device@0 { #io-channel-cells = 《1》; /* other properties */ }; adc2: iio-device@1 { #io-channel-cells = 《1》; /* other properties */ };};

3.2.2 IIO consumers

1) 相关要点:

IIO consumer 节点的形式是 《phandle iio_specifier》;

它的作用是连接 IIO provider 的 input 端到 IIO consumer 的 output 端;

其中,phandle 是 IIO provider 的句柄,specifier 用于选择第几路 channel;

类似 gpio specifier, IIO specifier 是有 1 个或者多个 cells 的数组,用于确定 IIO device的 output 端,即 1 个 cell 对应一个 IIO channel output;

IIO specifier 数组的长度由 IIO provider 节点的 #io-channel-cells 属性决定;

2) 必要属性:

io-channels:《phandle iio_specifier》 列表, 一个《phandle iio_specifier》 代表该设备连接着的一路 IIO input。如果 IIO provider 的 io-channel-cells=0 (即只有1路 IIO output), 则省略 iio_specifier。

3) 可选属性:

io-channel-names: IIO input 的名称列表,顺序要和 io-channels 属性保持一致,Consumers drivers 会将该名称和 iio_specifier 指定的 IIO input match 到一起。

4) 例子1

some_consumer { io-channels = 《&adc 1》, 《&ref 0》; io-channel-names = “vcc”, “vdd”; };

上述例子的引用了provider &adc的第1路 channel,和proiver &ref的第0路 channel。

4. IIO API

4.1 用户空间 API

相关参考:

IIO user space interface

How to use the IIO user space interface

4.1.1 4种接口

1)。 sysfs interface

/sys/bus/iio/devices/iio:deviceX;

可用于配置 /dev/iio:deviceX 接口的 events / data

可用于轮循的方式低速地直接读/写 IIO 设备;

Documentation/ABI/testing/sysfs-bus-iio;

2)。 character device

/dev/iio:deviceX,该接口在 IIO 子系统里是可选非必要的;

标准的文件 IO API: open(), read(), write(), close()。

用于读取 events 和 data;

3)。 configfs

用于配置额外的 IIO特性,例如:软件 triggers 或者 hrtimer triggers;

详细说明:

Documentation/ABI/testing/configfs-iio;

Documentation/iio/iio_configfs.txt;

4)。 debugfs

一些调试功能,例如 direct_reg_access 节点可用于读写寄存器;

4.1.2 操作实例

IIO direct mode: 通过 sysfs 以轮循的方式读 ADC 或者写 DAC:

1) 直接读 ADC

确定 sysfs 节点(方式1,不依赖工具)

$ grep -H “” /sys/bus/iio/devices/*/name | grep adc/sys/bus/iio/devices/iio:device0/name:48003000.adc:adc@0/sys/bus/iio/devices/iio:device1/name:48003000.adc:adc@1

sysfs 中的 iio:device0 sysfs 对应 ADC1;

$ cd /sys/bus/iio/devices/iio:device0/$ cat in_voltage6_raw # Convert ADC1 channel 0 (analog-to-digital): get raw value40603$ cat in_voltage_scale # Read scale0.044250488$ cat in_voltage_offset # Read offset0$ awk “BEGIN{printf (\”%d\n\“, (40603 + 0) * 0.044250488)}”1796

计算公式: Scaled value = (raw + offset) * scale = 1796 mV;

2) 直接写 DAC

确定 sysfs 节点(方式2)

$ lsiio | grep dacDevice 003: 40017000.dac:dac@1Device 004: 40017000.dac:dac@2

sysfs 中的 iio:device3 sysfs 对应 DAC1,lsiio 来源于Linux 内核源码(tools/iio/)。

$ cd /sys/bus/iio/devices/iio:device3/$ cat out_voltage1_scale # Read scale0.708007812$ awk “BEGIN{printf (\”%d\n\“, 2000 / 0.708007812)}” # 假设要输出 2000 mV2824$ echo 2824 》 out_voltage1_raw # Write raw value to DAC1$ echo 0 》 out_voltage1_powerdown # Enable DAC1 (out of power-down mode)

5. 更多值得学习的知识点

以 timer triggers 和 buffers 的方式读 ADC 或者写 DAC;

IIO 内核空间 API;

编写 IIO device driver

编写 IIO consumer driver

鉴于大多数人的注意力无法在一篇文章里上集中太久,更多的内容请大家先自行去阅读吧,不是自己理解到的东西是消化不了的。有机会的话我会把更多的读书心得放在后面的文章。

6. 相关参考

IIO Overview

Linux Industrial I/O Subsystem

《Linux Device Drivers Development》

本文只是一篇入门的文章,仍然有许多细节的知识点没有被描述到。如果本文能让你对 IIO 子系统有个大概的认识,那么本文的目的也就算达成了,以后还会继续写更多 IIO 子系统的文章。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 转换器
    +关注

    关注

    27

    文章

    9365

    浏览量

    155105
  • adc
    adc
    +关注

    关注

    100

    文章

    7386

    浏览量

    553771
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    217949
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【免费送书】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    Linux系统的设备驱动开发,一直给人门槛较高的印象,主要因内核机制抽象、需深度理解硬件原理、开发调试难度大所致。2021年,一本讲解驱动开发
    的头像 发表于 11-18 08:06 419次阅读
    【免费送书】成为硬核<b class='flag-5'>Linux</b><b class='flag-5'>开发</b>者:《<b class='flag-5'>Linux</b> 设备驱动<b class='flag-5'>开发</b>(第 2 版)》

    【书籍评测活动NO.67】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    景化应用的完整体系。从Linux内核开发的环境搭建、模块编程,到设备树、总线驱动,再到内存优化、DMA 技术,最后到IIO、GPIO、输入子系统实战,每一篇都以前一篇为基础,既适合零基
    发表于 11-17 17:52

    RK3506开发板Xenomai内核RT-Linux实时性系统适配教程与性能实测,实测仅7μs稳定延时

    本文基于触觉智能RK3506核心板/开发板,介绍Xenomai内核RT-Linux实时性系统适配,并附性能实测。简介与实测数据Xenomai简介XEnomai是一个实时子系统,可与
    的头像 发表于 09-18 14:21 879次阅读
    RK3506<b class='flag-5'>开发</b>板Xenomai内核RT-<b class='flag-5'>Linux</b>实时性<b class='flag-5'>系统</b>适配教程与性能实测,实测仅7μs稳定延时

    迅为RK3568开发板新增topeet子系统-在产品中新增子系统

    build/subsystem_config.json文件中增加名为topeet的子系统,在3.4节已经新建了topeet 文件夹存放子系统代码。添加 topeet 子系统进行一个登记,说明
    发表于 06-16 10:43

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入
    的头像 发表于 05-29 14:05 832次阅读
    迅为RK3568<b class='flag-5'>开发</b>板驱动指南GPIO<b class='flag-5'>子系统</b>GPIO<b class='flag-5'>子系统</b>API函数的引入

    迅为RK3568开发板驱动指南GPIO子系统三级节点操作函数实验

    迅为RK3568开发板驱动指南GPIO子系统三级节点操作函数实验
    的头像 发表于 05-26 15:39 1266次阅读
    迅为RK3568<b class='flag-5'>开发</b>板驱动指南GPIO<b class='flag-5'>子系统</b>三级节点操作函数实验

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验
    的头像 发表于 05-23 13:47 741次阅读
    RK3568驱动指南|第十二篇 GPIO<b class='flag-5'>子系统</b>-第135章 GPIO<b class='flag-5'>子系统</b>与pinctrl<b class='flag-5'>子系统</b>相结合实验

    Linux权限管理基础入门

    Linux的广阔天空中,权限管理犹如一只翱翔的雄鹰,掌控着系统的安全与秩序。掌握Linux权限,不仅能让你的系统管理更加得心应手,还能有效防止未授权访问和数据泄露。本文将带你深入探索
    的头像 发表于 05-06 13:44 549次阅读
    <b class='flag-5'>Linux</b>权限管理基础<b class='flag-5'>入门</b>

    如何将FX3与WSL(Linux 的 Windows 子系统)一起使用?

    如何将 FX3 与 WSL(Linux 的 Windows 子系统)一起使用? 我在 /dev/ 中找不到任何设备 我有许多项目在 Windows 上使用VISUAL STUDIO项目进行操作,因此请验证该设备是否在 Windows 上运行。
    发表于 05-06 07:11

    Linux系统进程管理入门指南

    Linux 系统中,进程是正在运行的程序的实例。理解进程的管理、查看和控制对于系统管理员和开发者来说非常重要
    的头像 发表于 04-22 14:34 853次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>系统</b>进程管理<b class='flag-5'>入门</b>指南

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-input子系统之input子系统简介

    设备。总的来说,Input子系统提供了一个标准化的框架,用于管理和处理各种输入设备。它使得开发者可以方便地编写应用程序来处理用户输入,并且支持各种不同类型的输入设备。这使得Linux系统
    发表于 04-15 10:42

    飞凌嵌入式ElfBoard ELF 1板卡-input子系统之input子系统简介

    设备。总的来说,Input子系统提供了一个标准化的框架,用于管理和处理各种输入设备。它使得开发者可以方便地编写应用程序来处理用户输入,并且支持各种不同类型的输入设备。这使得Linux系统
    发表于 04-15 10:27

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系统之GPIO子系统

    GPIO(General Purpose Input/Output)子系统是用于控制和管理通用输入/输出引脚的一部分。它提供了一种标准化的方式来访问和操作硬件平台上的GPIO引脚,使开发人员能够通过
    发表于 03-25 13:29

    飞凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系统之GPIO子系统

    GPIO(General Purpose Input/Output)子系统是用于控制和管理通用输入/输出引脚的一部分。它提供了一种标准化的方式来访问和操作硬件平台上的GPIO引脚,使开发人员能够通过
    发表于 03-24 15:41

    详解deepin 25 Preview的Distrobox子系统

    为解决根社区仓库部分软件包缺失,或版本不满足用户需求的问题,deepin 结合 Distrobox 方案,在商店上架了 Debian、Ubuntu、Arch Linux、 Fedora 子系统镜像
    的头像 发表于 01-24 09:15 2025次阅读
    详解deepin 25 Preview的Distrobox<b class='flag-5'>子系统</b>