Difference between revisions of "How to use GPIOs"

From IGEP - ISEE Wiki

Jump to: navigation, search
m
m
Line 1: Line 1:
'''UNDER MAINTENANCE'''
+
== Overview  ==
{{Message/Obsolete|Link=Only works with kernel 2.6.35.y}}
 
__TOC__
 
= Overview  =
 
  
This How-To is meant to be a starting point for people to learn use GPIOs for IGEP v2 devices as quickly and easily as possible. For this how-to i used [http://releases.linaro.org/platform/linaro-m/headless/final/linaro-m-headless-tar-20101108-2.tar.gz Linaro Headless] with [[Linux Kernel 2.6.35.y|Kernel 2.6.35.y]], Ubuntu 10.04 with Linaro Toolchain, IGEP v2 RC5 and [http://downloads.igep.es/labs/gpio-driver.tar.bz2 GPIO driver].
+
This How-To is meant to be a starting point for people to learn use GPIOs for IGEP devices as quickly and easily as possible. For this How-To I used [http://labs.isee.biz/index.php/IGEP_firmware_Yocto IGEP firmware Yocto]
  
There are more ways to use GPIOs in IGEP v2, but this one is very simple.<br>
+
There are more ways to use GPIOs, but this one is very simple.
  
= Feedback and Contributing  =
+
== Feedback and Contributing  ==
  
At any point, if you see a mistake you can contribute to this How-To.<br>
+
At any point, if you see a mistake you can contribute to this How-To.
  
= Compile GPIO driver source code via Host<br>  =
+
== Requirements ==
  
Download [http://downloads.igep.es/labs/gpio-driver.tar.bz2 GPIO driver] and [[Linux Kernel 2.6.35.y|Kernel 2.6.35.y]] source code. Extract files.<br>
+
For this How-to, I used:
 +
* IGEPv2 Board
 +
* [http://labs.isee.biz/images/6/69/Gpio_examplebeta1.tar.bz2 GPIO example]
  
Edit GPIO driver Makefile's:  
+
== Configure IGEPv2==
 +
By default, GPIO 156 (J990:20) and GPIO 157 (J990:22) are available, connect J990:20 and J990:22 with a cable.
  
-In files: $/app/Makefile and $/lib/Makefile, make sure that your CROSS_COMPILE path is correct.
+
== Example program ==
  
-In file: $/modules/Makefile, make sure that your CROSS_COMPILE path is correct and&nbsp;type your Kernel 2.6.35.y path.<br>
+
Example program contains some libraries to control GPIOs, libraries can do:
 +
* Export and unexport GPIOs
 +
* Set GPIO direction
 +
* Set GPIO value
 +
* Get GPIO value
 +
* Configure hardware interrupts
  
We will use the ncurses program for set up Kernel configuration, if you don't have this program installed then you must install it with this command:
+
Example program configures a GPIO to wait a hardware interrupt. Once the GPIO value change from 0 value to 1 value (rising), program gives you a message.
<pre>sudo apt-get install ncurses-dev
 
</pre>
 
-Go to kernel path and type:
 
<pre>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- igep00x0_defconfig
 
</pre>
 
Exit Linux Kernel Configuration an return to Bash. Type:
 
<pre>make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_prepare
 
</pre>
 
File $/include/generated/autoconf.h was created
 
  
Finally compile GPIO driver, go to main Makefile path and compile all source code using make command.  
+
=== Compile example program ===
 +
[http://labs.isee.biz/index.php/How_to_setup_a_cross_compiler#Download.2FInstall_IGEP_SDK Download an Install] IGEP SDK if you don't have it.
  
Send binaries created from Host to Igep v2. <br>
+
First of all you need to initialize a suitable environment in the bash shell console inside your machine. <br> You can do this sourcing once the environment-setup script.
 +
<pre>jdoe@ubuntu ~ $ source /opt/poky/1.2/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi </pre>  
  
= Install binaries via IGEP<br>  =
+
* Download [http://labs.isee.biz/images/6/69/Gpio_examplebeta1.tar.bz2 source code]
 +
* Extract source code
 +
* Build source code:
  
Log with root user to install binaries.  
+
Cross toolchain tools are available into the built-in virtual machine Poky SDK. You only need open bash terminal prompt and write command:
 +
<pre>jdoe@ubuntu ~/Desktop $ arm-poky-linux-gnueabi-gcc -o gpio_example gpio_examplebeta1.c</pre>
  
=== Install module  ===
+
* Copy binary file to IGEP Board
  
Go to:$/modules and insert user-gpio-drv.ko into linux kernel with the following command:  
+
== Execute program ==
<pre>insmod user-gpio-drv.ko
+
Open a remote terminal and locate your program binary, execute program and pass like a parameter 157 value (GPIO 157):
</pre>
+
<pre>root@igep00x0:~# ./gpio_example 157 </pre>
Check that user-gpio-drv.ko is currently loaded with the following command:
+
Result will be:
<pre>lsmod</pre>  
+
<pre>root@igep00x0:~# ./gpio_example 157
The result will be similar at that: <br>
+
gpio/direction: No such file or directory
<pre>root@localhost:~/gpio-driver/module# lsmod
 
Module                  Size  Used by
 
user_gpio_drv          1639  0
 
omap_wdt                3411  0
 
spidev                  4198  0
 
iommu                  8558  0
 
rtc_twl                4411  0
 
rtc_core              11187  1 rtc_twl
 
twl4030_keypad          2970  0
 
</pre>
 
The module is loaded until system halt.
 
  
=== Install shared library  ===
+
poll() GPIO 157 interrupt occurred
 +
............. </pre>
  
Go to:$/lib. libgpio.so is here.
+
== Generate interrupts ==
 
+
Open a second remote terminal and type:
If a program is linked with shared libraries, Kernel seek in specific paths when program is executed. Now is necessary link the libgpio.so path to the environment variable LD_LIBRARY_PATH, use the following command:<br>
+
<pre>cd /sys/class/gpio/
<pre>export LD_LIBRARY_PATH=/root/gpio-driver/lib/
+
echo 156 > export
</pre>
+
cd gpio156/  
Check that libgpio.so is linked correctly. Go to:$/gpio-driver/app, gpio program is here. Type next command:
+
echo out > direction
<pre>ldd gpio
+
echo 0 > value
</pre>
+
echo 1 > value</pre>
ldd command, print shared library dependencies. The result will be similar at that:
+
== Result ==
<pre>root@localhost:~/gpio-driver/app# ldd gpio
+
At first remote terminal you should read a message similar like this:
libgpio.so =&gt; /root/gpio-driver/lib/libgpio.so (0x40197000)
+
<pre>poll() GPIO 157 interrupt occurred </pre>
libc.so.6 =&gt; /lib/libc.so.6 (0x401a0000)
 
/lib/ld-linux.so.3 (0x4008a000)
 
</pre>
 
The shared library is linked until system halt. Now you can execute gpio example program.
 
 
 
= Testing driver  =
 
 
 
To make sure than driver works well, make the next test. I used GPIO_136(sdmmc2_dat4) and GPIO_137(sdmmc2_dat5) because IGEP v2 RC5(without WIFI) don't use them by default: <br>
 
 
 
'''NOTE:''' For more information visit this [[Mux configuration|page]] (under construction). <br>  
 
 
 
=== Configure Mux  ===
 
 
 
Go to:/sys/kernel/debug/omap_mux, and change this mux configuration:
 
<pre>echo 0x104&gt;sdmmc2_dat4
 
echo 0x104&gt;sdmmc2_dat5
 
</pre>  
 
Use cat command to check it:<br>
 
<pre>cat sdmmc2_dat4
 
cat sdmmc2_dat5
 
</pre>
 
The result will be similar at that:
 
<pre>root@localhost:/sys/kernel/debug/omap_mux# cat sdmmc2_dat4
 
name: sdmmc2_dat4.gpio_136 (0x48002164/0x134 = 0x0104), b ae4, t NA
 
mode: OMAP_PIN_INPUT | OMAP_MUX_MODE4
 
signals: sdmmc2_dat4 | sdmmc2_dir_dat0 | NA | sdmmc3_dat0 | gpio_136 | NA | NA | safe_mode
 
</pre>  
 
and
 
<pre>root@localhost:/sys/kernel/debug/omap_mux# cat sdmmc2_dat5
 
name: sdmmc2_dat5.gpio_137 (0x48002166/0x136 = 0x0104), b ah3, t NA
 
mode: OMAP_PIN_INPUT | OMAP_MUX_MODE4
 
signals: sdmmc2_dat5 | sdmmc2_dir_dat1 | cam_global_reset | sdmmc3_dat1 | gpio_137 | hsusb3_tll_stp | mm3_rxdp | safe_mode
 
</pre>  
 
Note: OMAP_PIN_INPUT=Input/Output pin and OMAP_PIN_OUTPUT=Output pin, for Read/Write test you need the first one. GPIO is configured in mode 4.<br>
 
 
 
=== Read/Write test  ===
 
 
 
Link GPIO_136 and GPIO_137 with a wire, these pins are located in J990 connector with numbers 7 and 9. I use the next connector to join them:<br>
 
 
 
{| cellspacing="1" cellpadding="1" border="1" align="center" width="200"
 
|-
 
| [[Image:Connector used readwrite test.JPG|center|350x230px]]
 
|
 
[[Image:All connected readwrite test.JPG|center|350x230px]]
 
 
 
|}
 
 
 
<br>
 
 
 
Now type next code:  
 
<pre>root@localhost:~/gpio-driver/app# ./gpio input 136
 
root@localhost:~/gpio-driver/app# ./gpio output 137 0
 
root@localhost:~/gpio-driver/app# ./gpio get 136   
 
0
 
root@localhost:~/gpio-driver/app# ./gpio output 137 1
 
root@localhost:~/gpio-driver/app# ./gpio get 136   
 
1
 
root@localhost:~/gpio-driver/app#
 
</pre>
 
The results (CMOS Voltages: 0V-1V8):
 
 
 
{| cellspacing="1" cellpadding="1" border="1" align="center" width="200"
 
|-
 
| [[Image:GPIO value0 readwrite test.JPG|center|350x230px]]
 
|
 
[[Image:GPIO value1 readwrite test.JPG|center|350x230px]]
 
 
 
|}
 
 
 
<br> The code above shows that driver works properly, GPIO_136 is configured like input and GPIO_137 is configured like output with value 0, when read GPIO_136 the result is 0. To make sure that works well, configure GPIO_137 with value 1, now GPIO_136 reads 1. <br> This driver have more options like IRQ, but is not explained here.
 
 
 
<br> Other examples:[[What can I do with IGEP0020#How_to_handle_the_gpio-LED.27s]]
 
 
 
[[Category:GPIO]]
 

Revision as of 18:54, 14 September 2012

Overview

This How-To is meant to be a starting point for people to learn use GPIOs for IGEP devices as quickly and easily as possible. For this How-To I used IGEP firmware Yocto

There are more ways to use GPIOs, but this one is very simple.

Feedback and Contributing

At any point, if you see a mistake you can contribute to this How-To.

Requirements

For this How-to, I used:

Configure IGEPv2

By default, GPIO 156 (J990:20) and GPIO 157 (J990:22) are available, connect J990:20 and J990:22 with a cable.

Example program

Example program contains some libraries to control GPIOs, libraries can do:

  • Export and unexport GPIOs
  • Set GPIO direction
  • Set GPIO value
  • Get GPIO value
  • Configure hardware interrupts

Example program configures a GPIO to wait a hardware interrupt. Once the GPIO value change from 0 value to 1 value (rising), program gives you a message.

Compile example program

Download an Install IGEP SDK if you don't have it.

First of all you need to initialize a suitable environment in the bash shell console inside your machine.
You can do this sourcing once the environment-setup script.

jdoe@ubuntu ~ $ source /opt/poky/1.2/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi 
  • Download source code
  • Extract source code
  • Build source code:

Cross toolchain tools are available into the built-in virtual machine Poky SDK. You only need open bash terminal prompt and write command:

jdoe@ubuntu ~/Desktop $ arm-poky-linux-gnueabi-gcc -o gpio_example gpio_examplebeta1.c
  • Copy binary file to IGEP Board

Execute program

Open a remote terminal and locate your program binary, execute program and pass like a parameter 157 value (GPIO 157):

root@igep00x0:~# ./gpio_example 157 

Result will be:

root@igep00x0:~# ./gpio_example 157
gpio/direction: No such file or directory

poll() GPIO 157 interrupt occurred
............. 

Generate interrupts

Open a second remote terminal and type:

cd /sys/class/gpio/
echo 156 > export 
cd gpio156/ 
echo out > direction
echo 0 > value
echo 1 > value

Result

At first remote terminal you should read a message similar like this:

poll() GPIO 157 interrupt occurred