2 posts tagged

Device Tree

Кнопки на GPIO Mainline Linux OrangePi

Мы можем использовать GPIO (линии ввода/вывода общего назначения ) и с минимальными ресурсами отслеживать изменения на линии GPIO.
Также мы можем запустить любой скрипт или программу с помощью кнопок подключённых к GPIO.
тестировал на mainline ядре 4.14.15-sunxi

Пример подключения пяти нормально разомкнутых кнопок:

использовал драйвер gpio-keys
ставим хидеры ядра, в терминале:

apt upgrade

armbian-config -> Software -> Headers

по умолчанию в armbian, модуль gpio-keys не установлен.
ставим модуль gpio-keys :

git clone https://github.com/ua3nbw-cf/gpio-keys
cd gpio-keys
make all install

вот фрагмент оверлея gpio-keys.dts из папки gpio-keys

g-keys_up {
					label = "GPIO KEY_UP";
					linux,code = <103>; /* KEY_UP, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 7 1>; /* PA7 GPIO_ACTIVE_LOW */
				};

				g-keys_down {
					label = "GPIO KEY_DOWN";
					linux,code = <108>; /* KEY_DOWN, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 8 1>; /* PA8 GPIO_ACTIVE_LOW */
				};

				g-keys_left {
					label = "GPIO KEY_LEFT";
					linux,code = <105>; /* KEY_LEFT, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 9 1>; /* PA9 GPIO_ACTIVE_LOW */
				};

				g-keys_right {
					label = "GPIO KEY_RIGHT";
					linux,code = <106>; /* KEY_RIGHT, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 10 1>; /* PA10 GPIO_ACTIVE_LOW */
				};
				g-keys_enter {
					label = "GPIO KEY_ENTER";
					linux,code = <28>; /* KEY_ENTER, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 21 1>; /* PA21 GPIO_ACTIVE_LOW */
				};

можно менять linux,code и gpios
компилируем:

armbian-add-overlay gpio-keys.dts
reboot

проверяем:

cat /sys/kernel/debug/gpio
evtest

в моём случае device event number 1 (gpio-keys-user)

готово, кнопки подключённые к GPIO дублируют кнопки обычной клавиатуры.

Компилируем демон, который будет следить за нажатиями

git clone https://github.com/elopez/keybinder.git
cd keybinder
make install

проверяем:

keybinder /dev/input/event1

event1 это мой event номер один, у вас event может быть другой.
жмакаем кнопки которые подключили к GPIO
Идем /etc/ правим keybinder.conf
для примера опять моргаем светодиодами на плате

28,reboot
103,echo heartbeat | sudo tee "/sys/class/leds/orangepi:red:status/trigger"
105,echo none | sudo tee "/sys/class/leds/orangepi:red:status/trigger"
106,echo heartbeat | sudo tee "/sys/class/leds/orangepi:green:pwr/trigger"
108,echo none | sudo tee "/sys/class/leds/orangepi:green:pwr/trigger"

.....................................................................

Для автозапуска после перезагрузки
Идем /etc/ правим rc.local ……………..
до строки exit
добавляем строку

/usr/local/bin/keybinder /dev/input/event1 >/dev/null &

Device Tree Mainline Linux

2018   armbian   Device Tree   GPIO   overlay

Device Tree Mainline Linux

Дерево устройств (ДУ) представляет собой структуру данных для описания оборудования. Mainline Linux использует его для активации и настройки драйверов, доступных в ядре.
В Linux есть механизм для определения подключенных устройств – Device Tree. Это список всех устройств подключенных к компьютеру. Ядро подгружает его при старте и настраивает все устройства согласно настройкам в файле.

«Оверлеями» называются частичные, «опциональные» ДУ.
Оверлей состоит из нескольких фрагментов, каждый из которых нацелен на какой-то конкретный нод (и его суб-ноды). Хотя эта концепция выглядит довольно просто, сам синтаксис на первый взгляд может показаться довольно странным.
Вот оверлей включающий пины (PA11,PA12) GPIO при начале загрузки,
использовал драйвер gpio-leds,
создаём файл you-overlay.dts и вставляем код:

/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun8i-h3";

	fragment@0 {
		target = <&pio>;
		__overlay__ {
			gpio_pin: gpio_pin {
				pins = "PA11","PA12";
				function = "gpio_out";
			};
		};
	};

	fragment@1 {
		target-path = "/";
		__overlay__ {
			gpiopull: gpiopull {
				compatible = "gpio-leds";
				pinctrl-names = "default";
				pinctrl-0 = <&gpio_pin>;
				status = "okay";
				gpio_out_11 {
					label = "GPIO PIN_11";
					gpios = <&pio 0 11 0>;  /* PA11 GPIO_ACTIVE_LOW */
				};
				gpio_out_12 {
					label = "GPIO PIN_12";
					gpios = <&pio 0 12 1>;  /* PA12 GPIO_ACTIVE_HI */
				};

			};
		};
	};
};

ставим хидеры ядра,
как поставить описал в начале этого поста: Кнопки на GPIO Mainline Linux OrangePi

Компилируем:

armbian-add-overlay you-overlay.dts
reboot

проверка:

cat /sys/kernel/debug/gpio

если установлен WiringOtherPi ввести команду: gpio readall:

Raspberry Pi:Настройка/Деревья устройств, оверлеи и параметры

2018   armbian   Device Tree   OrangePI PC   overlay