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獲得。