Linux - Accessing GPIO from User Space

The Linux Kernel offers the GPIOLIB interface to access the GPIO pins from the User Space. To enable the GPIOLIB interface make sure you compile your kernel with the following options.

CONFIG_ARCH_REQUIRE_GPIOLIB
CONFIG_GPIOLIB
CONFIG_GPIO_SYSFS
Now, you can able to access and manipulate the GPIO's from the User Space using the standard C calls such as Open, Write, Read, Close etc.

Before manipulating the GPIO the specific GPIO pins has to be exported and configured appropriately. Each GPIO on the Processor will have a unique number, please refer to the processor manual.

To export an GPIO you need to open the export interface of the GPIOLIB and write the GPIO number you want to export.
int exportfd;
exportfd = open("/sys/class/gpio/export", O_WRONLY);
if (exportfd < 0)
{
printf("Cannot open GPIO to export it %d\n", errno);
return -1;
}

Write the GPIO you want to export and close the export interface.
write(exportfd, "149", 4);
close(exportfd)

Next, You will need to configure the direction of the GPIO using the direction interface of GPIOLIB.
int directionfd;
directionfd = open("/sys/class/gpio/gpio149/direction", O_RDWR);
if (directionfd < 0)
{
printf("Cannot open GPIO direction for 149\n");
return -1;
}

Write "in" if the GPIO is input or "out" if the GPIO is output and close the interface.
write(directionfd, "out", 4);
close(directionfd)

You can now use the value interface of GPIOLIB to set/clear the GPIO pin.
To make the GPIO line High
int valuefd;
valuefd = open("/sys/class/gpio/gpio149/value", O_RDWR);
if (valuefd < 0)
{
printf("Cannot open GPIO value for 149\n");
return -1;
}
write(valuefd, "1", 2);
close(valuefd);

To make the GPIO line Low
int valuefd;
valuefd = open("/sys/class/gpio/gpio149/value", O_RDWR);
if (valuefd < 0)
{
printf("Cannot open GPIO value for 149\n");
return -1;
}
write(valuefd, "0", 2);
close(valuefd);

You can use the read() function to read the state of the GPIO.

In the next post we will see how to pass the interrupts from Kernel Space to User Space.

Linux - User Space Device Drivers

The device drivers for Linux are best written in the Kernel Space to take advantage of the Kernel API's that are not available to the User space. However, there are reasons to write device drivers in user space. The advantage being you don't have to recompile and deploy the kernel for every change and possibility of having different licensing options etc.

The Linux Kernel offers some basic infrastructure to write a device driver in the User Space. The common basic requirement to write an device driver is the access to Interrupts, GPIO and some form of communication Bus (SPI / I2C).

In the subsequent posts we will see how to access each of hardware resource from the User Space.

Creating an Android Executable

Creating an Android executable is easy and straight forward with the Android source. Android is not GNU/Linux and it does not have access to standard glibc functions. Instead, android has its own C runtime called bionic. Your executable has to be linked with the bionic libraries instead of standard glibc.

The Android Build System searches every sub folder for Android.mk and executes it. The macros defined by the Android Build System makes sure that your executable are linked with the right libraries.

Steps for creating the android executable

1. Create a folder for your program in the Android Tree. If you not sure on where to create it put it under system folder.

2. Create a basic Android.mk file with the below contents.

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
my_program.c \
my_program_1.c

LOCAL_SHARED_LIBRARIES := \
libcutils \
liblog

LOCAL_MODULE:= myprogram

include $(BUILD_EXECUTABLE)

3. Add you program's C files in the macro LOCAL_SRC_FILES.

4. Build and Flash the Android Source.

You should see your program "myprogram" under /system/bin folder.

You can launch you program using the Terminal Emulator application inside the Android Device OR connect the device with adb and execute from the adb shell.

Android on BeagleBoard

It has been a long long break and I am back with some experience on Android Device Drivers. I`ll follow up with more posts on writing code for Android Platform.

Hardware:
The BeagleBoard is a low cost OMAP3 developement platform from TI. Visit www.beagleboard.org. The BeagleBoard runs variety of software including Linux, Android, Symbian, Win CE etc. It comes with an expansion header for connecting your custom Hardware.

Software:
The Android distro that is used with BeagleBoard is called 0xdroid from 0xlabs. Visit here for download and build instructions.

You should be up and running in a day with your own build of 0xdroid on BeagleBoard.