GPIO

встраиваемые модели

Модераторы: Olej, vikos

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

GPIO

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

Поддержка GPIO со стороны системы описана здесь: GPIO в Linux.
Чаще всего (в образах Armbian) системная поддержка GPIO вкомпилирована в состав ядра, без модулей:

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

olej@orangepione:~$ lsmod | grep gpio
Но это всё нужно проверять!:

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

olej@orangepione:~$ cat /boot/config-4.14.48-sunxi | grep GPIO
CONFIG_ARCH_NR_GPIO=416
CONFIG_RFKILL_GPIO=m
CONFIG_MTD_NAND_GPIO=y
# CONFIG_MDIO_BUS_MUX_GPIO is not set
# CONFIG_KEYBOARD_GPIO is not set
# CONFIG_KEYBOARD_GPIO_POLLED is not set
# CONFIG_MOUSE_GPIO is not set
# CONFIG_INPUT_GPIO_BEEPER is not set
# CONFIG_INPUT_GPIO_TILT_POLLED is not set
CONFIG_INPUT_GPIO_DECODER=m
CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
CONFIG_SERIO_GPIO_PS2=m
CONFIG_I2C_ARB_GPIO_CHALLENGE=m
CONFIG_I2C_MUX_GPIO=m
# CONFIG_I2C_CBUS_GPIO is not set
# CONFIG_I2C_GPIO is not set
# CONFIG_SPI_GPIO is not set
CONFIG_PPS_CLIENT_GPIO=m
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
CONFIG_GPIOLIB=y
CONFIG_OF_GPIO=y
CONFIG_GPIOLIB_IRQCHIP=y
# CONFIG_DEBUG_GPIO is not set
CONFIG_GPIO_SYSFS=y
# Memory mapped GPIO drivers
# CONFIG_GPIO_74XX_MMIO is not set
CONFIG_GPIO_ALTERA=m
CONFIG_GPIO_AXP209=y
# CONFIG_GPIO_DWAPB is not set
# CONFIG_GPIO_FTGPIO010 is not set
# CONFIG_GPIO_GENERIC_PLATFORM is not set
# CONFIG_GPIO_GRGPIO is not set
# CONFIG_GPIO_MOCKUP is not set
# CONFIG_GPIO_MPC8XXX is not set
CONFIG_GPIO_SYSCON=m
# CONFIG_GPIO_XILINX is not set
# CONFIG_GPIO_ZEVIO is not set
# I2C GPIO expanders
# CONFIG_GPIO_ADP5588 is not set
# CONFIG_GPIO_ADNP is not set
# CONFIG_GPIO_MAX7300 is not set
# CONFIG_GPIO_MAX732X is not set
# CONFIG_GPIO_PCA953X is not set
CONFIG_GPIO_PCF857X=m
# CONFIG_GPIO_SX150X is not set
# CONFIG_GPIO_TPIC2810 is not set
# MFD GPIO expanders
# CONFIG_HTC_EGPIO is not set
# SPI GPIO expanders
# CONFIG_GPIO_74X164 is not set
# CONFIG_GPIO_MAX7301 is not set
# CONFIG_GPIO_MC33880 is not set
# CONFIG_GPIO_PISOSR is not set
# CONFIG_GPIO_XRA1403 is not set
# USB GPIO expanders
CONFIG_W1_MASTER_GPIO=m
CONFIG_POWER_RESET_GPIO=y
# CONFIG_POWER_RESET_GPIO_RESTART is not set
# CONFIG_CHARGER_GPIO is not set
CONFIG_SENSORS_GPIO_FAN=m
CONFIG_GPIO_WATCHDOG=m
# CONFIG_SSB_DRIVER_GPIO is not set
# CONFIG_BCMA_DRIVER_GPIO is not set
CONFIG_REGULATOR_GPIO=y
# CONFIG_IR_GPIO_CIR is not set
CONFIG_IR_GPIO_TX=m
CONFIG_BACKLIGHT_GPIO=m
# CONFIG_USB_GPIO_VBUS is not set
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_TRIGGER_GPIO=m
CONFIG_EXTCON_GPIO=m
CONFIG_EXTCON_USB_GPIO=m
CONFIG_MUX_GPIO=m
CONFIG_TRACING_EVENTS_GPIO=y
Из-за обилия различных образов-сборок (особенно для Orange Pi) там может быть всё что угодно...

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

Re: GPIO

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

Olej писал(а): Чаще всего (в образах Armbian) системная поддержка GPIO вкомпилирована в состав ядра, без модулей:
Это Orange Pi One & Armbian :

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

olej@orangepione:~$ tree /sys/class/gpio/gpio1/
/sys/class/gpio/gpio1/
├── 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@orangepione:~$ cat /sys/class/gpio/gpio1/active_low 
0

olej@orangepione:~$ cat /sys/class/gpio/gpio1/edge 
none

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

Re: GPIO

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

Olej писал(а): Чаще всего (в образах Armbian) системная поддержка GPIO вкомпилирована в состав ядра, без модулей:
Но что уж точно заслуживает отдельного упоминания, так это пакет пользовательского пространства WiringPi / 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

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

Olej писал(а): Но что уж точно заслуживает отдельного упоминания, так это пакет пользовательского пространства WiringPi / WiringOP для работы с GPIO.

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

olej@orangepione:~$ git clone https://github.com/zhaolei/WiringOP.git -b h3
Cloning into 'WiringOP'...
remote: Counting objects: 364, done.
remote: Total 364 (delta 0), reused 0 (delta 0), pack-reused 364
Receiving objects: 100% (364/364), 276.08 KiB | 211.00 KiB/s, done.
Resolving deltas: 100% (197/197), done.

olej@orangepione:~$ cd WiringOP/

olej@orangepione:~/WiringOP$ ls
build  COPYING.LESSER  debian  devLib  examples  gpio  INSTALL  Makefile  People  pins  README.md  wiringPi

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

olej@orangepione:~/WiringOP$ sudo ./build
[sudo] password for olej:
./build: 4: ./build: [[: not found
wiringPi Build script
=====================


WiringPi Library
[UnInstall]
[Compile] wiringPi.c
[Compile] wiringSerial.c
[Compile] wiringShift.c
[Compile] piHiPri.c
[Compile] piThread.c
[Compile] wiringPiSPI.c
[Compile] wiringPiI2C.c
[Compile] softPwm.c
[Compile] softTone.c
[Compile] softServo.c
[Compile] mcp23008.c
[Compile] mcp23016.c
[Compile] mcp23017.c
[Compile] mcp23s08.c
[Compile] mcp23s17.c
[Compile] sr595.c
[Compile] pcf8574.c
[Compile] pcf8591.c
[Compile] mcp3002.c
[Compile] mcp3004.c
[Compile] mcp4802.c
[Compile] mcp3422.c
[Compile] max31855.c
[Compile] max5322.c
[Compile] sn3218.c
[Compile] drcSerial.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]

WiringPi Devices Library
[UnInstall]
[Compile] ds1302.c
[Compile] maxdetect.c
[Compile] piNes.c
[Compile] gertboard.c
[Compile] piFace.c
[Compile] lcd128x64.c
[Compile] lcd.c
[Compile] piGlow.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]

GPIO Utility
[Compile] gpio.c
gpio.c:943:13: warning: ‘doGbr’ defined but not used [-Wunused-function]
 static void doGbr (int argc, char *argv [])
             ^~~~~
gpio.c:901:13: warning: ‘doGbw’ defined but not used [-Wunused-function]
 static void doGbw (int argc, char *argv [])
             ^~~~~
gpio.c:813:13: warning: ‘doPadDrive’ defined but not used [-Wunused-function]
 static void doPadDrive (int argc, char *argv [])
             ^~~~~~~~~~
[Compile] extensions.c
[Compile] readall.c
[Compile] pins.c
[Link]
[Install]

All Done.

NOTE: To compile programs with wiringBP v2, you need to add:
    -lwiringPi
  to your compile line(s) To use the Gertboard, MaxDetect, etc.
  code (the devLib), you need to also add:
    -lwiringPiDev
  to your compile line(s).
С предупреждениями, но может быть ... вы от них сами избавитесь...

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

Re: GPIO

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

Olej писал(а):С предупреждениями, но может быть ... вы от них сами избавитесь...

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

olej@orangepione:~/WiringOP$ gpio -v
gpio version: 2.20
Copyright (c) 2012-2014 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Banana Pro Details:
  Type: Banana Pro, Revision: 1.2, Memory: 1024MB, Maker: LeMaker

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

olej@orangepione:~/WiringOP$ gpio -v
gpio version: 2.20
Copyright (c) 2012-2014 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Banana Pro Details:
  Type: Banana Pro, Revision: 1.2, Memory: 1024MB, Maker: LeMaker

  
olej@orangepione:~/WiringOP$ gpio readall
 +-----+-----+----------+------+---+-Orange Pi+---+---+------+---------+-----+--+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 |     |     |     3.3v |      |   |  1 || 2  |   |      | 5v       |     |     |
 |  12 |   8 |    SDA.0 | ALT3 | 0 |  3 || 4  |   |      | 5V       |     |     |
 |  11 |   9 |    SCL.0 | ALT3 | 0 |  5 || 6  |   |      | 0v       |     |     |
 |   6 |   7 |   GPIO.7 | ALT3 | 0 |  7 || 8  | 0 | ALT3 | TxD3     | 15  | 13  |
 |     |     |       0v |      |   |  9 || 10 | 0 | ALT3 | RxD3     | 16  | 14  |
 |   1 |   0 |     RxD2 | ALT3 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1   | 1   | 110 |
 |   0 |   2 |     TxD2 | ALT3 | 0 | 13 || 14 |   |      | 0v       |     |     |
 |   3 |   3 |     CTS2 | ALT3 | 0 | 15 || 16 | 0 | ALT3 | GPIO.4   | 4   | 68  |
 |     |     |     3.3v |      |   | 17 || 18 | 0 | ALT3 | GPIO.5   | 5   | 71  |
 |  64 |  12 |     MOSI | ALT3 | 0 | 19 || 20 |   |      | 0v       |     |     |
 |  65 |  13 |     MISO | ALT3 | 0 | 21 || 22 | 0 | ALT3 | RTS2     | 6   | 2   |
 |  66 |  14 |     SCLK | ALT3 | 0 | 23 || 24 | 0 | ALT3 | CE0      | 10  | 67  |
 |     |     |       0v |      |   | 25 || 26 | 0 | ALT3 | GPIO.11  | 11  | 21  |
 |  19 |  30 |    SDA.1 | ALT3 | 0 | 27 || 28 | 0 | ALT3 | SCL.1    | 31  | 18  |
 |   7 |  21 |  GPIO.21 | ALT3 | 0 | 29 || 30 |   |      | 0v       |     |     |
 |   8 |  22 |  GPIO.22 | ALT3 | 0 | 31 || 32 | 0 | ALT3 | RTS1     | 26  | 200 |
 |   9 |  23 |  GPIO.23 | ALT3 | 0 | 33 || 34 |   |      | 0v       |     |     |
 |  10 |  24 |  GPIO.24 | ALT3 | 0 | 35 || 36 | 0 | ALT3 | CTS1     | 27  | 201 |
 |  20 |  25 |  GPIO.25 | ALT3 | 0 | 37 || 38 | 0 | ALT3 | TxD1     | 28  | 198 |
 |     |     |       0v |      |   | 39 || 40 | 0 | ALT3 | RxD1     | 29  | 199 |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+-Orange Pi+---+------+----------+-----+-----+
Таким образом пакет позволяет читать и писать по всем выводам GPIO.

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

Re: GPIO

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

Olej писал(а): Чаще всего (в образах Armbian) системная поддержка GPIO вкомпилирована в состав ядра, без модулей:
Для системного уровня поддержки GPIO такая вот проверочка:
- до ...

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

olej@orangepione:~$ ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 июн 11 15:46 export
lrwxrwxrwx 1 root root    0 июн 11 15:46 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 июн 11 15:46 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w------- 1 root root 4096 июн 11 15:46 unexport

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

olej@orangepione:~$ cat gpio.tst
for v in 1 2 3 4 5 6 7 8 9 10 11 12; do echo "$v" > /sys/class/gpio/export ; done

olej@orangepione:~$ sudo ./gpio.tst

- после...

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

olej@orangepione:~$ ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 июн 11 16:39 export
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio1 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio1
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio10 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio10
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio11 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio11
lrwxrwxrwx 1 root root    0 июн 11 16:39 gpio12 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio12
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio2 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio2
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio3 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio3
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio4 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio4
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio5 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio5
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio6 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio6
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio7 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio7
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio8 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio8
lrwxrwxrwx 1 root root    0 июн 11 16:40 gpio9 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio9
lrwxrwxrwx 1 root root    0 июн 11 15:46 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 июн 11 15:46 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w------- 1 root root 4096 июн 11 15:46 unexport

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

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

root@orangepione:~# echo $?
0

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

Re: GPIO

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

Описание здесь: Установка и настройка WiringOP/WiringPi на Orange Pi PC (и ещё во множестве сходных мест):
Так же (очень важно!) фрагменты программного кода на C, которые показывают как работать с GPIO из программы.
Мигание светодиодом является самой простой программой для управления пинами ввода/вывода на плате. Создайте файл с именем blink.c с содержанием:

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

#include <wiringPi.h>
int main (void) {
  wiringPiSetup();
  pinMode (0, OUTPUT) ;
  for (;;) {
    digitalWrite(0, HIGH);
    delay (500) ;
    digitalWrite(0, LOW);
    delay(500);
  }
  return 0;
}
Затем, для компиляции и запуска, вы должны выполнить следующие команды:

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

$ sudo gcc blink.c -o blink -lwiringPi -lpthread
$ sudo ./blink
Чтобы увидеть результат, вам нужно будет подключить один светодиод между CON3-11 и GND с резистором на 220 Ом для ограничения тока.

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

Re: GPIO

Непрочитанное сообщение Olej » 23 ноя 2018, 09:52

Olej писал(а):Таким образом пакет позволяет читать и писать по всем выводам GPIO.
И самое главное: утверждается, что пакет WiringOP обеспечивает поддержку GPIO из пространства пользователя (командой) даже если ядро собрано без поддержки или модуля:
Я смотрел исходники WiringOP: что то работает через sysfs, но в основном напрямую с регистрами процессора в обход и без участия драйвера.
Да и правда: WiringOP мы собирали из исходника, и, в конечном итоге, всё можно уточнить кому нужно.

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

Re: GPIO

Непрочитанное сообщение Olej » 23 ноя 2018, 10:30

Olej писал(а): Для системного уровня поддержки GPIO такая вот проверочка:
Описание работы с GPIO средствами системы (ядра) простенько, но в более чем достаточной мере, описано здесь: Linux: кнопки, светодиоды и GPIO.
Вернемся к нашему светодиоду. Следующий код на shell’е зажгет светодиод и погасит его через секунду.

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

# exporting and tuning GPIO line
echo 16 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio16/direction
# switch GPIO#16 on
echo 1 >  /sys/class/gpio/gpio16/value
# sleep 1 second
sleep 1
# switch GPIO#16 off
echo 0 >  /sys/class/gpio/gpio16/value
Теперь обратим внимание на файл active_low. Он определяет уровень активного сигнала — то есть, какое напряжение будет соответствовать логическому нулю, а какое – логической единице.

По умолчанию за логическую единицу (высокий уровень) принимается наличие на выводе некоторого напряжения (зависит от типа SoC’а, но обычно это +3.3В), а за ноль (низкий уровень) – отсутствие напряжения (замыкание линии на «землю»). Однако, это не всегда бывает удобно, так как некоторые сигналы могут быть инвертированы. Например, сигнал CS (Chip Select) производители микросхем любят делать так, что микросхема становиться активной когда на соответствующем выводе отсутствует напряжение, и перестает реагировать на внешние сигналы, если напряжение подать. Для управления этой настройкой, в файл active_low нужно записать символы ‘0’ — false или ‘1’ — true, в зависимости от того, хотим ли мы инвертировать активный сигнал или нет. По умолчанию там находится '0'.

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

Re: GPIO

Непрочитанное сообщение Olej » 23 ноя 2018, 10:33

Olej писал(а): Описание работы с GPIO средствами системы (ядра) простенько, но в более чем достаточной мере, описано здесь: Linux: кнопки, светодиоды и GPIO.
И там же пример того, как будет выглядеть чтение контакта GPIO из кода C:
Вот, как будет выглядеть чтение GPIO c использованием событий edge:

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

// set edge event on specific gpio_line
int gpio_edge_set(int n, const char *edge_str)
{
    char filename[PATH_MAX];
    FILE *file;

    snprintf(filename, sizeof(filename), "/sys/class/gpio/gpio%d/edge", n);
    file = fopen(filename, "w");
    if (file == NULL) return -1;
    fprintf(file, "%s\n", edge_str);
    fclose(file);

    return 0;
}

// set GPIO line polling mode
int gpio_poll(int n)
{
    char filename[PATH_MAX];
    int fd;
    char c;
    int err;

    snprintf(filename, sizeof(filename), "/sys/class/gpio/gpio%d/value", n);
    fd = open(filename, O_RDONLY);
    if (fd < 0) return -1;

    read(fd, &c, sizeof(c));

    return fd;
}

// get GPIO line value
int gpio_get(int fd, int timeout)
{
    struct pollfd pollfd[1];
    char c;
    int err;

    pollfd[0].fd = fd;
    pollfd[0].events = POLLPRI | POLLERR;
    pollfd[0].revents = 0;

    err =  poll(pollfd, 1, timeout);
    if(err != 1) return -1;

    lseek(fd, 0, SEEK_SET);
    err = read(fd, &c, sizeof(c));
    if(err != 1) return -1;

    return c - '0';
}

Ответить

Вернуться в «Одноплатные компьютеры»

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

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