GPIO в Linux

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

GPIO в Linux

Непрочитанное сообщение Olej » 31 мар 2018, 12:38

Это сильно любопытно и ... показательно - Linux: кнопки, светодиоды и GPIO:
Начиная с версии 2.6.26 (кажется) у Linux появляется стандартный интерфейс для работы с GPIO через sysfs. В оригинале прочитать об этом можно в [LGPIO00]. Я попытаюсь пересказать своими словами содержимое этого документа.
И далее в заметке достаточно подробно описывается использование GPIO в Linux:
Главной точкой работы с GPIO является директория /sys/class/gpio. Если вы загляните в нее, то увидите два файла: export и unexport. Сразу после загрузки системы, все линии GPIO принадлежат ядру и использовать их в своих программах просто так не получится. Для этого, линию GPIO нужно экспортировать, записав её номер в файл export.
...
Изображение
Почему и зачем я написал это сообщение и почему это "любопытно"?
1. Потому что это мир достаточно серьёзных технических проектов (а проекты Linux - это очень серьёзно :) ) заимствует идеологию Arduino и включает её (как вариант) в арсенал своих возможностей;
2. Теперь все и любые Arduino-решения можно переносить в среду Linux, для выполнения на стандартном компьютере (с аппаратным GPIO расширение, естественно) и на всех одноплатных мини- и микро- Rasbery Pi и еже с ними;
3. Некоторые из известных мировых брендов в области производства компьютерных (системных) плат уже начали производить модели для embedded (встроенных) систем, имеющие изначально на борту GPIO расширения и наборы пинов, конструктив,но совместимые с Arduino - см. по этому поводу тему Старшие модели

И, как всегда, конечно, в этой бочке мёда есть ложка дёгтя, и состоит она в том, что:
4. В технологию/идеологию/архитектуру Arduino начинают/начнут приходить профессионалы разработчики ... и многим радиолюбителям-самоделкиным, даже подрабатывающим коммерчески на этом поприще - прийдёт край .. той части этого сообщества, которые больше из самоучек, не имеющих более-менее сносного образования в требуемых технических дисциплинах.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: GPIO в Linux

Непрочитанное сообщение Olej » 31 мар 2018, 12:39

Olej писал(а): 3. Некоторые из известных мировых брендов в области производства компьютерных (системных) плат уже начали производить модели для embedded (встроенных) систем, имеющие изначально на борту GPIO расширения и наборы пинов, конструктив,но совместимые с Arduino
Вот такие вот:
Изображение
Для работы с ним как Arduino они используют какую-то новую модификацию стандартов Arduino 101 - Getting Started with Arduino 101.
Который поддерживается и свежими версиями Arduino IDE - Getting Started with the Arduino/Genuino 101
Но что потребует установки "Инструменты" -> "Платы" -> "Менеджер плат":
Изображение

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: GPIO в Linux

Непрочитанное сообщение Olej » 15 июн 2018, 12:44

Olej писал(а): Вот такие вот:
Изображение
Но если в мире Intel x86 процессоров и одноплатных компьютеров (SBC, single-board computer) GPIO - это ещё редкость, экзотика, то в мире ARM процессоров, работающих в Linux, SBS - это правило, присутствуют практически во всех моделях.
Но это заслуживает отдельного рассмотрения, и про это будет новый раздел форума: Одноплатные компьютеры.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: GPIO в Linux

Непрочитанное сообщение Olej » 22 ноя 2018, 18:43

Olej писал(а): Но это заслуживает отдельного рассмотрения, и про это будет новый раздел форума: Одноплатные компьютеры.
Но что уж точно заслуживает отдельного упоминания, так это пакет пользовательского пространства WiringOP для работы с GPIO.
Он пришёл из Rapsberry Pi, но дальше портирован в Orange Pi и другие места.
Описание здесь: Установка и настройка WiringOP/WiringPi на Orange Pi PC (и ещё во множестве сходных мест):
Что такое WiringPi и WiringOP?
WiringPi это GPIO библиотека написана @drogon-ом, первоначально для Raspberry Pi, но Orange Pi модифицировали и адаптировали её под свои мини компьютеры и называли её WiringOP, где OP — сокращение от Orange Pi. Подробнее о библиотеке WiringPi можно узнать на сайте разработчика http://wiringpi.com/.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: GPIO в Linux

Непрочитанное сообщение Olej » 25 авг 2022, 13:33

Возвращаюсь снова к GPIO ... в связи с модули ядра (римэйк)
GPIO = General-Purpose Input/Output.
Главным образом GPIO доступно в одноплатных компьютерах ... поэтому и тема была здесь: GPIO с конкретными целями...
Olej писал(а):
15 июн 2018, 12:44
в мире ARM процессоров, работающих в Linux, SBS - это правило, присутствуют практически во всех моделях.
Но теперь, в связи с общими разборками с GPIO API и т.д. - тему разумно продолжить здесь ... чтобы не делать новую.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: GPIO в Linux

Непрочитанное сообщение Olej » 25 авг 2022, 16:40

Olej писал(а):
25 авг 2022, 13:33
в связи с общими разборками с GPIO API и т.д.
1. Старый интерфейс к GPIO (старый здесь - вовсе не значит устаревший, просто он появился по времени раньше!) - через /sys: Linux: кнопки, светодиоды и GPIO
2014-09-09
Начиная с версии 2.6.26 (кажется) у Linux появляется стандартный интерфейс для работы с GPIO через sysfs.
GPIO Programming: Using the sysfs Interface

2. Новый интерфейс к GPIO - через символьные устройства в /dev - Control GPIO using the new Linux user space GPIO API
01/10/2020
From the version 4.8, the Linux kernel introduces a new user space API based on character devices for managing and controlling GPIOs ( General-Purpose Input/Output). This post presents the basic of the new interface as well as a simple tutorial/example to demonstrate how to use the new API to control GPIOs.
3. Командный интерфейс CLI команд для диагностики и управления линиями GPIO.

4. Программный kernel API GPIO (<linux/gpio.h>) - Legacy GPIO Interfaces
This provides an overview of GPIO access conventions on Linux.
These calls use the gpio_* naming prefix. No other calls should use that prefix, or the related __gpio_* prefix.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: GPIO в Linux

Непрочитанное сообщение Olej » 25 авг 2022, 16:56

Olej писал(а):
25 авг 2022, 16:40
1. Старый интерфейс к GPIO
Компьютер:

Код: Выделить всё

olej@orangepione:~/2022/kernel/examples/GPIO$ inxi -M
Machine:   Type: ARM Device System: Xunlong Orange Pi One details: Allwinner sun8i Family rev: N/A 
           serial: 02c000815fd5e717 
Вот с этого - что вообще в вашем SoC есть GPIO чип и его поддержка:

Код: Выделить всё

olej@orangepione:~/2022/kernel/examples/GPIO$ ls -l /dev/gpio*
crw------- 1 root root 254, 0 июл 22 17:17 /dev/gpiochip0
crw------- 1 root root 254, 1 июл 22 17:17 /dev/gpiochip1
Вот весь его интерфейс управления:

Код: Выделить всё

root@orangepione:/# ls -l /sys/class/gpio
итого 0
--w------- 1 root root 4096 авг 25 01:42 export
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w------- 1 root root 4096 авг 25 16:52 unexport
Здесь 2 чипа. У каждого из них число линий:

Код: Выделить всё

olej@orangepione:~/2022/kernel/examples/GPIO$ cat /sys/class/gpio/gpiochip0/ngpio
224

Код: Выделить всё

olej@orangepione:~/2022/kernel/examples/GPIO$ cat /sys/class/gpio/gpiochip352/ngpio
32
(Позже мы в новом интерфейсе посмотрим относительно линий.)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: GPIO в Linux

Непрочитанное сообщение Olej » 25 авг 2022, 17:22

Olej писал(а):
25 авг 2022, 16:56
Здесь 2 чипа. У каждого из них число линий:
Всё управление делаем в терминалн от root!
Пишем номер линии которая нас интересует в export:

Код: Выделить всё

root@orangepione:/# echo 18 > /sys/class/gpio/export
И получаем целый подкаталог для управления этой линией:

Код: Выделить всё

root@orangepione:/# ls -l /sys/class/gpio
итого 0
--w------- 1 root root 4096 авг 25 17:04 export
lrwxrwxrwx 1 root root    0 авг 25 17:04 gpio18 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio18
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w------- 1 root root 4096 авг 25 17:04 unexport

Код: Выделить всё

root@orangepione:/# ls -lL /sys/class/gpio/gpio18
итого 0
-rw-r--r-- 1 root root 4096 авг 25 17:04 active_low
drwxr-xr-x 4 root root    0 авг 25 01:23 device
-rw-r--r-- 1 root root 4096 авг 25 17:04 direction
-rw-r--r-- 1 root root 4096 авг 25 17:04 edge
drwxr-xr-x 2 root root    0 авг 25 17:04 power
drwxr-xr-x 2 root root    0 авг 25 01:10 subsystem
-rw-r--r-- 1 root root 4096 авг 25 17:04 uevent
-rw-r--r-- 1 root root 4096 авг 25 17:04 value
Первейшим делом определяем/переопределяем направление данных in или out ... по умолчанию только-что подключенная линия стоит в in:

Код: Выделить всё

root@orangepione:/# cat /sys/class/gpio/gpio18/direction
in
Можем поменять:

Код: Выделить всё

root@orangepione:/# echo out > /sys/class/gpio/gpio18/direction

root@orangepione:/# cat /sys/class/gpio/gpio18/direction 
out
Читаем и пишем (если out) в имя value:

Код: Выделить всё

root@orangepione:/# cat /sys/class/gpio/gpio18/value 
0

root@orangepione:/# echo 1 > /sys/class/gpio/gpio18/value 

root@orangepione:/# cat /sys/class/gpio/gpio18/value 
1

root@orangepione:/# echo 0 > /sys/class/gpio/gpio18/value 

root@orangepione:/# cat /sys/class/gpio/gpio18/value 
0
Когда нам это надоест :lol: будет не нужна эта линия - убираем её из экспорта:

Код: Выделить всё

root@orangepione:/# echo 18 > /sys/class/gpio/unexport
Всё! Нет такой линии!:

Код: Выделить всё

root@orangepione:/# ls -l /sys/class/gpio
итого 0
--w------- 1 root root 4096 авг 25 17:04 export
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w------- 1 root root 4096 авг 25 17:19 unexport
Простенько и со вкусом.
Сразу понятно, что целой кучей дискретных вводов-выводов таким образом можно управлять хоть из bash, хоть из C/C++/Go, хоть из Python ... - любым инструментом.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: GPIO в Linux

Непрочитанное сообщение Olej » 25 авг 2022, 17:33

Olej писал(а):
25 авг 2022, 17:22
Простенько и со вкусом.
Чего не понимаю...

Код: Выделить всё

root@orangepione:/# cat /sys/class/gpio/gpiochip*/ngpio
224
32
Диагностика показывает число линий 224 + 32?
Смотрим:

Код: Выделить всё

root@orangepione:/# ls -l /sys/class/gpio
итого 0
--w------- 1 root root 4096 авг 25 17:04 export
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w------- 1 root root 4096 авг 25 17:19 unexport

Код: Выделить всё

root@orangepione:/# echo 0 > /sys/class/gpio/export

root@orangepione:/# echo 21 > /sys/class/gpio/export

root@orangepione:/# echo 22 > /sys/class/gpio/export
bash: echo: ошибка записи: Устройство или ресурс занято
И так - для всех номеров >21, т.е. 0...21 - всего 22 линии:

Код: Выделить всё

root@orangepione:/# ls -l /sys/class/gpio
итого 0
--w------- 1 root root 4096 авг 25 17:27 export
lrwxrwxrwx 1 root root    0 авг 25 17:27 gpio0 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio0
lrwxrwxrwx 1 root root    0 авг 25 17:27 gpio21 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio21
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 авг 25 01:10 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w------- 1 root root 4096 авг 25 17:25 unexport
Ну и как выглядит каждая линия:

Код: Выделить всё

root@orangepione:/# tree /sys/class/gpio/gpio0
/sys/class/gpio/gpio0
├── active_low
├── device -> ../../../gpiochip0
├── direction
├── edge
├── power
│   ├── autosuspend_delay_ms
│   ├── control
│   ├── runtime_active_time
│   ├── runtime_status
│   └── runtime_suspended_time
├── subsystem -> ../../../../../../../class/gpio
├── uevent
└── value
3 directories, 10 files

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: GPIO в Linux

Непрочитанное сообщение Olej » 25 авг 2022, 20:45

Olej писал(а):
25 авг 2022, 16:40
3. Командный интерфейс CLI команд для диагностики и управления линиями GPIO.
В Orange Pi One обнаруживаем:

Код: Выделить всё

root@orangepione:/usr/bin# ls /bin/*gpio*
/bin/gpiodetect  /bin/gpiofind  /bin/gpioget  /bin/gpioinfo  /bin/gpiomon  /bin/gpioset

Код: Выделить всё

root@orangepione:/usr/bin# ls /usr/bin/*gpio*
/usr/bin/gpiodetect  /usr/bin/gpiofind  /usr/bin/gpioget  /usr/bin/gpioinfo  /usr/bin/gpiomon  /usr/bin/gpioset

Код: Выделить всё

root@orangepione:/usr/bin# gpiodetect --help
Usage: gpiodetect [OPTIONS]
List all GPIO chips, print their labels and number of GPIO lines.

Options:
  -h, --help:           display this message and exit
  -v, --version:        display the version and exit

Код: Выделить всё

root@orangepione:/usr/bin# gpiodetect
gpiochip0 [1c20800.pinctrl] (224 lines)
gpiochip1 [1f02c00.pinctrl] (32 lines)

Код: Выделить всё

root@orangepione:/usr/bin# gpioinfo --help
Usage: gpioinfo [OPTIONS] <gpiochip1> ...
Print information about all lines of the specified GPIO chip(s) (or all gpiochips if none are specified).

Options:
  -h, --help:           display this message and exit
  -v, --version:        display the version and exit

Код: Выделить всё

root@orangepione:/usr/bin# gpioinfo gpiochip1
gpiochip1 - 32 lines:
    line   0:      unnamed       unused   input  active-high
    line   1:      unnamed       unused   input  active-high
    line   2:      unnamed  "usb0-vbus"  output  active-high [used]
    line   3:      unnamed        "sw4"   input   active-low [used]
    line   4:      unnamed       unused   input  active-high
    line   5:      unnamed       unused   input  active-high
    line   6:      unnamed   "vdd-cpux"  output  active-high [used]
    line   7:      unnamed       unused   input  active-high
    line   8:      unnamed       unused   input  active-high
    line   9:      unnamed       unused   input  active-high
    line  10:      unnamed "orangepi:green:pwr" output active-high [used]
    line  11:      unnamed       unused   input  active-high
    line  12:      unnamed       unused   input  active-high
    line  13:      unnamed       unused   input  active-high
    line  14:      unnamed       unused   input  active-high
    line  15:      unnamed       unused   input  active-high
    line  16:      unnamed       unused   input  active-high
    line  17:      unnamed       unused   input  active-high
    line  18:      unnamed       unused   input  active-high
    line  19:      unnamed       unused   input  active-high
    line  20:      unnamed       unused   input  active-high
    line  21:      unnamed       unused   input  active-high
    line  22:      unnamed       unused   input  active-high
    line  23:      unnamed       unused   input  active-high
    line  24:      unnamed       unused   input  active-high
    line  25:      unnamed       unused   input  active-high
    line  26:      unnamed       unused   input  active-high
    line  27:      unnamed       unused   input  active-high
    line  28:      unnamed       unused   input  active-high
    line  29:      unnamed       unused   input  active-high
    line  30:      unnamed       unused   input  active-high
    line  31:      unnamed       unused   input  active-high

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя