Personal tools

Log in

Changes

From IGEP - ISEE Wiki

Jump to: navigation, search

How to use GPIOs

2,794 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], Ubuntu 10.04 with Linaro Toolchain, IGEP v2 RC5 and [http://svn.hylands.org/linux/gpio/ GPIO driver] wrote by Dave Hylands. There are more ways to use GPIOs in IGEP v2, but this one is very simple.<br>
= Feedback There are more ways to use GPIOs. This article show two simple ways to use gpios: bash commandline and Contributing =C-code.
At any point, if you see a mistake you can contribute to For this How-ToI used [http://labs.<br> isee.biz/index.php/IGEP_firmware_Yocto IGEP firmware Yocto]
= Compile GPIO driver source code via Host<br> == Feedback and Contributing ===At any point, if you see a mistake you can contribute to this How-To. Edit yourself !
Download source code from author website using the next command:<br> == Requirements ==<pre>wget For this How-r -np httpto, I used://svn.hylands.org/linux/gpio/</pre> * IGEPv2 Board Due the source Makefiles are implemented * Only for Gumstix SDK, C-program example it is necessary change some constants for compile with our Hostalso needed:** Add shortcircuit cable between J990:20 and J990:22 pins. These constants By default, GPIO 156 (J990:20) and GPIO 157 (J990:22) are: available on these J990 pins.
In filesAnother boards tested:
$/svn.hylands.org/linux/gpio/app/Makefile *IGEP COM MODULE *IGEP COM AQUILA
$/svn.hylands.org/linux/gpio/lib/Makefile == How to chek an GPIO ==
Search lines: <pre>OVEROTOP ?= /home/gumstix/overoThe gpio-oeCROSS_COMPILE ?= $(OVEROTOP)/tmp/sysroots/x86_64int-linuxtest.c program shows one way of using the sysfs file /usrsys/armv7aclass/bin/arm-angstrom-linux-gnueabi-<gpio/pre> Replaced by your cross compiler path, for example: <pre>OVEROTOP ?= gpioXX/CROSS_COMPILE ?= $value to block program execution using poll(OVEROTOP)/usr/bin/arm-linux-gnueabi-</pre> In file:<br> until the input level on GPIOXX changes.
$/svn[[File:GPIO_TEST.hylands.org/linux/gpio/modules/Makefile<br> tar]]
Search lines== Bash commandline ==Basic gpio operations could be done using bash and sysfs : * Export GPIOs <pre>OVEROTOP ?= echo "GPIO number NN" > /homesys/gumstixclass/overo-oe#CROSS_COMPILE ?= $(OVEROTOP)gpio/tmpexport</cross/armv7a/bin/arm-angstrom-linux-gnueabi-pre>CROSS_COMPILE ?= $(OVEROTOP)** For example: '''echo "156" > /tmpsys/sysrootsclass/x86_64-linuxgpio/usr/armv7a/bin/arm-angstrom-linux-gnueabi-export'''<br><br>KERNEL_PATH &nbsp;?= ..* Unexport GPIOs <pre>echo "GPIO number NN" > /..sys/..class/..gpio/..unexport</gumstixpre> * Set GPIO direction <pre>echo "out" > /overo-oesys/tmpclass/sysrootsgpio/overo-angstrom-linux-gnueabigpioNN/kernelARCH ?= armdirection</pre> Replaced by your cross compiler path and your kernel source used path, for ** For example: <pre'''echo "out" >OVEROTOP ?= /#CROSS_COMPILE ?= $(OVEROTOP)sys/class/tmpgpio/crossgpio156/armv7adirection'''<br><br>* Set GPIO value <pre>echo "1" > /binsys/arm-angstrom-linux-gnueabi-CROSS_COMPILE ?= $(OVEROTOP)class/gpio/usrgpioNN/binvalue</arm-linux-gnueabi-pre>KERNEL_PATH &nbsp;?= ..* Get GPIO value <pre>cat /..sys/..class/..gpio/..gpioNN/&lt;your kernel source path used&gt;ARCH ?= armvalue</pre> Go to: $* Configure hardware interrupts <pre>echo "rising" > /svn.hylands.orgsys/linuxclass/gpio/Makefile and compile all source code downloaded using make command. gpioNN/edge<br/pre>
Send binaries created from Host to Igep v2. <br>
= Install binaries via IGEP<br> = C-program Example ==
Log with root user C-program Example contains some C-functions to install binariescontrol GPIOs. These also can do:* Export and unexport GPIOs* Set GPIO direction * Set GPIO value * Get GPIO value * Configure hardware interrupts
=== Install module ===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.
Go to=== Compile example program ===[http:$/svn.hylands.org/linux/gpio/modules/ and insert user-gpio-drvlabs.ko into linux kernel with the following command: <pre>insmod user-gpio-drvisee.ko<biz/pre> Check that user-gpio-drvindex.ko is currently loaded with the following command: <pre>lsmod<php/pre> The result will be similar than this: <pre>root@localhost:~/svnHow_to_setup_a_cross_compiler#Download.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 halt2FInstall_IGEP_SDK Download an Install] IGEP SDK if you don't have it.
=== Install dynamic library ===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>
Go to* Download [http:$/svn/labs.hylandsisee.orgbiz/linuximages/gpio6/lib69/Gpio_examplebeta1. libgpio.so will be found heretar. bz2 source code]* Extract source code* Build source code:
If a program is link with dinamic libraries, Linux kernel find this ones Cross toolchain tools are available into the built-in a specific paths when program is executedvirtual machine Poky SDK. Now is necessary link the libgpio.so path to the envireonment variable LD_LIBRARY_PATH, use the following commnad:<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 will be found here. Type next command: <pre>ldd gpio </pre> ldd You only need open bash terminal prompt and write command list program dependencies and show its paths. The result will be similar than this: <pre>rootjdoe@lSee if libgpio.so is found it. If you execute program in bash without linking library dependencies, bash give you a error message. ocalhost:ubuntu ~/svn.hylands.org/Desktop $ arm-poky-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.sognueabi-gcc -o gpio_example gpio_examplebeta1.3 (0x4008a000)c</pre> Now you can execute example program gpio.
= Testing driver =* Copy binary file to IGEP Board
To make sure than driver works well=== Execute program ===Open a remote terminal and locate your program binary, make the next test with GPIO_136 execute program and GPIO_137pass like a parameter 157 value (GPIO 157): <brpre> root@igep00x0:~# ./gpio_example 157 </pre>Result will be:<pre>root@igep00x0:~# ./gpio_example 157gpio/direction: No such file or directory
NOTE: Make sure that MMC2_DAT4 and MMC2_DAT5 are not used, for more information visit this [[Mux configuration|page]]. With IGEP v2 RC5 poll(version without WIFI) this pins are not used by defaultGPIO 157 interrupt occurred............. </pre>
=== Configure Mux 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:/sys/kernel/debug/omap_mux, and change the this mux configuration: <pre>echo 0x104&gt;sdmmc2_dat4echo 0x104&gt;sdmmc2_dat5</pre> Use cat to check it:<br> <pre>cat sdmmc2_dat4cat sdmmc2_dat5</pre> <br> The result will be similar than this: <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 (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 and Output pin and OMAP_PIN_OUTPUT=Output pin. === 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. Type next textmessage similar like this: <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# poll() GPIO 157 interrupt occurred </pre> The text above show that driver work properly, GPIO_136 is configure like input and GPIO_137 is configure like output with value 0, now read GPIO_136 and the result is 0. To make sure configure GPIO_137 with value 1 and GPIO_136 read 1. <br> This driver have more options like IRQ, but is not explained here.  '''Under construction''' <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]]