GPIO
Читаем General Purpose Input/Output, а так же соглашение доступа GPIO в Linux.
Аппаратные средства
GPIO, в основном, используется для кнопок и светодиодов. They only safely supply or sink (pull to GND) a maximum of 4mA aprox., напряжение зачастую 3V в активном состоянии. Только два положения возможны: “приём=low” или “передачу=high”. В зависимости от того как устройство активировано в GPIO, определяется состояние “приём” или “передача”.
- active high: устройство активируется когда GPIO в режиме “передачи”
- active low: устройство активируется когда GPIO в режиме “приёма”
На этом изображении можно увидеть как GPIO управляет кнопками или светодиодами для работы на “приём=low” или “передачу=high”.
GPIO можно использовать для таких задач:
Модуль ядра | Описание | |
---|---|---|
1-wire | kmod-w1-master-gpio | 1-wire |
pwm | kmod-pwm-gpio | ШИМ |
spi | kmod-spi-gpio | Serial Peripheral Interface |
kmod-mmc-over-gpio | MMC/SD карта через GPIO | |
I2C | kmod-i2c-gpio | I2C |
lirc | нет модуля | ИК-управление Linux |
rotary_encoder | kmod-input-gpio-encoder | GPIO датчик угла поворота |
GPIO прерывания
GPIO прерывание используется тогда, когда GPIO используется для приёма и нужно управлять высокочастотным сигналом. Без прерываний, GPIO приём должен контролироваться используя метод голосования.
Не все платы имеют GPIO прерывания. Например bcm63xx SoCs не имеет GPIO прерываний и по этому их кнопки опрашиваются. В результате этого, некоторые драйверы ввода перечисленные выше не будет работать в этих платах.
Программное обеспечение
В linux GPIO могут получить доступ через GPIO SYSFS интерфейс: /sys/class/gpio/
Для контроля GPIO можно использовать gpioctl-sysfs. Или скриптом ниже можно найти незадействованные кнопками или светодиодами GPIO. Для запуска, сохраните ниже приведенный скрипт с именем ngpio.sh, залейте в роутер и запускайте командой :
sh ngpio.sh [номер_GPIO] [out_или_in]
Узнайте заранее сколько GPIO имеет ваш ЦП
Пример:
sh ngpio.sh 0 out
Код скрипта:
#!bin/sh show_usage() { printf "\ngpio.sh <gpio pin number> [in|out [<value>]]\n" } if [ \( $# -eq 0 \) -o \( $# -gt 3 \) ] ; then show_usage printf "\n\nERROR: incorrect number of parameters\n" exit 255 fi #doesn't hurt to export a gpio more than once (echo $1 > /sys/class/gpio/export) >& /dev/null if [ $# -eq 1 ] ; then cat /sys/class/gpio/gpio$1/value exit 0 fi if [ \( "$2" != "in" \) -a \( "$2" != "out" \) ] ; then show_usage printf "\n\nERROR: second parameter must be 'in' or 'out'\n" exit 255 fi echo $2 > /sys/class/gpio/gpio$1/direction if [ $# -eq 2 ] ; then cat /sys/class/gpio/gpio$1/value exit 0 fi VAL=$3 if [ $VAL -ne 0 ] ; then VAL=1 fi echo $VAL > /sys/class/gpio/gpio$1/value