IIO DATA ACCESS IIO數據獲取 只有兩種方法可以使用IIO框架訪問數據; 通過sysf通道進行一次性捕獲,或通過IIO字元設備進行連續模式(觸發緩衝)。 One-shot capture:單次獲取 一次性數據捕獲通過sysfs介面完成。 通過讀取與通道對應的sysfs條目,您將僅捕獲 ...
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獲得。