Today I will show you how to access A13-OLinuXino GPIOs.
First make sure you have installed the GPIO drivers by
# lsmod
you will see the list of the installed kernel modules and if “sun4i_gpio” is there everything is OK
If you got A13-OLinuXino-SD with the pre-installed Debian everything is already setup for you, if not you can follow the instructions of this post and make one SD card yourself: https://olimex.wordpress.com/2012/10/12/building-bootable-sd-card-with-debian-linux-image-for-a13-olinuxino/ do not forget when compile the kernel to enable SUN4I_GPIO_UGLY = y inside .config , why UGLY? you will understand soon 😉
Allwinner do not care too much for the GPIOs as they primary support Android and their major market is the tablet manufacturers. This SUN4I-GPIO is made by Tom Cubie who work at Allwinner and made available to community, this driver though is not so flexible as the sysfs and you can’t switch between input and output easily.
With this driver you permanently assign one port to be input or output in the script.bin and when this gpio kernel module is loading it reads from script.bin the assignments and make them permanently, so if you want to change some GPIO to input or output you have to unload the driver make change in the script.bin and load it again and this is ugly 🙂
Anyway with the card we ship we made these gpios defined:
pe4, pe5, pe6, pe7: inputs
pe8, pe9, pg10, pg11, pg9, pb10, pb3, pb4, pe10, pe11: outputs
pg9 is GPIO output with the green status LED connected to it
to switch LED on you can do:
# echo 1 > /sys/devices/virtual/misc/sun4i-gpio/pin/pg9
and to switch LED off you can do:
# echo 0 > /sys/devices/virtual/misc/sun4i-gpio/pin/pg9
Now let’s see how fast we can toggle LED from shell script:
# vi gpio
and enter this code:
while [ true]
do
echo 1 > /sys/devices/virtual/misc/sun4i-gpio/pin/pg9
echo 0 > /sys/devices/virtual/misc/sun4i-gpio/pin/pg9
done
# chmod +x gpio
#./gpio
with the oscilloscope is seen square wave with 220 uS period i.e. 45 454 Hz! this is quite more fast than the 300Hz we achieved on iMX233 GPIOs from shell https://olimex.wordpress.com/2012/09/07/imx233-olinuxino-working-with-gpios/
now let’s try same in C:
# vi gpioc.c
#include <stdio.h>
#include <fcntl.h>
#include <string.h>int main() {
char s_0[] = “0”;
char s_1[] = “1”;
int fd;//toggle pg9 LED gpio
if((fd=open(“/sys/devices/virtual/misc/sun4i-gpio/pin/pg9”,O_RDWR))<0) return(1);
else {while(1) {
if(write(fd,s_1,strlen(s_1))<0) return(1);
if(write(fd,s_0,strlen(s_0))<0) return(1);
};if(close(fd)<0) return(1);
}
}
# cc gpioc.c -o gpioc
# chmod +x gpioc
# ./gpioc
the oscilloscope show 4.2 uS period square wave i.e. about 238 095Hz not so fast than iMX233 140kHz. But obviously if we chase speed should not use file system.
Now next step is to make access via /dev/mem as mmgpio with iMX233 https://olimex.wordpress.com/2012/09/11/imx233-olinuxino-gpios-faster-and-faster/
Using directly /dev/mem iMX233 achieved up to 5.7 Mhz GPIO toggle, I do wonder how fast we can go with A13, but this will be done in my next blog about it.
David Goadby
Oct 23, 2012 @ 18:36:14
Just what I wanted. Although most of my I/O is i2C I needed some direct I/0’s for panel lamps a reset button and a sounder. I don’t need to change port direction in use so that restriction is not an issue. Toggling at 2Hz is plenty too 😉
Johannes H.
Oct 24, 2012 @ 22:33:18
On a Cortex M4 (168 MHz) you can toggle a GPIO Port with up to 84 / 2 MHz.
On a Cortex A8 (1 GHz) with a few KHz??? What????
OLIMEX Ltd
Oct 24, 2012 @ 22:35:12
hehe do you run Linux RTOS on the Cortex M4 while you toggle the GPIOs 😉
Johannes H.
Oct 24, 2012 @ 22:52:17
without any OS….but the comparison shows the (immense) overhead of the linux kernel??
Thomas
Nov 06, 2012 @ 20:54:13
Hi.
First of all thank you for these nice tutorials about your hardware.
I’m using A13-Olinuxino-WiFi with your Debian image in A13-olinuxino-SD.
When I’m typing as root “lsmod”, I do not see sun4i_gpio.
In addition, the directory /sys/devices/virtual/misc/sun4i_gpio does not exist.
Please tell me what to do 🙂
Thank you.
root@debian:~# lsmod
Module Size Used by
bfcon 35991 70
bitblit 4187 1 fbcon
softcursor 1123 1 bitblit
font 7767 1 fbcon
8192cu 511517 0
Anton Klava (@AntonKlava)
Nov 17, 2012 @ 03:13:04
Thomas, try using this script.bin file: https://gist.github.com/raw/4090594/e661f202ea43496700f20238de66334a129224d0/script.bin
I had trouble getting the gpio to work until I tried that. Wrote about how I set up my SD-card here: http://blog.klava.se/post/debian-sd-card-for-olinuxino-a13
Thomas
Nov 21, 2012 @ 20:50:22
Thank you Anton, but all I had to do is “modprobe sun4i_gpio” and that’s all.
The autor of the news wrote :
“Now next step is to make access via /dev/mem as mmgpio with iMX233 https://olimex.wordpress.com/2012/09/11/imx233-olinuxino-gpios-faster-and-faster/
Using directly /dev/mem iMX233 achieved up to 5.7 Mhz GPIO toggle, I do wonder how fast we can go with A13, but this will be done in my next blog about it.”
I really can’t wait for them to do the gpio-mmap.h for A13, so I’ll be able to use MOD-LCD3310 with it’s C API : https://github.com/OLIMEX/OLINUXINO/tree/master/SOFTWARE/iMX233/MOD-LCD3310
Michael Nycz
Mar 21, 2014 @ 22:05:05
I also do not have the sun4i_gpio directory. In your post you mentioned that all you had to do was modprobe the directory. Can you explain in more detail what you did?
Kyle Muffley
Dec 10, 2012 @ 18:54:20
Hi
I am very new to Linux but with your great tutorials I am up to a good point so far.
I have installed Debian on an SD Card and it is up and running. I am using a script.bin file that defaults pins (pb2, pb3, pb4, pb5, and pb9) in the …/sun4i-gpio/pin directory and I was successfully able to toggle the output LED using your echo 1, echo 0 commands but I am now at the point I would like to receive inputs. Is there any direction you can point me in to understanding a little more on:
–>Reading Inputs
–>Getting a GPIOs Direction (Input Or Output)
–>Changing a GPIOs Direction
Any help would be greatly appreciated.
sandro76
Feb 06, 2013 @ 18:44:02
Maybe to increase the speed on gpio can do usefull give an
fdatasync(fd) instruction after a write instruction.
markome
Apr 10, 2013 @ 16:36:14
Hi there!
Are there any chances to have GPIO access in an Android image?
OLIMEX Ltd
Apr 10, 2013 @ 16:41:50
this should be doable, check the MOD-IO android project it’s made with C NDK functions exported to Java
Mateusz
Dec 22, 2013 @ 00:17:48
Hi,
Is it possible to use couple of pins as one parallel port? Something like:
set(Portx,0xFA);
I want to connect some external device to olinuxino but I need to write data into this device using 16bit parallel port. Is it possible to do this from linux app?
David Goadby
Dec 23, 2013 @ 14:57:25
If you need to present 16 bits at one time (possibly with a strobe?) then I would suggest a hardware solution such as 74F675A which is a serial in parallel out chip. You can drive this with less than outputs and the data is presented in one “hit” so no data skew issues. I drive an 8-bit thermal printer this way.