Simple GPIO on Zybo using command-line on Linux

This post was written by eli on July 6, 2014
Posted Under: ARM,FPGA,Linux,Zynq

Running Xillinux on the Zybo board, this is how I toggled a GPIO pin from a plain one-liner bash script in Linux. The same technique can be used for other Zynq-7000 boards (Zedboard in particular) to easily control GPIO pins.

First, I looked up which GPIO pin it is. The pin assignments can be found in the FPGA bundle, in xillydemo.ucf (or in xillydemo.sdc, if Vivado was used to build the project).

So I choose to connect to PMOD header JB, first pin, and the PMOD’s GND.

In the UCF file there’s a line saying

## Pmod Header JB
NET PS_GPIO[32]       LOC=T20 | IOSTANDARD=LVCMOS33; #IO_L15P_T2_DQS_34

and its counterpart in the SDC file is

## Pmod Header JB
set_property -dict "PACKAGE_PIN T20 IOSTANDARD LVCMOS33" [get_ports "PS_GPIO[32]"]

So it’s quite clear and cut that the PS_GPIO[32] signal is connected to PMOD B. It doesn’t hurt taking a look on the board’s schematics as well, if you’re convenient with those drawings, and see that the Zynq device’s pin T20 indeed goes to PMOD B, and which pin.

Hooked up as shown in this pic (click to enlarge):

The offset between PS_GPIO numbers and those designated by Linux is 54. So this pin is found as number 32+54=86.

Hence

# echo 86 > /sys/class/gpio/export
# echo out > /sys/class/gpio/gpio86/direction

And then poor man’s oscillator:

# while [ 1 ] ; do echo 1 > /sys/class/gpio/gpio86/value ; echo 0 > /sys/class/gpio/gpio86/value ; done

This runs at a staggering 2.9 kHz. Pretty impressive for the slowest form of programming one can think about.

Reader Comments

Hi, I was wandering where I could find a reference on the offset value 54, how can I determine it (or where is written)?

#1 
Written By Alessandro Renzi on October 16th, 2014 @ 19:08

for while loop, should Be while((1)), right?

#2 
Written By Jeremy on October 7th, 2015 @ 19:10

Hmmm… I wasn’t aware that it worked. I always go while [ 1 ]; But I suppose they do the same. :)

#3 
Written By eli on October 7th, 2015 @ 21:20

Hi ELI,

Is it possible to export an entire binary file in bash this way?

#4 
Written By bbondor on July 26th, 2016 @ 19:07

You mean like set up some clock/data protocol and transmit a file this way? That’s rather bizarre, but given some standard UNIX utilities one could write a script that sends a file through the GPIO. I suppose.

But using Linux C API for GPIO is by far more natural, I believe.

#5 
Written By eli on July 26th, 2016 @ 20:42

Add a Comment

required, use real name
required, will not be published
optional, your blog address