12 063
правки
Fizikdaos (обсуждение | вклад) (Новая страница: «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 contr…») |
|||
(не показано 58 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
<languages/> | <languages/> | ||
In Wiren Board part | In Wiren Board a part of GPIOs is output to terminal blocks,a part - to connectors on the expansion modules, the other part is used for utility purposes. | ||
GPIO are also used to control the switching transistors for low-voltage load. | GPIO are also used to control the switching transistors for low-voltage load. | ||
The correspondence between GPIO numbers in Linux and between their location and function can be found in the table [[WB SH 3.5: Список GPIO| WB SH 3.5: List of GPIO]] or [[WB rev. 2.8: Список GPIO| WB rev. 2.8: List of GPIO]]. | |||
In Wiren Board rev. 2.8 8 GPIO are placed on a special connector and connected via [[Special:MyLanguage/MCP23S08|MCP23S08]] and temporarily do not work with Linux API standard. How to work with them: see page [[Special:MyLanguage/MCP23S08|MCP23S08]]. | |||
<b> | <b> All GPIOs (as well as other ports of Wiren Board controllers) work with 3.3V voltage.Do not connect signals with voltage over 3.3V directly to the GPIO! In case you want to connect devices operating at a higher voltage, you must use matching circuits or connect(for 5V) via a resistor of 20 kOhm or more</b> | ||
On some GPIOs (particularly at the 3 GPIOs, launched into terminals in Wiren Board rev. 2.8) can be programmatically set to lift 47K + 3.3V. See. [[Special:MyLanguage/Pin_pull-up|Pin_pull-up]]. | |||
=== | === sysfs interface in Linux === | ||
GPIOs in Linux are supported through sysfs-interface. | |||
To work via sysfs a certain GPIO must be exported: | |||
Here and further N is a number of gpio | |||
<pre> | <pre> | ||
Строка 25: | Строка 25: | ||
</pre> | </pre> | ||
Exported gpio appear in the catalog /sys/class/gpio : | |||
<pre> | <pre> | ||
Строка 38: | Строка 38: | ||
</pre> | </pre> | ||
The folder <b>/sys/class/gpioN</b> now contains files to work with GPIO (where N is a GPIO number): | |||
<pre> | <pre> | ||
Строка 52: | Строка 52: | ||
</pre> | </pre> | ||
Setting the direction of GPIO (input / output) is made by writing to the file <b> direction </ b> | |||
<pre> | <pre> | ||
echo in > /sys/class/gpio/gpioN/direction # | echo in > /sys/class/gpio/gpioN/direction #set the GPIO N to input | ||
echo out > /sys/class/gpio/gpioN/direction # | echo out > /sys/class/gpio/gpioN/direction # set the GPIO N to output | ||
</pre> | </pre> | ||
Reading and setting the GPIO is made using the file <b>value</b>. | |||
Reading: | |||
<pre> | <pre> | ||
echo in > /sys/class/gpio/gpioN/direction # | echo in > /sys/class/gpio/gpioN/direction # Set GPIO a number N to input | ||
cat /sys/class/gpio/gpioN/value # | cat /sys/class/gpio/gpioN/value # returns 1 or 0 | ||
</pre> | </pre> | ||
Record: | |||
<pre> | <pre> | ||
echo out > /sys/class/gpio/gpioN/direction # | echo out > /sys/class/gpio/gpioN/direction # set GPIO No. N to output | ||
echo 0 > /sys/class/gpio/gpioN/value # | echo 0 > /sys/class/gpio/gpioN/value # set logic 0 (low voltage) on the GPIO No. N | ||
echo 1 > /sys/class/gpio/gpioN/value # | echo 1 > /sys/class/gpio/gpioN/value # set logical 1 (high voltage) to GPIO No. N | ||
</pre> | </pre> | ||
==== | ====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" - | * "none" - disable interrupt | ||
* "rising" - | * "rising" - enable interrupt on falling edge | ||
* "falling" - | * "falling" - enable interrupt on the rising edge | ||
* "both" - | * "both" - enable interrupt on both edges. | ||
Example: | |||
<pre> | <pre> | ||
root@wirenboard:~# echo 3 > /sys/class/gpio/export # | root@wirenboard:~# echo 3 > /sys/class/gpio/export # export GPIO No. 3 (TB10 in WB3.3) | ||
root@wirenboard:~# cat /sys/class/gpio/gpio3/edge # | root@wirenboard:~# cat /sys/class/gpio/gpio3/edge # check the status of the interrupt | ||
none | none | ||
root@wirenboard:~# echo falling > /sys/class/gpio/gpio3/edge # | root@wirenboard:~# echo falling > /sys/class/gpio/gpio3/edge # set interrupt falling edge | ||
root@wirenboard:~# cat /proc/interrupts | grep gpiolib # | 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 | 26: 0 gpio-mxs 3 gpiolib | ||
root@wirenboard:~# cat /proc/interrupts | grep gpiolib # | root@wirenboard:~# cat /proc/interrupts | grep gpiolib # After several events, 76 - the number of events | ||
26: 76 gpio-mxs 3 gpiolib | 26: 76 gpio-mxs 3 gpiolib | ||
Строка 107: | Строка 107: | ||
Interrupts can be caught from userspace using the system call epoll () and select () on file value. | |||
See example here [https://github.com/contactless/wiegand-linux-sysfs] | |||
see also [http://elinux.org/GPIO elinux.org] | |||
=== | ===Direct access by processor memory=== | ||
<b> | <b>This method is NOT strongly 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</b>. | ||
You can manage GPIO using the direct access to the processor registers, bypassing the Linux interface/dev/mem. At the same time, compared to the work via sysfs, this case minimizes 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. | |||
See [http://olimex.wordpress.com/2012/09/11/imx233-olinuxino-gpios-faster-and-faster/] , [https://github.com/OLIMEX/OLINUXINO/blob/master/SOFTWARE/iMX233/gpio-mmap.h] | |||
===GPIO | ===GPIO and Device Tree=== | ||
It's necessary to place the GPIO in Device Tree to configure the GPIO to work in a mode of software SPI, I2C, for GPIO to be used as the source of the interrupt, etc. | |||
For example on a pin 10 @ UEXT1 (CS) and pins 5 @ UEXT2 (SCL), 6 @ UEXT2 (SDA), 10 @ UEXT2 (CS) GPIO processor lines are derived. They can be configured to use such as a chip-select for SPI or as I2C. | |||
The processor's and peripherals' GPIOs are divided into banks (gpio chip).Processor's GPIO are split into 3 banks for 32 GPIO: gpio0, gpio1, gpio2. Addressing GPIO in Device Tree comes to the number of the bank and the number of GPIO * in * the bank. | |||
==== | ====Example 1==== | ||
We define signal 6 @ UEXT2 (SDA) as the source of the interrupt driver mrf24j40. According to the table [[Special:MyLanguage/Список_GPIO/en|List of GPIOs]], signal corresponds to 53 GPIO of processor. 53 belongs to the second bank gpio (32 to 63). GPIO number inside the bank 53-32 = 21: | |||
<pre> | <pre> |
правки