0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux 開(kāi)發(fā)IIO子系統(tǒng)入門(mén)

工程師 ? 來(lái)源:一口Linux ? 作者:一口Linux ? 2020-10-27 10:44 ? 次閱讀

前陣子工作上做了一些關(guān)于 ADC 的支持,由于現(xiàn)在 ADC 相關(guān)的支持都被移動(dòng)到了 IIO (Industrial I/O) 子系統(tǒng)下,我查閱了一些關(guān)于 IIO 資料,包括書(shū)籍、文章、內(nèi)核文檔和代碼。個(gè)人感覺(jué)最好的入門(mén)文章應(yīng)該是 ST WiKi 網(wǎng)站上 的 IIO Overview(2019) 和Analog Device Wiki 網(wǎng)站上的 Linux Industrial I/O Subsystem(2017),為了方便愛(ài)偷懶或者英文不好的小伙伴,我提煉了多篇文章的精華內(nèi)容并在其基礎(chǔ)上進(jìn)行完善,盡量控制篇幅,希望能給大家提供一點(diǎn)小小的幫助。

Linux 驅(qū)動(dòng)開(kāi)發(fā) / IIO子系統(tǒng)入門(mén)1

正文目錄:

1. 什么是 IIO 子系統(tǒng)? 1.1 IIO 概述 1.2 IIO 相關(guān)的組件2. IIO 功能特性3. IIO 相關(guān)配置 3.1 配置內(nèi)核 3.2 配置設(shè)備樹(shù) 3.2.1 IIO providers 3.2.2 IIO consumers4. IIO API 4.1 用戶空間 API 4.1.1 4種接口 4.1.2 操作實(shí)例5. 更多值得學(xué)習(xí)的知識(shí)點(diǎn)6. 相關(guān)參考

寫(xiě)作目的:

整理一些 IIO 子系統(tǒng)的入門(mén)知識(shí)。

1. 什么是 IIO 子系統(tǒng)?

1.1 IIO 概述

Industrial I/O 子系統(tǒng)旨在為某種意義上是模數(shù)或數(shù)模轉(zhuǎn)換器 (ADC,DAC) 的設(shè)備提供支持,于2009年由 Huawei 的 Jonathan Cameront 添加。

簡(jiǎn)單框圖:

支持的設(shè)備包括:

ADC / DAC加速度計(jì)磁力計(jì)陀螺儀壓力傳感器濕度傳感器溫度傳感器。。.

很久以前,對(duì)于上述硬件的支持散落在 Linux 源碼中的各種地方。

IIO 的出現(xiàn),提供了一個(gè)統(tǒng)一的框架用于訪問(wèn)和控制上述各種類型的傳感器,并且為用戶態(tài)應(yīng)用訪問(wèn)傳感器提供了標(biāo)準(zhǔn)的接口:sysfs/devfs,并且填補(bǔ)了 Hwmon 和 Input 子系統(tǒng)之間的空白。

另外,IIO 不僅可以支持低速的 SoC ADC,還可支持高速、高數(shù)據(jù)速率的工業(yè)設(shè)備,例如 100M samples/sec 工業(yè) ADC。

1.2 IIO 相關(guān)的組件

IIO-overview

上圖基于 STM32 MPU,來(lái)源見(jiàn)文末。

1) 客戶端應(yīng)用程序(用戶空間):

該組件會(huì)使用 libiio 庫(kù)來(lái)配置 IIO 設(shè)備,然后從 IIO 設(shè)備讀數(shù)據(jù)或者寫(xiě)數(shù)據(jù)到 IIO 設(shè)備中。客戶端程序可以細(xì)分為 local client 和 remote client。

2) libiio 庫(kù)(用戶空間):

libiio 是 Analog Device 公司發(fā)起的一個(gè)用于訪問(wèn) IIO 設(shè)備的開(kāi)源庫(kù)。

它封裝了對(duì) /sys/bus/iio/devices(配置 iio) 和/dev/iio/deviceX(讀寫(xiě)iio) 的訪問(wèn),并且提供了便于測(cè)試的 iio 命令行工具 (iio_info / iio_readdev) 和 iiod server。

iiod server 內(nèi)含 local backend 和 remote backend 以支持 local client 和 remote client 的訪問(wèn)。

libiio 的源碼位于:github libiio

3) 訪問(wèn)接口(用戶空間):

iio 支持多種標(biāo)準(zhǔn)的 Linux 設(shè)備訪問(wèn)接口:

char device, sysfs, configfs, debugfs。

4) 內(nèi)核空間的 iio 消費(fèi)者(即 IIO consumers):

除了用戶空間的應(yīng)用程序能訪問(wèn) iio 設(shè)備之外,在內(nèi)核里也有其他設(shè)備驅(qū)動(dòng)需要使用 iio 子系統(tǒng)的 API 來(lái)編寫(xiě)符合自身框架的設(shè)備驅(qū)動(dòng)。

例如在 iio 子系統(tǒng)里支持了某款 Soc ADC 后,可能會(huì)有不同的硬件設(shè)備接到該 ADC 通道上,典型的例子是觸摸芯片,開(kāi)發(fā)人員需要在 input 子系統(tǒng)的框架下編寫(xiě) touch driver,在 touch driver的 irq handler 中 調(diào)用 iio in-kern API 來(lái)讀取觸摸屏的 X、Y 值。

iio in-kernl API的定義位于頭文件:

include/linux/iio/consumer.h

5) IIO framework(內(nèi)核空間):

IIO 子系統(tǒng)的核心實(shí)現(xiàn)。

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

7) Linux 內(nèi)核自帶的 IIO 調(diào)試工具:

2. IIO 的功能特性

1) 基礎(chǔ)的設(shè)備注冊(cè)和訪問(wèn)

類似于 hwmon 子系統(tǒng),它們都可以通過(guò) sysfs 以輪循的方式訪問(wèn)設(shè)備;

2) 可讀取事件的字符設(shè)備(Event chrdevs)

類似于 input 子系統(tǒng),iio 子系統(tǒng)也可以向應(yīng)用層上報(bào)事件(hardware triggered events),例如閾值檢測(cè)事件,自由落體檢測(cè)事件、更復(fù)雜的動(dòng)作檢測(cè)事件;

目前 event 的格式為:event code + 時(shí)間戳;

3) 支持硬件 buffer

4) 支持 Trigger 和軟件 buffer

3. IIO 相關(guān)配置

3.1 配置內(nèi)核

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 ---》

從配置項(xiàng)的數(shù)目來(lái)看,IIO 的用途真的很廣泛。

3.2 配置設(shè)備樹(shù)

3.2.1 IIO providers

1) 相關(guān)要點(diǎn):

IIO channels 源在設(shè)備樹(shù)中用 IIO providers 來(lái)指定;

2) 必要屬性:

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

io-channel-ranges: 一個(gè) empty 屬性(即不用賦值),會(huì)在 driver/iio/inkern.c/iio_channel_get() 中被引用,它表明繼承了當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)可以引用當(dāng)前節(jié)點(diǎn)的 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) 相關(guān)要點(diǎn):

IIO consumer 節(jié)點(diǎn)的形式是 《phandle iio_specifier》;

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

其中,phandle 是 IIO provider 的句柄,specifier 用于選擇第幾路 channel;

類似 gpio specifier, IIO specifier 是有 1 個(gè)或者多個(gè) cells 的數(shù)組,用于確定 IIO device的 output 端,即 1 個(gè) cell 對(duì)應(yīng)一個(gè) IIO channel output;

IIO specifier 數(shù)組的長(zhǎng)度由 IIO provider 節(jié)點(diǎn)的 #io-channel-cells 屬性決定;

2) 必要屬性:

io-channels:《phandle iio_specifier》 列表, 一個(gè)《phandle iio_specifier》 代表該設(shè)備連接著的一路 IIO input。如果 IIO provider 的 io-channel-cells=0 (即只有1路 IIO output), 則省略 iio_specifier。

3) 可選屬性:

io-channel-names: IIO input 的名稱列表,順序要和 io-channels 屬性保持一致,Consumers drivers 會(huì)將該名稱和 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

相關(guān)參考:

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

可用于輪循的方式低速地直接讀/寫(xiě) IIO 設(shè)備;

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

2)。 character device

/dev/iio:deviceX,該接口在 IIO 子系統(tǒng)里是可選非必要的;

標(biāo)準(zhǔn)的文件 IO API: open(), read(), write(), close()。

用于讀取 events 和 data;

3)。 configfs

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

詳細(xì)說(shuō)明:

Documentation/ABI/testing/configfs-iio;

Documentation/iio/iio_configfs.txt;

4)。 debugfs

一些調(diào)試功能,例如 direct_reg_access 節(jié)點(diǎn)可用于讀寫(xiě)寄存器;

4.1.2 操作實(shí)例

IIO direct mode: 通過(guò) sysfs 以輪循的方式讀 ADC 或者寫(xiě) DAC:

1) 直接讀 ADC

確定 sysfs 節(jié)點(diǎn)(方式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 對(duì)應(yīng) 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

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

2) 直接寫(xiě) DAC

確定 sysfs 節(jié)點(diǎn)(方式2)

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

sysfs 中的 iio:device3 sysfs 對(duì)應(yīng) DAC1,lsiio 來(lái)源于Linux 內(nèi)核源碼(tools/iio/)。

$ cd /sys/bus/iio/devices/iio:device3/$ cat out_voltage1_scale # Read scale0.708007812$ awk “BEGIN{printf (\”%d\n\“, 2000 / 0.708007812)}” # 假設(shè)要輸出 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. 更多值得學(xué)習(xí)的知識(shí)點(diǎn)

以 timer triggers 和 buffers 的方式讀 ADC 或者寫(xiě) DAC;

IIO 內(nèi)核空間 API;

編寫(xiě) IIO device driver

編寫(xiě) IIO consumer driver

鑒于大多數(shù)人的注意力無(wú)法在一篇文章里上集中太久,更多的內(nèi)容請(qǐng)大家先自行去閱讀吧,不是自己理解到的東西是消化不了的。有機(jī)會(huì)的話我會(huì)把更多的讀書(shū)心得放在后面的文章。

6. 相關(guān)參考

IIO Overview

Linux Industrial I/O Subsystem

《Linux Device Drivers Development》

本文只是一篇入門(mén)的文章,仍然有許多細(xì)節(jié)的知識(shí)點(diǎn)沒(méi)有被描述到。如果本文能讓你對(duì) IIO 子系統(tǒng)有個(gè)大概的認(rèn)識(shí),那么本文的目的也就算達(dá)成了,以后還會(huì)繼續(xù)寫(xiě)更多 IIO 子系統(tǒng)的文章。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    8607

    瀏覽量

    146743
  • adc
    adc
    +關(guān)注

    關(guān)注

    98

    文章

    6406

    瀏覽量

    543855
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11215

    瀏覽量

    208740
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【北京迅為】itop-龍芯2k1000開(kāi)發(fā)指南Linux基礎(chǔ)入門(mén)vim 編輯器

    【北京迅為】itop-龍芯2k1000開(kāi)發(fā)指南Linux基礎(chǔ)入門(mén)vim 編輯器
    的頭像 發(fā)表于 10-25 14:56 ?232次閱讀
    【北京迅為】itop-龍芯2k1000<b class='flag-5'>開(kāi)發(fā)</b>指南<b class='flag-5'>Linux</b>基礎(chǔ)<b class='flag-5'>入門(mén)</b>vim 編輯器

    【驅(qū)動(dòng)教程】iTOP-RK3568開(kāi)發(fā)板進(jìn)行講解第十三期,主要講解輸入子系統(tǒng),共計(jì)24 講

    驅(qū)動(dòng)視頻全新升級(jí),并持續(xù)更新~更全,思路更科學(xué),入門(mén)更簡(jiǎn)單。 迅為基于iTOP-RK3568開(kāi)發(fā)板進(jìn)行講解,本次更新內(nèi)容為第十三期,主要講解輸入子系統(tǒng),共計(jì)24 講。 學(xué)習(xí)鏈接 本期視頻教程已上傳至
    發(fā)表于 10-11 11:31

    深度解析linux時(shí)鐘子系統(tǒng)

    linux內(nèi)核中實(shí)現(xiàn)了一個(gè)CLK子系統(tǒng),用于對(duì)上層提供各模塊(例如需要時(shí)鐘信號(hào)的外設(shè),USB等)的時(shí)鐘驅(qū)動(dòng)接口,對(duì)下層提供具體SOC的時(shí)鐘操作細(xì)節(jié)。
    的頭像 發(fā)表于 09-29 16:46 ?251次閱讀
    深度解析<b class='flag-5'>linux</b>時(shí)鐘<b class='flag-5'>子系統(tǒng)</b>

    linux開(kāi)發(fā)板和單片機(jī)開(kāi)發(fā)的區(qū)別

    、PIC等,處理能力和內(nèi)存容量相對(duì)較低。 操作系統(tǒng) Linux開(kāi)發(fā)板通常使用Linux操作系統(tǒng),具有豐富的軟件資源和
    的頭像 發(fā)表于 08-30 15:30 ?574次閱讀

    Linux 驅(qū)動(dòng)開(kāi)發(fā)與應(yīng)用開(kāi)發(fā),你知道多少?

    一、Linux驅(qū)動(dòng)開(kāi)發(fā)與應(yīng)用開(kāi)發(fā)的區(qū)別開(kāi)發(fā)層次不同:Linux驅(qū)動(dòng)開(kāi)發(fā)主要是針對(duì)硬件設(shè)備進(jìn)行編程
    的頭像 發(fā)表于 08-30 12:16 ?532次閱讀
    <b class='flag-5'>Linux</b> 驅(qū)動(dòng)<b class='flag-5'>開(kāi)發(fā)</b>與應(yīng)用<b class='flag-5'>開(kāi)發(fā)</b>,你知道多少?

    linux--LED子系統(tǒng)一文讀懂

    Linux內(nèi)核中,LED子系統(tǒng)扮演著控制LED燈的核心角色,它通過(guò)一套規(guī)范化的驅(qū)動(dòng)架構(gòu),簡(jiǎn)化了LED驅(qū)動(dòng)程序的開(kāi)發(fā)流程,讓開(kāi)發(fā)者能夠更專注于功能實(shí)現(xiàn)而非硬件層面的復(fù)雜性。
    的頭像 發(fā)表于 08-02 16:09 ?2161次閱讀
    <b class='flag-5'>linux</b>--LED<b class='flag-5'>子系統(tǒng)</b>一文讀懂

    【出版發(fā)行】嵌入式系統(tǒng)原理與開(kāi)發(fā)——基于RISC-V和Linux系統(tǒng)

    【出版發(fā)行】嵌入式系統(tǒng)原理與開(kāi)發(fā)——基于RISC-V和Linux系統(tǒng)
    的頭像 發(fā)表于 07-26 08:36 ?248次閱讀
    【出版發(fā)行】嵌入式<b class='flag-5'>系統(tǒng)</b>原理與<b class='flag-5'>開(kāi)發(fā)</b>——基于RISC-V和<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>

    鴻蒙開(kāi)發(fā)圖形圖像:【圖形子系統(tǒng)

    圖形子系統(tǒng)主要包括UI組件、布局、動(dòng)畫(huà)、字體、輸入事件、窗口管理、渲染繪制等模塊,構(gòu)建基于輕量OS應(yīng)用框架滿足硬件資源較小的物聯(lián)網(wǎng)設(shè)備或者構(gòu)建基于標(biāo)準(zhǔn)OS的應(yīng)用框架滿足富設(shè)備的OpenHarmony系統(tǒng)應(yīng)用開(kāi)發(fā)。
    的頭像 發(fā)表于 03-23 16:50 ?589次閱讀
    鴻蒙<b class='flag-5'>開(kāi)發(fā)</b>圖形圖像:【圖形<b class='flag-5'>子系統(tǒng)</b>】

    鴻蒙開(kāi)發(fā)學(xué)習(xí):【驅(qū)動(dòng)子系統(tǒng)

    OpenHarmony驅(qū)動(dòng)子系統(tǒng)采用C面向?qū)ο缶幊棠P蜆?gòu)建,通過(guò)平臺(tái)解耦、內(nèi)核解耦,兼容不同內(nèi)核,提供了歸一化的驅(qū)動(dòng)平臺(tái)底座,旨在為開(kāi)發(fā)者提供更精準(zhǔn)、更高效的開(kāi)發(fā)環(huán)境,力求做到一次開(kāi)發(fā)
    的頭像 發(fā)表于 03-17 22:05 ?534次閱讀
    鴻蒙<b class='flag-5'>開(kāi)發(fā)</b>學(xué)習(xí):【驅(qū)動(dòng)<b class='flag-5'>子系統(tǒng)</b>】

    鴻蒙開(kāi)發(fā)實(shí)戰(zhàn):【包管理子系統(tǒng)

    包管理子系統(tǒng)負(fù)責(zé)應(yīng)用安裝包的管理,提供安裝包的信息查詢、安裝、更新、卸載和包信息存儲(chǔ)等能力
    的頭像 發(fā)表于 03-14 15:23 ?601次閱讀
    鴻蒙<b class='flag-5'>開(kāi)發(fā)</b>實(shí)戰(zhàn):【包管理<b class='flag-5'>子系統(tǒng)</b>】

    ARM嵌入式Linux 系統(tǒng)開(kāi)發(fā)入門(mén)到精通

    ARM嵌入式Linux 系統(tǒng)開(kāi)發(fā)入門(mén)到精通
    發(fā)表于 03-10 18:44

    迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南-輸入子系統(tǒng)

    迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)開(kāi)發(fā)指南-輸入子系統(tǒng)
    的頭像 發(fā)表于 02-23 15:11 ?753次閱讀
    迅為RK3568<b class='flag-5'>開(kāi)發(fā)</b>板驅(qū)動(dòng)<b class='flag-5'>開(kāi)發(fā)</b>指南-輸入<b class='flag-5'>子系統(tǒng)</b>

    盤(pán)點(diǎn)那些硬件+項(xiàng)目學(xué)習(xí)套件:STM32MP157 Linux開(kāi)發(fā)板及入門(mén)常見(jiàn)問(wèn)題解答

    Cortex-M4核,Cortex-A7核上可以跑Linux操作系統(tǒng),Cortex-M4核上可以跑FreeRTOS、RT-Thread等實(shí)時(shí)操作系統(tǒng)開(kāi)發(fā)板搭配仿真器(獨(dú)家配件可仿真A
    發(fā)表于 02-01 14:25

    arm開(kāi)發(fā)板如何安裝linux系統(tǒng)

    安裝Linux系統(tǒng)到ARM開(kāi)發(fā)板是一個(gè)復(fù)雜的過(guò)程,涉及到多個(gè)步驟和不同的工具。下面是一個(gè)詳實(shí)且細(xì)致的教程,包含了從準(zhǔn)備工作到最終啟動(dòng)Linux系統(tǒng)
    的頭像 發(fā)表于 01-24 14:19 ?2810次閱讀

    linux系統(tǒng)基礎(chǔ)入門(mén)教程

    Linux是一種開(kāi)源的操作系統(tǒng),它被廣泛應(yīng)用于服務(wù)器、嵌入式系統(tǒng)以及個(gè)人電腦上。本篇文章將帶領(lǐng)讀者從入門(mén)的角度,詳細(xì)介紹Linux
    的頭像 發(fā)表于 11-16 16:45 ?996次閱讀