Personal tools

Log in

Changes

From IGEP - ISEE Wiki

Jump to: navigation, search

How to use GPIOs

3,586 bytes removed, 18:54, 14 September 2012
m
no edit summary
'''UNDER MAINTENANCE'''{{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 howHow-to i To I used [http://releaseslabs.linaroisee.orgbiz/platform/linaro-m/headless/finalindex.php/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_firmware_Yocto IGEP v2 RC5 and [http://downloads.igep.es/labs/gpio-driver.tar.bz2 GPIO driverfirmware Yocto].
There are more ways to use GPIOs in IGEP v2, but this one is very simple.<br>
== Feedback and Contributing ==
At any point, if you see a mistake you can contribute to this How-To.<br>
= Compile GPIO driver source code via Host<br> = Requirements ==
Download For this How-to, I used:* IGEPv2 Board* [http://downloadslabs.igepisee.esbiz/images/labs6/69/gpio-driverGpio_examplebeta1.tar.bz2 GPIO driver] and [[Linux Kernel 2.6.35.y|Kernel 2.6.35.yexample]] source code. Extract files.<br>
Edit == Configure IGEPv2==By default, GPIO driver Makefile's156 (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 fileExample program contains some libraries to control GPIOs, libraries can do: $/modules/Makefile, make sure that your CROSS_COMPILE path is correct * Export and&nbsp;type your Kernel 2.6.35.y path.<br> unexport GPIOs* Set GPIO direction * Set GPIO value * Get GPIO value * Configure hardware interrupts
We will use Example program configures a GPIO to wait a hardware interrupt. Once the ncurses program for set up Kernel configurationGPIO value change from 0 value to 1 value (rising), if you don't have this program installed then gives you must install it with this command: <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/autoconfa message.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 First of all you need to Igep v2initialize 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 binariesCross 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 == Execute program ==Open a remote terminal and locate your program binary, execute program and insert user-gpio-drv.ko into linux kernel with the following commandpass like a parameter 157 value (GPIO 157): <pre>insmod user-gpio-drvroot@igep00x0:~# .ko</pre> Check that user-gpio-drv.ko is currently loaded with the following command: <pre>lsmodgpio_example 157 </pre> The result Result will be similar at that: <br> <pre>root@localhostigep00x0:~# ./gpio_example 157gpio-driver/module# lsmodModule Size Used byuser_gpio_drv 1639 0 omap_wdt 3411 0 spidev 4198 0 iommu 8558 0 rtc_twl 4411 0 rtc_core 11187 1 rtc_twltwl4030_keypad 2970 0 </pre> The module is loaded until system halt. direction: No such file or directory
=== Install shared library ===poll() GPIO 157 interrupt occurred............. </pre>
Go to:$/lib. libgpio.so is here.  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>export LD_LIBRARY_PATH=/root/gpio-driver/lib/</pre> Check that libgpio.so is linked correctly. Go to:$/gpio-driver/app, gpio program is here. Type next command: <pre>ldd gpio </pre> ldd command, print shared library dependencies. The result will be similar at that: <pre>root@localhost:~/gpio-driver/app# ldd gpio libgpio.so =&gt; /root/gpio-driver/lib/libgpio.so (0x40197000) 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.  Generate interrupts = Testing driver To make sure than driver works well, make the next test. I used GPIO_136(sdmmc2_dat4) Open a second remote terminal and GPIO_137(sdmmc2_dat5) because IGEP v2 RC5(without WIFI) don't use them by defaulttype: <br>  '''NOTE:''' For more information visit this [[Mux configuration|page]] (under construction). <brpre>  === Configure Mux === Go to:cd /sys/kernelclass/debuggpio/omap_mux, and change this mux configuration: <pre>echo 0x104&gt;sdmmc2_dat4echo 0x104&gt;sdmmc2_dat5</pre156 > export Use cat command to check it:<br> <pre>cat sdmmc2_dat4cat sdmmc2_dat5<cd gpio156/pre> The result will be similar at that: <preecho out >root@localhost:/sys/kernel/debug/omap_mux# cat sdmmc2_dat4directionname: sdmmc2_dat4.gpio_136 (0x48002164/0x134 = 0x0104), b ae4, t NAmode: OMAP_PIN_INPUT | OMAP_MUX_MODE4signals: sdmmc2_dat4 | sdmmc2_dir_dat0 | NA | sdmmc3_dat0 | gpio_136 | NA | NA | safe_mode</preecho 0 > valueand <preecho 1 >root@localhost:/sys/kernel/debug/omap_mux# cat sdmmc2_dat5name: sdmmc2_dat5.gpio_137 (0x48002166/0x136 = 0x0104), b ah3, t NAmode: OMAP_PIN_INPUT | OMAP_MUX_MODE4signals: sdmmc2_dat5 | sdmmc2_dir_dat1 | cam_global_reset | sdmmc3_dat1 | gpio_137 | hsusb3_tll_stp | mm3_rxdp | safe_modevalue</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 =Result == Link GPIO_136 and GPIO_137 with At first remote terminal you should read 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 codemessage similar like this: <pre>root@localhost:~/gpio-driver/app# ./gpio input 136root@localhost:~/gpio-driver/app# ./gpio output 137 0root@localhost:~/gpio-driver/app# ./gpio get 136 0root@localhost:~/gpio-driver/app# ./gpio output 137 1root@localhost:~/gpio-driver/app# ./gpio get 136 1root@localhost:~/gpio-driver/app# </pre> The results poll(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]]  |} 157 interrupt occurred <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/pre> 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]]
4,199
edits