chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux 開發(fā)IIO子系統(tǒng)入門

工程師 ? 來源:一口Linux ? 作者:一口Linux ? 2020-10-27 10:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

Linux 驅動開發(fā) / IIO子系統(tǒng)入門1

正文目錄:

1. 什么是 IIO 子系統(tǒng)? 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 子系統(tǒng)的入門知識。

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

1.1 IIO 概述

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

簡單框圖:

支持的設備包括:

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

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

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

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

1.2 IIO 相關的組件

IIO-overview

上圖基于 STM32 MPU,來源見文末。

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

該組件會使用 libiio 庫來配置 IIO 設備,然后從 IIO 設備讀數據或者寫數據到 IIO 設備中??蛻舳顺绦蚩梢约毞譃?local client 和 remote client。

2) libiio 庫(用戶空間):

libiio 是 Analog Device 公司發(fā)起的一個用于訪問 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 子系統(tǒng)的 API 來編寫符合自身框架的設備驅動。

例如在 iio 子系統(tǒng)里支持了某款 Soc ADC 后,可能會有不同的硬件設備接到該 ADC 通道上,典型的例子是觸摸芯片,開發(fā)人員需要在 input 子系統(tǒng)的框架下編寫 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 子系統(tǒng)的核心實現(xiàn)。

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

7) Linux 內核自帶的 IIO 調試工具:

2. IIO 的功能特性

1) 基礎的設備注冊和訪問

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

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

類似于 input 子系統(tǒng),iio 子系統(tǒng)也可以向應用層上報事件(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() 中被引用,它表明繼承了當前節(jié)點的子節(jié)點可以引用當前節(jié)點的 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 節(jié)點的形式是 《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 節(jié)點的 #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 子系統(tǒng)里是可選非必要的;

標準的文件 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 節(jié)點可用于讀寫寄存器;

4.1.2 操作實例

IIO direct mode: 通過 sysfs 以輪循的方式讀 ADC 或者寫 DAC:

1) 直接讀 ADC

確定 sysfs 節(jié)點(方式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 節(jié)點(方式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》

本文只是一篇入門的文章,仍然有許多細節(jié)的知識點沒有被描述到。如果本文能讓你對 IIO 子系統(tǒng)有個大概的認識,那么本文的目的也就算達成了,以后還會繼續(xù)寫更多 IIO 子系統(tǒng)的文章。

責任編輯:haq

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

    關注

    27

    文章

    9370

    瀏覽量

    155147
  • adc
    adc
    +關注

    關注

    100

    文章

    7451

    瀏覽量

    553836
  • Linux
    +關注

    關注

    88

    文章

    11628

    瀏覽量

    218015
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【免費送書】成為硬核Linux開發(fā)者:《Linux 設備驅動開發(fā)(第 2 版)》

    Linux系統(tǒng)的設備驅動開發(fā),一直給人門檻較高的印象,主要因內核機制抽象、需深度理解硬件原理、開發(fā)調試難度大所致。2021年,一本講解驅動開發(fā)
    的頭像 發(fā)表于 11-18 08:06 ?465次閱讀
    【免費送書】成為硬核<b class='flag-5'>Linux</b><b class='flag-5'>開發(fā)</b>者:《<b class='flag-5'>Linux</b> 設備驅動<b class='flag-5'>開發(fā)</b>(第 2 版)》

    【書籍評測活動NO.67】成為硬核Linux開發(fā)者:《Linux 設備驅動開發(fā)(第 2 版)》

    景化應用的完整體系。從Linux內核開發(fā)的環(huán)境搭建、模塊編程,到設備樹、總線驅動,再到內存優(yōu)化、DMA 技術,最后到IIO、GPIO、輸入子系統(tǒng)實戰(zhàn),每一篇都以前一篇為基礎,既適合零基
    發(fā)表于 11-17 17:52

    RK3506開發(fā)板Xenomai內核RT-Linux實時性系統(tǒng)適配教程與性能實測,實測僅7μs穩(wěn)定延時

    本文基于觸覺智能RK3506核心板/開發(fā)板,介紹Xenomai內核RT-Linux實時性系統(tǒng)適配,并附性能實測。簡介與實測數據Xenomai簡介XEnomai是一個實時子系統(tǒng),可與
    的頭像 發(fā)表于 09-18 14:21 ?903次閱讀
    RK3506<b class='flag-5'>開發(fā)</b>板Xenomai內核RT-<b class='flag-5'>Linux</b>實時性<b class='flag-5'>系統(tǒng)</b>適配教程與性能實測,實測僅7μs穩(wěn)定延時

    迅為RK3568開發(fā)板新增topeet子系統(tǒng)-在產品中新增子系統(tǒng)

    build/subsystem_config.json文件中增加名為topeet的子系統(tǒng),在3.4節(jié)已經新建了topeet 文件夾存放子系統(tǒng)代碼。添加 topeet 子系統(tǒng)進行一個登記,說明
    發(fā)表于 06-16 10:43

    迅為RK3568開發(fā)板驅動指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數的引入

    迅為RK3568開發(fā)板驅動指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數的引入
    的頭像 發(fā)表于 05-29 14:05 ?840次閱讀
    迅為RK3568<b class='flag-5'>開發(fā)</b>板驅動指南GPIO<b class='flag-5'>子系統(tǒng)</b>GPIO<b class='flag-5'>子系統(tǒng)</b>API函數的引入

    迅為RK3568開發(fā)板驅動指南GPIO子系統(tǒng)三級節(jié)點操作函數實驗

    迅為RK3568開發(fā)板驅動指南GPIO子系統(tǒng)三級節(jié)點操作函數實驗
    的頭像 發(fā)表于 05-26 15:39 ?1280次閱讀
    迅為RK3568<b class='flag-5'>開發(fā)</b>板驅動指南GPIO<b class='flag-5'>子系統(tǒng)</b>三級節(jié)點操作函數實驗

    RK3568驅動指南|第十二篇 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結合實驗

    RK3568驅動指南|第十二篇 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結合實驗
    的頭像 發(fā)表于 05-23 13:47 ?749次閱讀
    RK3568驅動指南|第十二篇 GPIO<b class='flag-5'>子系統(tǒng)</b>-第135章 GPIO<b class='flag-5'>子系統(tǒng)</b>與pinctrl<b class='flag-5'>子系統(tǒng)</b>相結合實驗

    Linux權限管理基礎入門

    Linux的廣闊天空中,權限管理猶如一只翱翔的雄鷹,掌控著系統(tǒng)的安全與秩序。掌握Linux權限,不僅能讓你的系統(tǒng)管理更加得心應手,還能有效防止未授權訪問和數據泄露。本文將帶你深入探索
    的頭像 發(fā)表于 05-06 13:44 ?556次閱讀
    <b class='flag-5'>Linux</b>權限管理基礎<b class='flag-5'>入門</b>

    如何將FX3與WSL(Linux 的 Windows 子系統(tǒng))一起使用?

    如何將 FX3 與 WSL(Linux 的 Windows 子系統(tǒng))一起使用? 我在 /dev/ 中找不到任何設備 我有許多項目在 Windows 上使用VISUAL STUDIO項目進行操作,因此請驗證該設備是否在 Windows 上運行。
    發(fā)表于 05-06 07:11

    Linux系統(tǒng)進程管理入門指南

    Linux 系統(tǒng)中,進程是正在運行的程序的實例。理解進程的管理、查看和控制對于系統(tǒng)管理員和開發(fā)者來說非常重要
    的頭像 發(fā)表于 04-22 14:34 ?861次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>進程管理<b class='flag-5'>入門</b>指南

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)之input子系統(tǒng)簡介

    設備??偟膩碚f,Input子系統(tǒng)提供了一個標準化的框架,用于管理和處理各種輸入設備。它使得開發(fā)者可以方便地編寫應用程序來處理用戶輸入,并且支持各種不同類型的輸入設備。這使得Linux系統(tǒng)
    發(fā)表于 04-15 10:42

    飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)之input子系統(tǒng)簡介

    設備??偟膩碚f,Input子系統(tǒng)提供了一個標準化的框架,用于管理和處理各種輸入設備。它使得開發(fā)者可以方便地編寫應用程序來處理用戶輸入,并且支持各種不同類型的輸入設備。這使得Linux系統(tǒng)
    發(fā)表于 04-15 10:27

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之GPIO子系統(tǒng)

    GPIO(General Purpose Input/Output)子系統(tǒng)是用于控制和管理通用輸入/輸出引腳的一部分。它提供了一種標準化的方式來訪問和操作硬件平臺上的GPIO引腳,使開發(fā)人員能夠通過
    發(fā)表于 03-25 13:29

    飛凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系統(tǒng)之GPIO子系統(tǒng)

    GPIO(General Purpose Input/Output)子系統(tǒng)是用于控制和管理通用輸入/輸出引腳的一部分。它提供了一種標準化的方式來訪問和操作硬件平臺上的GPIO引腳,使開發(fā)人員能夠通過
    發(fā)表于 03-24 15:41

    詳解deepin 25 Preview的Distrobox子系統(tǒng)

    為解決根社區(qū)倉庫部分軟件包缺失,或版本不滿足用戶需求的問題,deepin 結合 Distrobox 方案,在商店上架了 Debian、Ubuntu、Arch Linux、 Fedora 子系統(tǒng)鏡像
    的頭像 發(fā)表于 01-24 09:15 ?2032次閱讀
    詳解deepin 25 Preview的Distrobox<b class='flag-5'>子系統(tǒng)</b>