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

IIO DATA ACCESS IIO數據獲取git

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

One-shot capture:單次獲取框架

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

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

  經過將比例乘以原始值來得到處理值。spa

  Voltage value: 6646 * 0.305175781 = 2028.19824053code

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

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得到。
相關文章
相關標籤/搜索