Managing GPIO

Материал из Wiren Board
Версия от 13:18, 19 января 2016; Fizikdaos (обсуждение | вклад) (Новая страница: «Driving GPIO can use the direct access to the processor registers, bypassing the Linux interface/dev/mem. At the same time, compared to the work via sysfs minimiz…»)

Другие языки:

In Wiren Board part GPIO output to terminal blocks, connectors on the expansion modules, the other part is used for business purposes. GPIO are also used to control the switching transistors for low-voltage load.

The correspondence between numbers GPIO Linux and their location and function can be found in the table WB SH 3.5: List of GPIO or WB rev. 2.8: List of GPIO.

In Wiren Board rev. 2.8 8 GPIO on a special connector connected via MCP23S08 and temporarily do not work with standard Linux API. How to work with them there on the pageMCP23S08.

All GPIO (as well as other ports Wiren Board) working with voltage 3.3V. In no case do not connect directly to the GPIO signals with voltage over 3.3V! In case you want to connect devices operating at a higher voltage, you must use matching circuits or connected (for 5V) through a resistor of 20 kOhm or more


On some GPIO (particularly at the 3 GPIO, launched into terminals in Wiren Board rev. 2.8) can be programmatically set to lift 47K + 3.3V. See. Pin_pull-up.


sysfs interface under Linux

GPIO under Linux are supported through sysfs-interface.

To work through a certain GPIO sysfs it must be exported:

Here and further N - number of gpio

echo N > /sys/class/gpio/export

Exported gpio appear in the catalog /sys/class/gpio :

root@wirenboard:~# ls -1 /sys/class/gpio/
export
gpio32
gpiochip0
gpiochip120
gpiochip32
gpiochip64
unexport

В директории /sys/class/gpioN теперь находятся файлы для работы с GPIO (где N - номер GPIO, как и было сказано ранее): The directory /sys/class/gpioN are now files to work with GPIO (where N - No. of GPIO, as was said earlier):

root@wirenboard:~# ls -1 /sys/class/gpio/gpioN/
active_low
device
direction
edge
power
subsystem
uevent
value

Setting the direction of GPIO (input / output) is made by writing to the file direction </ b>

echo in > /sys/class/gpio/gpioN/direction #set the GPIO to input
echo out > /sys/class/gpio/gpioN/direction # set the GPIO to output 

Reading and Setting the GPIO is made using the file value.

Reading:

echo in > /sys/class/gpio/gpioN/direction # Set GPIO a number N to input 
cat /sys/class/gpio/gpioN/value # returns 1 or 0

Record:

echo out > /sys/class/gpio/gpioN/direction # set GPIO No. N to output 
echo 0 > /sys/class/gpio/gpioN/value # set logic 0 (low voltage) on the GPIO No. N
echo 1 > /sys/class/gpio/gpioN/value # set logical 1 (high voltage) to GPIO No. N


Sysfs interface and interrupt

Via sysfs interface, you can request a change of state interrupt processor.

Setting the interrupt is done by writing the values in the file "edge". Values can be:

  • "none" - disable interrupt
  • "rising" - enable interrupt on falling edge
  • "falling" - enable interrupt on the rising edge
  • "both" - enable interrupt on both edges.

Example:

root@wirenboard:~# echo 3 >  /sys/class/gpio/export # export GPIO No. 3 (TB10 in WB3.3)
root@wirenboard:~# cat /sys/class/gpio/gpio3/edge   # check the status of the interrupt
none
root@wirenboard:~# echo falling > /sys/class/gpio/gpio3/edge # set interrupt falling edge
root@wirenboard:~# cat /proc/interrupts  | grep gpiolib # interrupt appears in the list. 26 - internal interrupt, 0 - the number of events
 26:          0  gpio-mxs   3  gpiolib
root@wirenboard:~# cat /proc/interrupts  | grep gpiolib # After several events, 76 - the number of events
 26:         76  gpio-mxs   3  gpiolib




Interrupts can be caught from userspace using the system call poll () and select () on file value. Example of look here [1]

see also elinux.org


Direct access by processor memory

This method is strongly NOT recommended for use without sufficient reason. To work in C / C ++ is to use the files to work through sysfs, as described in the previous section.

Driving GPIO can use the direct access to the processor registers, bypassing the Linux interface/dev/mem. At the same time, compared to the work via sysfs minimization of costs. This method can be used, if you need a very fast access to GPIO, such bitbang protocols or PWM. It should be borne in mind that the process scheduler can still contribute to the work program of significant delays. It is recommended to make time-critical tasks in the kernel.

См. [2] , [3]


GPIO и Device Tree

Указывать GPIO в Device Tree необходимо для настройки GPIO для работы в режиме программного SPI, I2C, для использования GPIO в качестве источника прерываний и т.д. Так например на пин 10@UEXT1 (CS) и пины 5@UEXT2 (SCL), 6@UEXT2 (SDA), 10@UEXT2 (CS) выведены линии GPIO процессора. Их можно сконфигурировать для использования например в качестве chip-select для SPI или в качестве I2C.

GPIO процессора и периферийных устройств разбиты на банки (gpiochip). GPIO процессора разбиты на 3 банка по 32 GPIO: gpio0, gpio1, gpio2. Адресация GPIO в Device Tree происходит по номеру банка и номеру GPIO *внутри* банка.


Пример 1

Определим сигнал 6@UEXT2 (SDA) в качестве источника прерываний для драйвера mrf24j40. Согласно таблице Список GPIO, сигнал соответствует GPIO 53 процессора. 53 принадлежит второму банку gpio (от 32 до 63). Номер GPIO внутри банка 53-32=21 :

				6lowpan@0 {
					compatible = "microchip,mrf24j40";
					spi-max-frequency = <100000>;
					reg = <6>;
					interrupt-parent = <&gpio1>;
					interrupts = <21 0>;
				};