Linux設備驅動之IIO子系統——IIO框架數據讀取


IIO DATA ACCESS IIO數據獲取

  只有兩種方法可以使用IIO框架訪問數據; 通過sysf通道進行一次性捕獲,或通過IIO字符設備進行連續模式(觸發緩沖)。

One-shot capture:單次獲取

  一次性數據捕獲通過sysfs接口完成。 通過讀取與通道對應的sysfs條目,您將僅捕獲特定於該通道的數據。 給定一個帶有兩個通道的溫度傳感器:一個用於環境溫度,另一個用於熱電偶溫度:

# cd /sys/bus/iio/devices/iio:device0
# cat in_voltage3_raw
6646
# cat in_voltage_scale
0.305175781

  通過將比例乘以原始值來獲得處理值。

  Voltage value: 6646 * 0.305175781 = 2028.19824053

  器件數據表說過程值以mV給出。 在我們的例子中,它對應於2.02819V。

Buffer data access:緩沖區數據獲取

  要使觸發的采集工作,必須在驅動程序中實現觸發器支持。 然后,要從用戶空間內獲取數據,必須:創建觸發器,分配它,啟用ADC通道,設置緩沖區的維度,並啟用它。這里主要介紹兩種:sysfs觸發器和hrtimer觸發器。

使用sysfs觸發器獲取:

  使用sysfs觸發器捕獲數據包括發送一組命令少量sysfs文件。 讓我們列舉一下我們應該做些什么來實現這一目標:

1. 創建觸發器:在將觸發器分配給任何設備之前,應該創建它:

# echo 0 > /sys/devices/iio_sysfs_trigger/add_trigger

這里,0對應於我們需要分配給觸發器的索引。 在此命令之后,觸發器目錄將在/ sys / bus / iio / devices /下作為trigger0。

 

2. 將觸發器分配給設備:觸發器由其名稱唯一標識,我們可以使用該觸發器將設備綁定到觸發器。 由於我們使用0作為索引,因此觸發器將命名為sysfstrig0:

# echo sysfstrig0 > /sys/bus/iio/devices/iio:device0/trigger/current_t

  我們也可以使用下面這個命令:cat /sys/bus/iio/devices/trigger0/name> /sys/bus/iio/devices/iio:device0/trigger/current_trigger. 也就是說,如果我們編寫的值與現有的觸發器名稱不對應,則不會發生任何事情。 為了確保我們真正定義了一個觸發器,我們可以使用cat/sys/bus/iio/devices/iio:device0/trigger/current_trigger.

3. 啟用掃描元素:此步驟包括選擇將其數據值推入緩沖區的通道。 應該注意驅動程序中的available_scan_masks:

# echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage4_en
 # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage5_en
 # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage6_en
 # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage7_en

4. 設置緩沖區大小:這里應該設置緩沖區可以保存的樣本集數量:

# echo 100 > /sys/bus/iio/devices/iio:device0/buffer/length

5. 啟用緩沖區:此步驟包括將緩沖區標記為准備接收推送數據:

# echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable

要停止捕獲,我們必須在同一個文件中寫入0。

6.使能觸發器:啟動采集:

# echo 1 > /sys/bus/iio/devices/trigger0/trigger_now

現在數據獲取已經完成,下一步我們可以

7. 禁用緩沖區:

# echo 0 > /sys/bus/iio/devices/iio:device0/buffer/enable

8.分離觸發器Detach the trigger:

  # echo "" > /sys/bus/iio/devices/iio:device0/trigger/current_trigger

9.轉儲IIO字符設備的內容

  # cat /dev/iio\:device0 | xxd –

 

 

使用hrtimer觸發器獲取(4.5及以上內核版本)

  以下是允許使用hrtimer觸發器捕獲數據的命令集:

# echo /sys/kernel/config/iio/triggers/hrtimer/trigger0
 # echo 50 > /sys/bus/iio/devices/trigger0/sampling_frequency
 # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage4_en
 # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage5_en
 # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage6_en
 # echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage7_en
 # echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable
 # cat /dev/iio:device0 | xxd -

 0000000: 0188 1a30 0000 0000 8312 68a8 c24f 5a14 ...0......h..OZ.
  0000010: 0188 1a30 0000 0000 192d 98a9 c24f 5a14 ...0.....-...OZ.
  [...]

然后,我們查看類型以確定如何處理數據:

$ cat /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage_type

be:s14/16>>2

Voltage processing: 0x188 >> 2 = 98 * 250 = 24500 = 24.5 v

 

IIO tools

  您可以使用一些有用的工具來簡化和加快使用IIO設備開發應用程序的速度。 它們在內核樹中的tools / iio中可用:

  • lsiio.c:枚舉IIO觸發器,設備和通道
  • iio_event_monitor.c: 監視IIO設備的IIO事件的ioctl接口
  • generic_buffer.c: 檢索,處理和打印從IIO設備緩沖區接收的數據
  • libiio: 一個功能強大的庫,由模擬設備開發,用於接口IIO設備,可從https://github.com/analogdevicesinc/libiio獲得。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM