Add gpio interrupt sample code
This commit is contained in:
parent
82cc507e07
commit
7b815d3369
5 changed files with 227 additions and 0 deletions
69
gpio_interrupt/.cproject
Normal file
69
gpio_interrupt/.cproject
Normal file
|
@ -0,0 +1,69 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="cdt.managedbuild.config.gnu.cross.exe.debug.768150796">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cross.exe.debug.768150796" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.cross.exe.debug.768150796" name="Debug" parent="cdt.managedbuild.config.gnu.cross.exe.debug">
|
||||
<folderInfo id="cdt.managedbuild.config.gnu.cross.exe.debug.768150796." name="/" resourcePath="">
|
||||
<toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.debug.1727397310" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.debug">
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.1354225165" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
|
||||
<builder buildPath="${workspace_loc:/gpio_interrupt}/Debug" id="cdt.managedbuild.builder.gnu.cross.1798184114" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.builder.gnu.cross"/>
|
||||
<tool command="${CC}" id="cdt.managedbuild.tool.gnu.cross.c.compiler.538482782" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
|
||||
<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.option.optimization.level.172902044" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.option.debugging.level.550749309" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.option.misc.other.375376757" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="${CFLAGS} -c --sysroot=/usr/local/oecore-x86_64/sysroots/armv7at2hf-neon-angstrom-linux-gnueabi/" valueType="string"/>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1828414067" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.698371395" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
|
||||
<option id="gnu.cpp.compiler.option.optimization.level.665680244" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
|
||||
<option id="gnu.cpp.compiler.option.debugging.level.362870575" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
|
||||
</tool>
|
||||
<tool command="${CC}" id="cdt.managedbuild.tool.gnu.cross.c.linker.385142562" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker">
|
||||
<option id="gnu.c.link.option.libs.1456605307" name="Libraries (-l)" superClass="gnu.c.link.option.libs" useByScannerDiscovery="false" valueType="libs">
|
||||
<listOptionValue builtIn="false" value="soc"/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.2020895722" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1934610616" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.archiver.1389673101" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
|
||||
<tool command="${AS}" id="cdt.managedbuild.tool.gnu.cross.assembler.958188375" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
|
||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1655377381" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="gpio_interrupt.cdt.managedbuild.target.gnu.cross.exe.388746707" name="Executable" projectType="cdt.managedbuild.target.gnu.cross.exe"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cross.exe.debug.768150796;cdt.managedbuild.config.gnu.cross.exe.debug.768150796.;cdt.managedbuild.tool.gnu.cross.c.compiler.538482782;cdt.managedbuild.tool.gnu.c.compiler.input.1828414067">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||
<configuration configurationName="Debug">
|
||||
<resource resourceType="PROJECT" workspacePath="/gpio_interrupt"/>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||
</cproject>
|
1
gpio_interrupt/.gitignore
vendored
Normal file
1
gpio_interrupt/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/Debug/
|
26
gpio_interrupt/.project
Normal file
26
gpio_interrupt/.project
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>gpio_interrupt</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
14
gpio_interrupt/.settings/language.settings.xml
Normal file
14
gpio_interrupt/.settings/language.settings.xml
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<project>
|
||||
<configuration id="cdt.managedbuild.config.gnu.cross.exe.debug.768150796" name="Debug">
|
||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="643270697067650404" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||
</provider>
|
||||
</extension>
|
||||
</configuration>
|
||||
</project>
|
117
gpio_interrupt/gpio_interrupt.c
Normal file
117
gpio_interrupt/gpio_interrupt.c
Normal file
|
@ -0,0 +1,117 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "libsoc_gpio.h"
|
||||
|
||||
/*
|
||||
* libsoc GPIO documentation: http://jackmitch.github.io/libsoc/c/gpio/#gpio
|
||||
*/
|
||||
|
||||
volatile bool interrupt_occurred = false;
|
||||
volatile bool led_status = false;
|
||||
|
||||
int gpio_interrupt_callback(void* arg)
|
||||
{
|
||||
interrupt_occurred = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
uint32_t gpio_input;
|
||||
uint32_t led_output;
|
||||
uint32_t ret = 0;
|
||||
gpio *gpio_interrupt = NULL;
|
||||
gpio *gpio_led = NULL;
|
||||
|
||||
printf("Enter the GPIO number to use as interrupt:\t");
|
||||
scanf("%d", &gpio_input);
|
||||
|
||||
printf("Enter the GPIO number used for LED output:\t");
|
||||
scanf("%d", &led_output);
|
||||
|
||||
/*
|
||||
* It is expected that the gpio being requested is pin multiplexed correctly
|
||||
* in the kernel device tree or board file as applicable else gpio request
|
||||
* is bound to fail.
|
||||
*/
|
||||
gpio_interrupt = libsoc_gpio_request(gpio_input, LS_SHARED);
|
||||
if (gpio_interrupt == NULL) {
|
||||
perror("gpio request failed");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
gpio_led = libsoc_gpio_request(led_output, LS_SHARED);
|
||||
if (gpio_led == NULL) {
|
||||
perror("led gpio request failed");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ret = libsoc_gpio_set_direction(gpio_led, OUTPUT);
|
||||
if (ret == EXIT_FAILURE) {
|
||||
perror("Failed to set gpio led direction");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ret = libsoc_gpio_set_direction(gpio_interrupt, INPUT);
|
||||
if (ret == EXIT_FAILURE) {
|
||||
perror("Failed to set gpio direction");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ret = libsoc_gpio_set_edge(gpio_interrupt, RISING);
|
||||
if (ret == EXIT_FAILURE) {
|
||||
perror("Failed to set gpio edge");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ret = libsoc_gpio_callback_interrupt(gpio_interrupt, &gpio_interrupt_callback, NULL);
|
||||
if (ret == EXIT_FAILURE) {
|
||||
perror("Failed to set gpio callback");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
printf("Waiting for interrupt\n");
|
||||
|
||||
while (true) {
|
||||
if (interrupt_occurred) {
|
||||
|
||||
interrupt_occurred = false;
|
||||
|
||||
if (!led_status) {
|
||||
led_status = true;
|
||||
libsoc_gpio_set_level(gpio_led, HIGH);
|
||||
} else {
|
||||
led_status = false;
|
||||
libsoc_gpio_set_level(gpio_led, LOW);
|
||||
}
|
||||
printf("Interrupt occurred\n");
|
||||
/* Uncomment this to exit on first interrupt */
|
||||
//goto exit;
|
||||
}
|
||||
usleep(200);
|
||||
}
|
||||
|
||||
exit:
|
||||
if (gpio_interrupt) {
|
||||
ret = libsoc_gpio_free(gpio_interrupt);
|
||||
if (ret == EXIT_FAILURE)
|
||||
perror("Could not free gpio");
|
||||
}
|
||||
|
||||
if (gpio_led) {
|
||||
ret = libsoc_gpio_free(gpio_led);
|
||||
if (ret == EXIT_FAILURE)
|
||||
perror("Could not free led gpio");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
Loading…
Reference in a new issue