日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式微處理器
[導(dǎo)讀]前陣子工作上做了一些關(guān)于 ADC 的支持,由于現(xiàn)在 ADC 相關(guān)的支持都被移動到了 IIO (Industrial I/O) 子系統(tǒng)下,我查閱了一些關(guān)于 IIO 資料,包括書籍、文章、內(nèi)核文檔和代碼。個人感覺最好的入門文章應(yīng)該是 ST WiKi 網(wǎng)站上 的 IIO Overview(2019) 和 Analog



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

Linux 驅(qū)動開發(fā) / IIO子系統(tǒng)入門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è)備樹
    3.2.1 IIO providers
    3.2.2 IIO consumers
4. IIO API
  4.1 用戶空間 API
    4.1.1 4種接口
    4.1.2 操作實(shí)例
5. 更多值得學(xué)習(xí)的知識點(diǎn)
6. 相關(guān)參考
寫作目的:
  • 整理一些 IIO 子系統(tǒng)的入門知識。

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

1.1 IIO 概述

Industrial I/O 子系統(tǒng)旨在為某種意義上是模數(shù)或數(shù)模轉(zhuǎn)換器 (ADC,DAC) 的設(shè)備提供支持,于2009年由 Huawei 的 Jonathan Cameront 添加。
簡單框圖:
支持的設(shè)備包括:
    
ADC / DAC
加速度計
磁力計
陀螺儀
壓力傳感器
濕度傳感器
溫度傳感器
...
很久以前,對于上述硬件的支持散落在 Linux 源碼中的各種地方。
IIO 的出現(xiàn),提供了一個統(tǒng)一的框架用于訪問和控制上述各種類型的傳感器,并且為用戶態(tài)應(yīng)用訪問傳感器提供了標(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,來源見文末。
1) 客戶端應(yīng)用程序(用戶空間):

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

libiio 是 Analog Device 公司發(fā)起的一個用于訪問 IIO 設(shè)備的開源庫。
它封裝了對 /sys/bus/iio/devices(配置 iio) 和 /dev/iio/deviceX(讀寫iio) 的訪問,并且提供了便于測試的 iio 命令行工具 (iio_info / iio_readdev) 和 iiod server
iiod server 內(nèi)含 local backend 和 remote backend 以支持 local client 和 remote client 的訪問。
libiio 的源碼位于:github libiio
3) 訪問接口(用戶空間):
iio 支持多種標(biāo)準(zhǔn)的 Linux 設(shè)備訪問接口:
char device, sysfs, configfs, debugfs。
4) 內(nèi)核空間的 iio 消費(fèi)者(即 IIO consumers):

除了用戶空間的應(yīng)用程序能訪問 iio 設(shè)備之外,在內(nèi)核里也有其他設(shè)備驅(qū)動需要使用 iio 子系統(tǒng)的 API 來編寫符合自身框架的設(shè)備驅(qū)動。
例如在 iio 子系統(tǒng)里支持了某款 Soc ADC 后,可能會有不同的硬件設(shè)備接到該 ADC 通道上,典型的例子是觸摸芯片,開發(fā)人員需要在 input 子系統(tǒng)的框架下編寫 touch driver,在 touch driver的 irq handler 中 調(diào)用 iio in-kern API 來讀取觸摸屏的 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 的功能特性

相關(guān)參考:
  • Linux-4.14/drivers/staging/iio/Documentation/overview.txt
1) 基礎(chǔ)的設(shè)備注冊和訪問
  • 類似于 hwmon 子系統(tǒng),它們都可以通過 sysfs 以輪循的方式訪問設(shè)備;
2) 可讀取事件的字符設(shè)備(Event chrdevs)
  • 類似于 input 子系統(tǒng),iio 子系統(tǒng)也可以向應(yīng)用層上報事件(hardware triggered events),例如閾值檢測事件,自由落體檢測事件、更復(fù)雜的動作檢測事件;

  • 目前 event 的格式為:event code + 時間戳;

3) 支持硬件 buffer
4) 支持 Trigger 和軟件 buffer

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

3.1 配置內(nèi)核

Linux-4.14:
    
$ make menuconfig
Device 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ù)目來看,IIO 的用途真的很廣泛。

3.2 配置設(shè)備樹

相關(guān)參考:
  • Linux-4.14/Documentation/devicetree/bindings/iio/iio-bindings.txt

3.2.1 IIO providers

1) 相關(guān)要點(diǎn):
  • IIO channels 源在設(shè)備樹中用 IIO providers 來指定;
2) 必要屬性:
  • io-channel-cells,0 表示只有 1 路 IIO output,1 表示有多路 IIO output;

  • io-channel-ranges: 一個 empty 屬性(即不用賦值),會在 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 個或者多個 cells 的數(shù)組,用于確定 IIO device的 output 端,即 1 個 cell 對應(yīng)一個 IIO channel output;

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

2) 必要屬性:
  • io-channels: <phandle iio_specifier> 列表, 一個 <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 會將該名稱和 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

  • 可用于輪循的方式低速地直接讀/寫 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ì)說明:

    • Documentation/ABI/testing/configfs-iio;
    • Documentation/iio/iio_configfs.txt;
4). debugfs
  • 一些調(diào)試功能,例如 direct_reg_access 節(jié)點(diǎn)可用于讀寫寄存器;

4.1.2 操作實(shí)例

IIO direct mode: 通過 sysfs 以輪循的方式讀 ADC 或者寫 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 對應(yīng) ADC1;
    
$ cd /sys/bus/iio/devices/iio:device0/
$ cat in_voltage6_raw      # Convert ADC1 channel  0 (analog-to-digital): get raw value
40603
$ cat in_voltage_scale     # Read scale
0.044250488
$ cat in_voltage_offset    # Read offset
0
$ awk  "BEGIN{printf (\"%d\n\", (40603 + 0) * 0.044250488)}"
1796  
計算公式: Scaled value = (raw + offset) * scale = 1796 mV;
2) 直接寫 DAC
確定 sysfs 節(jié)點(diǎn)(方式2)
    
$ lsiio | grep dac
Device  00340017000.dac:dac@ 1
Device  00440017000.dac:dac@ 2
sysfs 中的 iio:device3 sysfs 對應(yīng) DAC1,lsiio 來源于Linux 內(nèi)核源碼(tools/iio/)。
    
$ cd /sys/bus/iio/devices/iio:device3/
$ cat out_voltage1_scale              # Read scale
0.708007812
$ awk  "BEGIN{printf (\"%d\n\", 2000 / 0.708007812)}"  # 假設(shè)要輸出  2000 mV
2824
$ 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í)的知識點(diǎn)

  • 以 timer triggers 和 buffers 的方式讀 ADC 或者寫 DAC;
  • IIO 內(nèi)核空間 API;
  • 編寫 IIO device driver
  • 編寫 IIO consumer driver
  • ...
鑒于大多數(shù)人的注意力無法在一篇文章里上集中太久,更多的內(nèi)容請大家先自行去閱讀吧,不是自己理解到的東西是消化不了的。有機(jī)會的話我會把更多的讀書心得放在后面的文章。

6. 相關(guān)參考

  • IIO Overview
  • Linux Industrial I/O Subsystem
  • 《Linux Device Drivers Development》
本文只是一篇入門的文章,仍然有許多細(xì)節(jié)的知識點(diǎn)沒有被描述到。如果本文能讓你對 IIO 子系統(tǒng)有個大概的認(rèn)識,那么本文的目的也就算達(dá)成了,以后還會繼續(xù)寫更多 IIO 子系統(tǒng)的文章。知識的學(xué)習(xí)應(yīng)該是螺旋上升的,找到一條平緩的學(xué)習(xí)路線很重要,先有一個整體的概念,然后再不斷地去豐富細(xì)節(jié)會比較好一點(diǎn)。就好像爬山一樣,相對于幾千米的高山,人類看起來總是顯得多么的渺小,但是只要每天平穩(wěn)地走幾百個階梯,再高的山也能在不知不覺中走完。

本文授權(quán)轉(zhuǎn)載自公眾號“嵌入式Hacker”,作者吳偉東Jack


-END-




推薦閱讀



【01】數(shù)學(xué)對于編程來說重要嗎?編程大佬現(xiàn)身說“線性代數(shù)”
【02】學(xué)不好后悔一輩子:刨根問底之鏈表數(shù)據(jù)結(jié)構(gòu)
【03】精彩!由FPGA觸發(fā)的芯片戰(zhàn)爭!
【04】12條CPU硬核干貨!最全解釋!
【05】史上最經(jīng)典的“史密斯圓圖”講解

免責(zé)聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉