
A20 GPIO ports are 32 bit registers listed in alphabetical order PA, PB, PC, PD, PE, PF, PG, PH, PI.
In Armbian GPIO ports are numbered from 0 to 287 corresponding from PA0 to PI31.
The GPIO number is calculating using this formula:
gpioNumber = (Port Letter - 'A') * 32 + pinNumber
For instance GREEN STATUS LED on A20-OLinuXino-LIME2 is connected to port PH2. This will correspond to GPIO number:
('H'-'A' = 7) * 32 + 2 = 226
All GPIO operations in shell should be made as super user. First we have to register the gpio in the Linux Kernel with this command:
sudo echo 226 > /sys/class/gpio/export
to check if we did registered this gpio successfully we use ls command:
sudo ls /sys/class/gpio
If you did everything correctly you will see gpio226 listed.
Then you have to specify what will be this GPIO input or output. This is done with writing “in” or “out” in gpioxx direction directory. In this case we want to drive the STATUS LED so we have to make it output:
sudo echo out > /sys/class/gpio/gpio226/direction
Once we set the GPIO as output we can write 1 or 0 to it’s value and this will make GPIO port to supply 3.3V when 1 is written or 0V when 0 is written.
To switch the LED on we have to write 1:
sudo echo 1 > /sys/class/gpio/gpio226/value
Yay the green LED is now lighting. If we want to switch it off we have to write 0:
sudo echo 0 > /sys/class/gpio/gpio226/value
To read the GPIO state it has to be set as input first with the command:
sudo echo in > /sys/class/gpio/gpioXXX/direction
where XXX is GPIO port number calculated as described above. Then to read the GPIO state you use this command:
sudo cat /sys/class/gpio/gpioXXX/value
the result will be 0 if the GPIO voltage is between 0.0-1.0V and 1 if the voltage is between 2.3-3.3V. If the voltage on the GPIO is between 1.0 and 2.3V the attempt to read will return randomly value 0 or 1.
Be careful when playing with the GPIO ports, some of them are wired to important peripherials like LCD, Ethernet, USB, SATA etc and writing bad values may break the functionality or even damage the board. Test your knowledge on GPIOs which are not connected to anything is best approach.
We are prepare now new version of PyA20 Python module which will add access to GPIO, SPI, I2C, Serial resources of A20 directly from Python code to work with the new universal A20 Armbian Linux image.
EDIT 2019-01-25 14:24:
We got question how fast is the access to the GPIOs via shell. Sure it’s not fast and made just for slow processes like switching on and off relays, or polling status of buttons or sensors which do not change often their state. Running this code below:
nano toggle_led_lime2.sh
Enter inside the file this code:
#!/bin/bash
# the lime2 led is PH2 - 32*(8-1) + 2 = 226
echo 226 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio226/direction
while [ 1 -eq 1 ]
do
echo 1 > /sys/class/gpio/gpio226/value
echo 0 > /sys/class/gpio/gpio226/value
done
Save and exit, then make executable and run
chmod +x toggle_led_lime2.sh
./toggle_led_lime2.sh
We can see square wave with oscilloscope on PH2 with frequency between 3 and 4 kHz. i.e. pulses with high state 125-150uS and low state 125-150uS.
Shell is slow, if we write same code in C:
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#define PH2 226 // (32 * 7) + 2
#define GPIO_PATH "/sys/class/gpio/gpio226/value"
int main() {
int ret;
int fd;
fd = open(GPIO_PATH, O_RDWR);
if (fd < 0)
return errno;
while(1) {
ret = write(fd, "1", 1);
ret = write(fd, "0", 1);
}
return 0;
}
The new code produces square wave with 2.13 us high and low state i.e. approx 235 kHz or about 50 times faster than access via shell.
Recent Comments