Personal tools

Log in

Changes

From IGEP - ISEE Wiki

Jump to: navigation, search

How to use GPIOs

2,320 bytes removed, 16:59, 22 September 2015
no edit summary
__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 GPIO driver (NOTE: Upload source code).
There are more ways to use GPIOs in IGEP v2, but this one is very . This article show two simpleways to use gpios: bash commandline and C-code.<br>
= Feedback and Contributing =For this How-To I used [http://labs.isee.biz/index.php/IGEP_firmware_Yocto IGEP firmware Yocto]
=== Feedback and Contributing ===At any point, if you see a mistake you can contribute to this How-To.<br> Edit yourself !
= Compile = Requirements ==For this How-to, I used:* IGEPv2 Board * Only for C-program example it also needed:** Add shortcircuit cable between J990:20 and J990:22 pins. By default, GPIO driver source code via Host<br> =156 (J990:20) and GPIO 157 (J990:22) are available on these J990 pins.
Download GPIO driver (NOTEAnother boards tested:Upload source code) and [[Linux Kernel 2.6.35.y|Kernel 2.6.35.y]] source code. Extract files.<br>
Edit GPIO driver Makefile's: *IGEP COM MODULE *IGEP COM AQUILA
-In files: $/app/Makefile and $/lib/Makefile, make sure that your CROSS_COMPILE path is correct. == How to chek an GPIO ==
The gpio-In int-test.c program shows one way of using the sysfs file: $/modulessys/class/gpio/gpioXX/Makefile, make sure that your CROSS_COMPILE path is correct and&nbsp;type your Kernel 2.6.35.y pathvalue to block program execution using poll() until the input level on GPIOXX changes.<br>
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: <pre>sudo apt-get install ncurses-dev </pre> -Go to kernel path and type[[File:GPIO_TEST.tar]]
&lt;== Bash commandline ==Basic gpio operations could be done using bash and sysfs :* Export GPIOs <pre&gt;>echo "GPIO number NN" > /sys/class/gpio/export</pre>** For example: '''echo "156" > /sys/class/gpio/export'''<br><br>* Unexport GPIOs <pre>echo "GPIO number NN" > /sys/class/gpio/unexport</pre> * Set GPIO direction <pre>echo "out" > /sys/class/gpio/gpioNN/direction</pre>** For example: '''echo "out" > /sys/class/gpio/gpio156/direction'''<br><br>* Set GPIO value <pre>echo "1" > /sys/class/gpio/gpioNN/value</pre>* Get GPIO value <pre>cat /sys/class/gpio/gpioNN/value</pre>* Configure hardware interrupts <pre>echo "rising" > /sys/class/gpio/gpioNN/edge</pre>
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
&lt;/pre&gt;== C-program Example ==
Exit Linux Kernel Configuration an return C-program Example contains some C-functions to bashcontrol GPIOs. Type nowThese also can do:* Export and unexport GPIOs* Set GPIO direction * Set GPIO value * Get GPIO value * Configure hardware interrupts
&lt;pre&gt;<br>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.
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_prepare<br>= 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.
&lt;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&gt;<br>
File $* Download [http:/include/generatedlabs.isee.biz/images/6/autoconf69/Gpio_examplebeta1.tar.h was createdbz2 source code]* Extract source code* Build source code:
Finally compile GPIO driver, go to main Makefile path Cross toolchain tools are available into the built-in virtual machine Poky SDK. You only need open bash terminal prompt and compile all source code using make write command: <pre>jdoe@ubuntu ~/Desktop $ arm-poky-linux-gnueabi-gcc -o gpio_example gpio_examplebeta1. c</pre>
Send binaries created from Host * Copy binary file to Igep v2. <br>IGEP Board
= Install binaries via IGEP== Execute program ===Open a remote terminal and locate your program binary, execute program and pass like a parameter 157 value (GPIO 157):<pre>root@igep00x0:~# ./gpio_example 157 <br/pre> =Result will be:<pre>root@igep00x0:~# ./gpio_example 157gpio/direction: No such file or directory
Log with root user to install binariespoll() GPIO 157 interrupt occurred. ............ </pre>
=== Install module Generate interrupts ===Open a second remote terminal and type:<pre>cd /sys/class/gpio/echo 156 > export cd gpio156/ echo out > directionecho 0 > valueecho 1 > value</pre>
Go to:$/svn.hylands.org/linux/gpio/modules/ and insert user-gpio-drv.ko into linux kernel with the following command: <pre>insmod user-gpio-drv.ko</pre> Check that user-gpio-drv.ko is currently loaded with the following command: <pre>lsmod</pre> The result will be similar at that: <br> <pre>root@localhost:~/svn.hylands.org/linux/gpio/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. === Install shared library Result === Go to:$/svn.hylands.org/linux/gpio/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/svn.hylands.org/linux/gpio/lib/</pre> Check that libgpio.so is linked correctly. Go to:$/svn.hylands.org/linux/gpio/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@lSee if libgpio.so is found it. If you execute program in bash without linking library dependencies, bash give At first remote terminal you should read a error message. ocalhost:~/svn.hylands.org/linux/gpio/app# ldd gpio libgpio.so =&gt; /root/svn.hylands.org/linux/gpio/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. = 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]]. <br>  === Configure Mux === Go to:/sys/kernel/debug/omap_mux, and change similar like this mux configuration: <pre>echo 0x104&gt;sdmmc2_dat4echo 0x104&gt;sdmmc2_dat5</pre> Use cat command to check it:<br> <pre>cat sdmmc2_dat4cat sdmmc2_dat5</pre> The result will be similar at that: <pre>root@localhost:/sys/kernel/debug/omap_mux# cat sdmmc2_dat4name: 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</pre> and <pre>root@localhost:/sys/kernel/debug/omap_mux# cat sdmmc2_dat5name: sdmmc2_dat5.gpio_137 poll(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_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. Now type next code: <pre>root@localhost:~/svn.hylands.org/linux/gpio/app# ./gpio input 136root@localhost:~/svn.hylands.org/linux/gpio/app# ./gpio output 137 0root@localhost:~/svn.hylands.org/linux/gpio/app# ./gpio get 136 0root@localhost:~/svn.hylands.org/linux/gpio/app# ./gpio output 137 1root@localhost:~/svn.hylands.org/linux/gpio/app# ./gpio get 136 1root@localhost:~/svn.hylands.org/linux/gpio/app# 157 interrupt occurred </pre> 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:Work_in_progress|Work_in_progress]] [[Category:Communications]]