Digital Read/Write using sysfs
In this post I will describe how to use sysfs to access the GPIO pins in the BeagleBone black, this should also be compatible with the recently released BeagleBone green.
From Wikipedia: "sysfs is a virtual file system provided by the Linux kernel that exports information about various kernel subsystems, hardware devices, and associated device drivers from the kernel's device model to user space through virtual files"
The BeagleBone black will expose GPIO pins via sysfs, and the location we will use is "/sys/class/gpio/".
I will wire up an LED to pin 60 and a button on pin 44, please refer to the BeagleBone Black GPIO layout
All the following commands are run on the BeagleBone after starting an ssh session.
I will describe how to perform the following actions:
- Export the pins
- Write the pin direction (in/out)
- Write/Read values
- Unexport the pins
To use a pin we must export it, to release a pin we must "unexport" it, we achieve these actions by writing the pin's numeric value to the export/unexport files.
ls -il /sys/class/gpio/ | grep export 127 --w------- 1 root root 4096 Jan 1 00:00 export 128 --w------- 1 root root 4096 Jan 1 00:00 unexport
You can see we have write but not read access to both these files, lets export pin 60
echo 60 > /sys/class/gpio/export
Now we will see a "/sys/class/gpio/gpio60" symlink to "/sys/devices/virtual/gpio/gpio60" as a result of exporting the pin
ls -il /sys/class/gpio/ | grep gpio60 8848 lrwxrwxrwx 1 root root 0 Jan 1 00:22 gpio60 -> ../../devices/virtual/gpio/gpio60
Now that our pin 60 has been exported its primed and ready to be used, within the "/sys/class/gpio/gpio60" folder we only care about two files: direction and value.
ls -il /sys/class/gpio/gpio60/ | grep 'value\|direction' 8857 -rw-r--r-- 1 root root 4096 Jan 1 00:29 direction 8855 -rw-r--r-- 1 root root 4096 Jan 1 00:29 value
First we set the direction to "out":
echo "out" > /sys/class/gpio/gpio60/direction
Now we can turn the LED on pin 60 on and off by flipping the value from 0 to 1 and vice-versa.
echo 1 > /sys/class/gpio/gpio60/value echo 0 > /sys/class/gpio/gpio60/value
The following script will export, write "in" as the direction then read the value on pin 44 every second:
echo 44 > /sys/class/gpio/export echo "in" > /sys/class/gpio/gpio44/direction watch --interval 1 cat /sys/class/gpio/gpio44/value
Now you can see 0 and 1 on the screen as you press/release the button.
Once we unexport the pin the /sys/class/gpio/gpio[pin#] folder will disappear:
echo 60 > /sys/class/gpio/unexport echo 44 > /sys/class/gpio/unexport
Now we can make sure no gpio60 or gpio44 folders exist under "/sys/class/gpio/"
ls /sys/class/gpio/ | grep '60\|40'
In the wild
This technique is the "magic" behind some of the BeagleBone GPIO libraries, two examples: