Модуль gpio-rotary encoder на armbian
Энкодер или датчик угла поворота — это электромеханическое устройство, предназначенное для преобразования углового положения вала или оси в электрические сигналы.

тестировал на Armbian_5.75_Orangepipc_Ubuntu_bionic_next_4.19.20
uname -a
Linux orangepipc 4.19.20-sunxi #5.75 SMP Sat Feb 9 19:02:47 CET 2019 armv7l armv7l armv7l GNU/Linux
обновим нашу систему и ставим headers
wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-dtb-dev-sunxi_5.75_armhf.deb
wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-headers-dev-sunxi_5.75_armhf.deb
wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-image-dev-sunxi_5.75_armhf.deb
dpkg -i *.deb
reboot
apt update && apt list --upgradable && apt upgrade -y
uname -a
Linux orangepipc 4.20.7-sunxi #5.75 SMP Fri Feb 8 09:02:10 CET 2019 armv7l armv7l armv7l GNU/Linux
в linux-headers-4.20.7-sunxi есть ошибка, для исправления надо создать пустой файл
source «net/wireguard/Kconfig» и запустить make scripts в папке /usr/src/linux-headers-4.20.7-sunxi
mkdir -p /usr/src/linux-headers-4.20.7-sunxi/net/wireguard
touch /usr/src/linux-headers-4.20.7-sunxi/net/wireguard/Kconfig
cd /usr/src/linux-headers-4.20.7-sunxi
make scripts
cd
Использовал драйвер ядра gpio-keys (для кнопки энкодера) и драйвер ядра rotary-encoder,
по умолчанию в armbian, модуль rotary-encoder не установлен.
компилируем и ставим модуль rotary-encoder :
git clone https://github.com/ua3nbw-cf/rotary_encoder.git
cd rotary_encoder
make all install
компилируем и ставим оверлей gpio-rotary.dts:
armbian-add-overlay gpio-rotary.dts
reboot
в файле /boot/armbianEnv.txt появится строка: user_overlays=gpio-rotary
в папке /boot/overlay-user появится файл: gpio-rotary.dtbo
в файле /etc/udev/rules.d/90-devinput-rotary.rules строки:
SUBSYSTEM=="input", MODE="666"
SUBSYSTEMS=="input", ATTRS{name}=="rotary_axis", SYMLINK+="input/rotary_axis"
SUBSYSTEMS=="input", ATTRS{name}=="rotary_button", SYMLINK+="input/rotary_button"
проверка:
dmesg | grep rotary
root@orangepipc:~# dmesg | grep rotary
[ 9.346633] input: rotary_button as /devices/platform/rotary_button/input/input0
[ 9.356333] rotary_encoder: loading out-of-tree module taints kernel.
[ 9.357242] rotary-encoder rotary_axis: gray
[ 9.377227] input: rotary_axis as /devices/platform/rotary_axis/input/input2
cat /sys/kernel/debug/gpio | grep rotary
root@orangepipc:~# cat /sys/kernel/debug/gpio | grep rotary
gpio-200 ( |rotary_axis ) in hi IRQ ACTIVE LOW
gpio-201 ( |rotary_axis ) in hi IRQ ACTIVE LOW
ls -la /dev/input | grep rotary
root@orangepipc:~# ls -la /dev/input | grep rotary
lrwxrwxrwx 1 root root 6 Feb 17 15:58 rotary_axis -> event2
lrwxrwxrwx 1 root root 6 Feb 17 15:58 rotary_button -> event0
Тестируем.
энкодер подключаем к контактам 32 («PG8») и 36 («PG9») гребенки, общий вывод к 34 контакту.
evtest /dev/input/rotary_axis
вращение енкодера по часовой стрелке и против часовой:
вывод команды evtest /dev/input/rotary_axis:
root@orangepipc:~# evtest /dev/input/rotary_axis
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0
Input device name: "rotary_axis"
Supported events:
Event type 0 (EV_SYN)
Event type 2 (EV_REL)
Event code 1 (REL_Y)
Properties:
Testing ... (interrupt to exit)
Event: time 1550422364.373974, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1550422364.373974, -------------- SYN_REPORT ------------
Event: time 1550422364.488588, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1550422364.488588, -------------- SYN_REPORT ------------
Event: time 1550422364.651093, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1550422364.651093, -------------- SYN_REPORT ------------
Event: time 1550422365.439925, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1550422365.439925, -------------- SYN_REPORT ------------
Event: time 1550422365.656337, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1550422365.656337, -------------- SYN_REPORT ------------
Event: time 1550422365.727505, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1550422365.727505, -------------- SYN_REPORT ------------
кнопку энкодера подключаем к контактам 7 («PA6») гребенки, и к 9 контакту гребенки.
evtest /dev/input/rotary_button
вывод команды при нажатии кнопки энкодера:
root@orangepipc:~# evtest /dev/input/rotary_button
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "rotary_button"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 99 (KEY_SYSRQ)
Properties:
Testing ... (interrupt to exit)
Event: time 1550424346.724098, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 1
Event: time 1550424346.724098, -------------- SYN_REPORT ------------
Event: time 1550424346.912050, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 0
Event: time 1550424346.912050, -------------- SYN_REPORT ------------
Видим, что все события энкодера генерирует ядро.