Accessing GPIO controllers is pretty straightforward with PetaLinux, but there are a few tricks you need to know.
Locating the GPIO controller
In the example FPGA I am using, there are two GPIO controllers in the programmable logic. These are at address 0x4120_0000 and 0x4121_0000. If you look in the pl.dtsi
file in your PetaLinux project, in the directory subsystems/linux/configs/device-tree
, you will see entries for the GPIO devices. There’s no need to modify the entire device tree.
If you make a PetaLinux build and boot it, you can look in the /sys/class/gpio
directory.
root@pz-7015-2016-2:~# ls /sys/class/gpio/ export gpiochip901 gpiochip902 gpiochip906 unexport
You can see that there is a gpiochip
directory for each GPIO controller. The gpiochip901
and gpiochip902
directories correspond to the PL controllers that I added in my design. The gpiochip906
directory is for the GPIO controller in the PS.
How will you know which is which, though? Each directory contains a label file which tells you the device tree label for the controller. You can go ahead and look at the contents:
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip901/label /amba_pl/gpio@41210000 root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip902/label /amba_pl/gpio@41200000 root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip906/label zynq_gpio
Looking at it, you’ll see that gpiochip901 corresponds to my controller at 0x4120_0000 and gpiochip902 corresponds to the controller at 0x4121_0000. Gpiochip906 is different, and corresponds to the built-in controller on the ZYNQ. Why those numbers? In my FPGA, the first GPIO controller controls only a single GPIO bit, while the second controls four bits. We can tell how many bits each controller controls by looking in the ngpio
file for the controller.
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip901/ngpio 1 root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip902/ngpio 4 root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip906/ngpio 118
It looks to me like the numbering starts at 901. Since that controller has only a single GPIO bit, the next controller is 902. That one has four bits, so the ZYNQ PS controller goes at 906, which has 118 bits.
Enabling the GPIO bits
To access a GPIO bit, you need to enable the correct GPIO pin. You do that by writing to the export
file in the /sys/class/gpio
directory. Here is an example of enabling the LSB of my second controller:
root@pz-7015-2016-2:~# echo -n 902 > /sys/class/gpio/export
Now if you look in the /sys/class/gpio
directory, you will see a new directory created which allows you to control the individual GPIO pin.
root@pz-7015-2016-2:~# ls /sys/class/gpio export gpio902 gpiochip901 gpiochip902 gpiochip906 unexport
If you look in that directory you see a number of controls:
root@pz-7015-2016-2:~# ls /sys/class/gpio/gpio902 active_low direction power subsystem uevent value
Accessing the GPIO bits
You can determine the GPIO direction by looking at the direction
file. Since my GPIO pin is an output, it gives the value out.
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpio902/direction out
You can change the value to a 1 by writing to the value file.
root@pz-7015-2016-2:~# echo 1 > /sys/class/gpio/gpio902/value
Conclusion
So there you have it. The “official” way to access GPIO on PetaLinux.