Управление GPIO

Материал из virt2real wiki
Перейти к: навигация, поиск

Есть два способа управления пинами ввода-вывода (GPIO).

Содержание

Общие зависимости

Ядро должно быть собрано с поддержкой GPIO

Symbol: GPIOLIB [=y]
  Type  : boolean
  Prompt: GPIO Support
  Defined at drivers/gpio/Kconfig:38
  Depends on: ARCH_WANT_OPTIONAL_GPIOLIB [=n] || ARCH_REQUIRE_GPIOLIB [=y]
  Location:
     -> Device Drivers
        Selects: GENERIC_GPIO [=y]
        Selected by: ARCH_REQUIRE_GPIOLIB [=y] || MFD_TC6393XB [=n] && HAS_IOMEM [=y] && ARM [=y] && HAVE_CLK [=y]\
       || FB_VIA [=n] && HAS_IOMEM [=y] && FB [=y] && PCI [=n] && X86 

Там же должен быть включён параметр

  [*]   /sys/class/gpio/... (sysfs interface)

Стандартный линуксовый

Зависимости

В ядре должен быть включён параметр DEBUG_FS

Symbol: DEBUG_FS [=y]
   Type  : boolean
   Prompt: Debug Filesystem
      Defined at lib/Kconfig.debug:102
      Location:
         -> Kernel hacking

Подключаем DEBUG_FS

Для доступа к пинам ввода-вывода из консоли (и вообще из юзерспейса) надо подключить debugFS

mount -t debugfs debugfs /sys/kernel/debug

Смотрим текущее состояние пинов

Чтобы посмотреть текущие занятые GPIO надо выполнить команду

cat /sys/kernel/debug/gpio 
[root@virt2real gpio]# cat /sys/kernel/debug/gpio
GPIOs 0-31, DaVinci:
 gpio-0   (KSZ8851             ) in  hi
 gpio-20  (i2c-scl             ) out lo
GPIOs 32-63, DaVinci:
GPIOs 64-95, DaVinci:
 gpio-66  (usb                 ) out hi
 gpio-73  (v2r:green:user      ) out hi
 gpio-74  (v2r:red:user        ) out hi
GPIOs 96-103, DaVinci:

Экспорт GPIO

Если перейти в каталог /sys/class/gpio/

cd /sys/class/gpio/

Увидим такой набор каталогов и файлов

[root@virt2real gpio]# ls
export      gpiochip0@  gpiochip32@ gpiochip64@ gpiochip96@ unexport

Общий принцип - надо записать номер GPIO в файл export, после чего в этом каталоге появится каталог, отвечающий за требуемый пин.

Установка GPIO

Например, попробуем достучаться до GPIO28

[root@virt2real gpio]# echo 28 > export
[root@virt2real gpio]# ls
export      gpio28@     gpiochip0@  gpiochip32@ gpiochip64@ gpiochip96@ unexport

Видим что появился каталог gpio28. Переходим в него и видим такую картину:

[root@virt2real gpio]# cd gpio28
[root@virt2real gpio28]# ls
active_low  direction   power/      subsystem@  uevent      value

Теперь надо задать требуемое направление сигнала - out или in (выход или вход). Принцип аналогичный Ардуинскому pinMode. Если хотим выход - пишем "out", если хотим вход - пишем "in"

echo out > direction

Теперь если хотим установить GPIO в состояние логической единицы (HIGH, 3.3V) даём команду

echo 1 > value

Или (для сброса в ноль)

echo 0 > value

Данный способ работы с GPIO довольно неудобен, нельзя обратиться к пину, который уже кем-то занят, а это иногда бывает необходимо

Чтение GPIO

Необходимо экспортировать требуемый GPIO, после чего перейти в отвечающий за него каталог, установить направление "in" и прочитать файл value

echo in > direction
cat value


Более удобен другой способ обращения к GPIO - с помощью драйвера.


С помощью драйвера

Установка GPIO

Чтобы установить требуемый GPIO необходимо выполнить команду

echo "<действие> gpio <номер> <направление> <состояние>" > /dev/v2r_gpio

Формат команды:

действие: set - установить значение
направление: output - выход, input - вход
cостояние: 1 или 0

Например, чтобы установить GPIO91 в состояние HIGH надо выполнить команду

echo "set gpio 91 output 1" > /dev/v2r_gpio

И всё!


Подробное описание команд драйвера v2r_gpio изложено в разделе wiki.virt2real.ru/wiki/V2r_gpio