From 790899508e14f52f649f08a81bdf09eeb11a862e Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sat, 20 Feb 2016 12:11:42 -0600 Subject: [PATCH] apps/examples/leds: An example showing how to use the LED driver --- ChangeLog.txt | 2 + examples/Kconfig | 1 + examples/README.txt | 4 + examples/leds/.gitignore | 11 ++ examples/leds/Kconfig | 39 +++++++ examples/leds/Make.defs | 39 +++++++ examples/leds/Makefile | 56 ++++++++++ examples/leds/leds_main.c | 211 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 363 insertions(+) create mode 100644 examples/leds/.gitignore create mode 100644 examples/leds/Kconfig create mode 100644 examples/leds/Make.defs create mode 100644 examples/leds/Makefile create mode 100644 examples/leds/leds_main.c diff --git a/ChangeLog.txt b/ChangeLog.txt index 2019f99bc..b7ab92c11 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1552,4 +1552,6 @@ the OS ARP table (2016-02-08). * apps/nshlib: 'ps' command will show CPU if SMP is enabled (2016-02-19). + * apps/examples/leds: An example to demonstrate use of LED + driver (2016-02-20). diff --git a/examples/Kconfig b/examples/Kconfig index 9e0ee33b4..553b6cfc5 100644 --- a/examples/Kconfig +++ b/examples/Kconfig @@ -30,6 +30,7 @@ source "$APPSDIR/examples/keypadtest/Kconfig" source "$APPSDIR/examples/igmp/Kconfig" source "$APPSDIR/examples/i2schar/Kconfig" source "$APPSDIR/examples/lcdrw/Kconfig" +source "$APPSDIR/examples/leds/Kconfig" source "$APPSDIR/examples/ltdc/Kconfig" source "$APPSDIR/examples/media/Kconfig" source "$APPSDIR/examples/mm/Kconfig" diff --git a/examples/README.txt b/examples/README.txt index 015be7cd6..cf26669f6 100644 --- a/examples/README.txt +++ b/examples/README.txt @@ -715,6 +715,10 @@ examples/lcdrw NuttX is built as a protected, supervisor kernel (CONFIG_BUILD_PROTECTED or CONFIG_BUILD_KERNEL). +examples/adc +^^^^^^^^^^^^ + This is a simple test of the board LED driver at nuttx/drivers/leds/userled_*.c. + examples/ltdc ^^^^^^^^^^^^^ diff --git a/examples/leds/.gitignore b/examples/leds/.gitignore new file mode 100644 index 000000000..fa1ec7579 --- /dev/null +++ b/examples/leds/.gitignore @@ -0,0 +1,11 @@ +/Make.dep +/.depend +/.built +/*.asm +/*.obj +/*.rel +/*.lst +/*.sym +/*.adb +/*.lib +/*.src diff --git a/examples/leds/Kconfig b/examples/leds/Kconfig new file mode 100644 index 000000000..3a1627630 --- /dev/null +++ b/examples/leds/Kconfig @@ -0,0 +1,39 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +config EXAMPLES_LEDS + bool "LED driver example" + default n + depends on ARCH_HAVE_LEDS && !ARCH_LEDS + ---help--- + Enable the LED driversexample + +if EXAMPLES_LEDS + +config EXAMPLES_LEDS_PROGNAME + string "Program name" + default "leds" + depends on BUILD_KERNEL + ---help--- + This is the name of the program that will be use when the NSH ELF + program is installed. + +config EXAMPLES_LEDS_PRIORITY + int "LED task priority" + default 100 + +config EXAMPLES_LEDS_STACKSIZE + int "LED stack size" + default 2048 + +config EXAMPLES_LEDS_DEVPATH + string "LED device path" + default "/dev/userleds" + +config EXAMPLES_LEDS_LEDSET + hex "Set of LEDs to use" + default 0x0f + +endif diff --git a/examples/leds/Make.defs b/examples/leds/Make.defs new file mode 100644 index 000000000..769f68af1 --- /dev/null +++ b/examples/leds/Make.defs @@ -0,0 +1,39 @@ +############################################################################ +# apps/examples/leds/Make.defs +# Adds selected applications to apps/ build +# +# Copyright (C) 2015 Gregory Nutt. All rights reserved. +# Author: Gregory Nutt +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name NuttX nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + +ifeq ($(CONFIG_EXAMPLES_LEDS),y) +CONFIGURED_APPS += examples/leds +endif diff --git a/examples/leds/Makefile b/examples/leds/Makefile new file mode 100644 index 000000000..88be60f7d --- /dev/null +++ b/examples/leds/Makefile @@ -0,0 +1,56 @@ +############################################################################ +# apps/examples/leds/Makefile +# +# Copyright (C) 2008, 2010-2013 Gregory Nutt. All rights reserved. +# Author: Gregory Nutt +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name NuttX nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + +-include $(TOPDIR)/Make.defs + +# Hello, World! built-in application info + +CONFIG_EXAMPLES_LEDS_PRIORITY ?= SCHED_PRIORITY_DEFAULT +CONFIG_EXAMPLES_LEDS_STACKSIZE ?= 2048 + +APPNAME = leds +PRIORITY = $(CONFIG_EXAMPLES_LEDS_PRIORITY) +STACKSIZE = $(CONFIG_EXAMPLES_LEDS_STACKSIZE) + +# Hello, World! Example + +ASRCS = +CSRCS = +MAINSRC = leds_main.c + +CONFIG_EXAMPLES_LEDS_PROGNAME ?= leds$(EXEEXT) +PROGNAME = $(CONFIG_EXAMPLES_LEDS_PROGNAME) + +include $(APPDIR)/Application.mk diff --git a/examples/leds/leds_main.c b/examples/leds/leds_main.c new file mode 100644 index 000000000..0041a83e6 --- /dev/null +++ b/examples/leds/leds_main.c @@ -0,0 +1,211 @@ +/**************************************************************************** + * examples/leds/leds_main.c + * + * Copyright (C) 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static bool g_led_daemon_started; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: led_daemon + ****************************************************************************/ + +static int led_daemon(int argc, char *argv[]) +{ + userled_set_t supported; + userled_set_t ledset; + bool incrementing; + int ret; + int fd; + + /* Indicate that we are running */ + + g_led_daemon_started = true; + printf("led_daemon: Running\n"); + + /* Open the LED driver */ + + printf("led_daemon: Opening %s\n", CONFIG_EXAMPLES_LEDS_DEVPATH); + fd = open(CONFIG_EXAMPLES_LEDS_DEVPATH, O_RDWR); + if (fd < 0) + { + int errcode = errno; + printf("led_daemon: ERROR: Failed to open %s: %d\n", + CONFIG_EXAMPLES_LEDS_DEVPATH, errcode); + goto errout; + } + + /* Get the set of LEDs supported */ + + ret = ioctl(fd, ULEDIOC_SUPPORTED, + (unsigned long)((uintptr_t)&supported)); + if (ret < 0) + { + int errcode = errno; + printf("led_daemon: ERROR: ioctl(ULEDIOC_SUPPORTED) failed: %d\n", + errcode); + goto errout_with_fd; + } + + printf("led_daemon: Supported LEDs 0x%02x\n", (unsigned int)supported); + + /* Now loop forever, changing the LED set */ + + ledset = 0; + incrementing = true; + + for (; ; ) + { + userled_set_t newset; + userled_set_t tmp; + + if (incrementing) + { + tmp = ledset; + do + { + tmp++; + newset = tmp & CONFIG_EXAMPLES_LEDS_LEDSET; + } + while (newset == ledset); + + if (newset == 0) + { + incrementing = false; + continue; + } + } + else + { + if (ledset == 0) + { + incrementing = true; + continue; + } + + tmp = ledset; + do + { + tmp--; + newset = tmp & CONFIG_EXAMPLES_LEDS_LEDSET; + } + while (newset == ledset); + } + + ledset = newset; + printf("led_daemon: LED set 0x%02x\n", (unsigned int)ledset); + + ret = ioctl(fd, ULEDIOC_SETALL, ledset); + if (ret < 0) + { + int errcode = errno; + printf("led_daemon: ERROR: ioctl(ULEDIOC_SUPPORTED) failed: %d\n", + errcode); + goto errout_with_fd; + } + + usleep(500*1000L); + } + +errout_with_fd: + (void)close(fd); + +errout: + g_led_daemon_started = false; + return EXIT_FAILURE; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * leds_main + ****************************************************************************/ + +#ifdef CONFIG_BUILD_KERNEL +int main(int argc, FAR char *argv[]) +#else +int leds_main(int argc, char *argv[]) +#endif +{ + char *ledargv[2]; + int ret; + + if (g_led_daemon_started) + { + printf("leds_main: led_daemon already running\n"); + return EXIT_SUCCESS; + } + + ledargv[0] = "led_daemon"; + ledargv[1] = NULL; + + printf("leds_main: Starting the led_daemon\n"); + ret = task_create("led_daemon", CONFIG_EXAMPLES_LEDS_PRIORITY, + CONFIG_EXAMPLES_LEDS_STACKSIZE, led_daemon, + (FAR char * const *)ledargv); + if (ret < 0) + { + int errcode = errno; + printf("leds_main: ERROR: Failed to start led_daemon: %d\n", + errcode); + return EXIT_FAILURE; + } + + printf("led_daemon started\n"); + return EXIT_SUCCESS; +}