понедельник, 22 августа 2016 г.

Чтение значения ADC с платы BBB

BBB имеет восемь встроенных пинов АЦП. Для того, чтобы на BBB появились соответствующие устройства, надо включить сборку следующих модулей при конфигурировании ядра (у меня 4.1.0-rc1-bone0):

1) ti_am335x_tscadc.ko(CONFIG_MFD_TI_AM335X_TSCADC);
2) ti_am335x_adc.ko(CONFIG_TI_AM335X_ADC). 


Модули лучше сделать встроенными (build-in): соответствующие опции будут выделены звездочкой (*). Модуль adc зависит от tscadc, поэтому настойки типа сборки касаются сразу всех модулей.

Необходимые опции menuconfig: 

1) ti_am335x_adc.ko(CONFIG_TI_AM335X_ADC)

Device Drivers --->
 [*] Industrial I/O support --->
   [*] Enable buffer support within IIO
   <*> Industrial I/O lock free software ring
     Analog to digital converters --->
       <*> TI's AM335X ADC driver


2) ti_am335x_tscadc.ko(CONFIG_MFD_TI_AM335X_TSCADC)

Device Drivers --->
  Multifunction device drivers --->
    <*> TI ADC / Touch Screen chip support

В device tree для корректной работы adc надо внести следующие исправления:

1) файл bb-kernel/KERNEL/arch/arm/boot/dts/am33xx.dtsi :

...
tscadc: tscadc@44e0d000 { compatible = "ti,am3359-tscadc"; reg = <0x44e0d000 0x1000>; interrupt-parent = <&intc>; interrupts = <16>; ti,hwmods = "adc_tsc"; status = "okay"; tsc { compatible = "ti,am3359-tsc"; }; adc { compatible = "ti,am3359-adc"; ti,adc-channels = <0 1 2 3 4 5 6 7>; }; };
...

В результате после загрузки в директории /sys/bus/iio/devices/iio:device0  должны появиться устройства in_voltage0_raw,  in_voltage1_raw ... , in_voltage7_raw:

cd /sys/bus/iio/devices/iio:device0
ls -la

Вывод:

root@arm:/sys/bus/iio/devices/iio:device0# ls -la
total 0
drwxr-xr-x 5 root root    0 Jan  1 00:03 .
drwxr-xr-x 4 root root    0 Jan  1 00:03 ..
drwxr-xr-x 2 root root    0 Jan  1 00:03 buffer
-r--r--r-- 1 root root 4096 Jan  1 00:03 dev
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage0_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage1_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage2_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage3_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage4_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage5_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage6_raw
-rw-r--r-- 1 root root 4096 Jan  1 00:03 in_voltage7_raw
-r--r--r-- 1 root root 4096 Jan  1 00:03 name
lrwxrwxrwx 1 root root    0 Jan  1 00:03 of_node -> ../../../../../../firmware/devicetree/base/ocp/tscadc@44e0d000/adc
drwxr-xr-x 2 root root    0 Jan  1 00:03 power
drwxr-xr-x 2 root root    0 Jan  1 00:03 scan_elements
lrwxrwxrwx 1 root root    0 Jan  1 00:03 subsystem -> ../../../../../../bus/iio
-rw-r--r-- 1 root root 4096 Jan  1 00:03 uevent


Получение данных с первого из восьми встроенных АЦП:

cd /sys/bus/iio/devices/iio:device0
cat ./in_voltage0_raw

Вывод:
6

Источники:
1) http://processors.wiki.ti.com/index.php/AM335x_ADC_Driver's_Guide
2) http://beagleboard.org/support/BoneScript/potentiometer/
3) https://www.linux.com/learn/how-get-analog-input-beaglebone-black
4) https://www.youtube.com/watch?v=ncHVFsxGy9w