diff --git a/examples/xbc_test/.gitignore b/examples/xbc_test/.gitignore new file mode 100644 index 000000000..fa1ec7579 --- /dev/null +++ b/examples/xbc_test/.gitignore @@ -0,0 +1,11 @@ +/Make.dep +/.depend +/.built +/*.asm +/*.obj +/*.rel +/*.lst +/*.sym +/*.adb +/*.lib +/*.src diff --git a/examples/xbc_test/Kconfig b/examples/xbc_test/Kconfig new file mode 100644 index 000000000..9aa0d573d --- /dev/null +++ b/examples/xbc_test/Kconfig @@ -0,0 +1,36 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +config EXAMPLES_XBC_TEST + bool "XBox Controller Test example" + default n + ---help--- + Enable the XBox Controller Test example + +if EXAMPLES_XBC_TEST + +config EXAMPLES_XBC_TEST_PROGNAME + string "Program name" + default "xbc_test" + 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_XBC_DEVNAME + string "XBox Controller Device Name" + default "/dev/xboxa" + ---help--- + Name of XBox controller device to be used. Default: "/dev/xboxa" + +config EXAMPLES_XBC_TEST_PRIORITY + int "Xbc_test task priority" + default 100 + +config EXAMPLES_XBC_TEST_STACKSIZE + int "XBox Controller Test stack size" + default 2048 + +endif diff --git a/examples/xbc_test/Make.defs b/examples/xbc_test/Make.defs new file mode 100644 index 000000000..18dbf308a --- /dev/null +++ b/examples/xbc_test/Make.defs @@ -0,0 +1,42 @@ +############################################################################ +# apps/examples/xbc_test/Make.defs +# Adds selected applications to apps/ build +# +# Copyright (C) 2015 Gregory Nutt. All rights reserved. +# Author: Gregory Nutt +# +# Copyright (C) 2017 Brian Webb. All rights reserved. +# Author: Brian Webb +# +# 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_XBC_TEST),y) +CONFIGURED_APPS += examples/xbc_test +endif diff --git a/examples/xbc_test/Makefile b/examples/xbc_test/Makefile new file mode 100644 index 000000000..16be17d3d --- /dev/null +++ b/examples/xbc_test/Makefile @@ -0,0 +1,59 @@ +############################################################################ +# apps/examples/hello/Makefile +# +# Copyright (C) 2008, 2010-2013 Gregory Nutt. All rights reserved. +# Author: Gregory Nutt +# +# Copyright (C) 2017 Brian Webb. All rights reserved. +# Author: Brian Webb +# +# 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 + +# XBox controller driver test built-in application info + +CONFIG_EXAMPLES_XBC_TEST_PRIORITY ?= SCHED_PRIORITY_DEFAULT +CONFIG_EXAMPLES_XBC_TEST_STACKSIZE ?= 2048 + +APPNAME = xbc_test +PRIORITY = $(CONFIG_EXAMPLES_XBC_TEST_PRIORITY) +STACKSIZE = $(CONFIG_EXAMPLES_XBC_TEST_STACKSIZE) + +# Xbc_Test, World! Example + +ASRCS = +CSRCS = +MAINSRC = xbc_test_main.c + +CONFIG_EXAMPLES_XBC_TEST_PROGNAME ?= xbc_test$(EXEEXT) +PROGNAME = $(CONFIG_EXAMPLES_XBC_TEST_PROGNAME) + +include $(APPDIR)/Application.mk diff --git a/examples/xbc_test/xbc_test_main.c b/examples/xbc_test/xbc_test_main.c new file mode 100644 index 000000000..c4d36e038 --- /dev/null +++ b/examples/xbc_test/xbc_test_main.c @@ -0,0 +1,157 @@ +/**************************************************************************** + * examples/xbc_test/xbc_test_main.c + * + * Copyright (C) 2008, 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Copyright (C) 2017 Brian Webb. All rights reserved. + * Author: Brian Webb + * + * 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 + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +/* Configuration ************************************************************/ + +/* Sanity checking */ + +#ifndef CONFIG_USBHOST +# error "CONFIG_USBHOST is not defined" +#endif + +#ifdef CONFIG_USBHOST_INT_DISABLE +# error "Interrupt endpoints are disabled (CONFIG_USBHOST_INT_DISABLE)" +#endif + +#ifndef CONFIG_NFILE_DESCRIPTORS +# error "CONFIG_NFILE_DESCRIPTORS > 0 needed" +#endif + +/* Provide some default values for other configuration settings */ + +#ifndef CONFIG_EXAMPLES_XBC_DEVNAME +# define CONFIG_EXAMPLES_XBC_DEVNAME "/dev/xboxa" +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * hello_main + ****************************************************************************/ + +#ifdef CONFIG_BUILD_KERNEL +int main(int argc, FAR char *argv[]) +#else +int xbc_test_main(int argc, char *argv[]) +#endif +{ + char buffer[256]; + ssize_t nbytes; + int fd; + + /* Eventually logic here will open the controller device and perform the + * controller test. + */ + + for (;;) + { + /* Open the controller device. Loop until the device is successfully + * opened. + */ + + do + { + printf("Opening device %s\n", CONFIG_EXAMPLES_XBC_DEVNAME); + fd = open(CONFIG_EXAMPLES_XBC_DEVNAME, O_RDONLY); + if (fd < 0) + { + printf("Failed: %d\n", errno); + fflush(stdout); + sleep(3); + } + } + while (fd < 0); + + printf("Device %s opened\n", CONFIG_EXAMPLES_XBC_DEVNAME); + fflush(stdout); + + /* Loop until there is a read failure (or EOF?) */ + + do + { + /* Read a buffer of data */ + + nbytes = read(fd, buffer, 256); + if (nbytes > 0) + { + /* On success, echo the buffer to stdout */ + + printf("%d bytes read\n", nbytes); + if (nbytes == sizeof(struct xbox_controller_buttonstate_s)) + { + struct xbox_controller_buttonstate_s *rpt = (struct xbox_controller_buttonstate_s*)buffer; + printf("guide: %d sync: %d start: %d back: %d a: %d b: %d x: %d y: %d\n", + rpt->guide, rpt->sync, rpt->start, rpt->back, rpt->a, rpt->b, rpt->x, rpt->y); + printf("dpad_u: %d d: %d l: %d r: %d bump_l: %d r: %d stick_l: %d r: %d\n", + rpt->dpad_up, rpt->dpad_down, rpt->dpad_left, rpt->dpad_right, + rpt->bumper_left, rpt->bumper_right, rpt->stick_click_left, rpt->stick_click_right); + printf("stick_left_x: %d y: %d right_x: %d y: %d trigger_l: %d r: %d\n", + rpt->stick_left_x, rpt->stick_left_y, rpt->stick_right_x, rpt->stick_right_y, + rpt->trigger_left, rpt->trigger_right); + } + } + } + while (nbytes > 0); + + printf("Closing device %s: %d\n", CONFIG_EXAMPLES_XBC_DEVNAME, (int)nbytes); + fflush(stdout); + close(fd); + break; + } + + return 0; +} diff --git a/include/netutils/netlib.h b/include/netutils/netlib.h index 33ccb15b3..7a67282d7 100644 --- a/include/netutils/netlib.h +++ b/include/netutils/netlib.h @@ -136,6 +136,7 @@ void netlib_prefix2ipv6netmask(uint8_t preflen, FAR struct in6_addr *netmask); #endif #ifdef CONFIG_NETDEV_WIRELESS_IOCTL +int netlib_getessid(FAR const char *ifname, FAR char *essid, size_t idlen); int netlib_setessid(FAR const char *ifname, FAR const char *essid); #endif diff --git a/netutils/netlib/Makefile b/netutils/netlib/Makefile index 43ad37dd1..b17c97f59 100644 --- a/netutils/netlib/Makefile +++ b/netutils/netlib/Makefile @@ -77,7 +77,7 @@ endif # These require wireless IOCTL support */ ifeq ($(CONFIG_NETDEV_WIRELESS_IOCTL),y) -CSRCS += netlib_setessid.c +CSRCS += netlib_getessid.c netlib_setessid.c endif # No MAC address support for SLIP (Ethernet only) diff --git a/netutils/netlib/netlib_getessid.c b/netutils/netlib/netlib_getessid.c new file mode 100644 index 000000000..4243a8b19 --- /dev/null +++ b/netutils/netlib/netlib_getessid.c @@ -0,0 +1,127 @@ +/**************************************************************************** + * netutils/netlib/netlib_getessid.c + * + * Copyright (C) 2017 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 +#if defined(CONFIG_NET) && CONFIG_NSOCKET_DESCRIPTORS > 0 + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include "netutils/netlib.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* The address family that we used to create the socket and in the IOCTL + * data really does not matter. It should, however, be valid in the current + * configuration. + */ + +#if defined(CONFIG_NET_IPv4) +# define PF_INETX PF_INET +# define AF_INETX AF_INET +#elif defined(CONFIG_NET_IPv6) +# define PF_INETX PF_INET6 +# define AF_INETX AF_INET6 +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: netlib_getessid + * + * Description: + * Get the wireless access point ESSID + * + * Parameters: + * ifname The name of the interface to use + * essid Location to store the returned ESSID, size must be + * IW_ESSID_MAX_SIZE + 1 or larger + * idlen size of memory set asdie for the ESSID. + * + * Return: + * 0 on success; -1 on failure (errno may not be set) + * + ****************************************************************************/ + +int netlib_getessid(FAR const char *ifname, FAR char *essid, size_t idlen) +{ + int ret = ERROR; + + if (ifname != NULL && essid != NULL && idlen > IW_ESSID_MAX_SIZE) + { + /* Get a socket (only so that we get access to the INET subsystem) */ + + int sockfd = socket(PF_INETX, NETLIB_SOCK_IOCTL, 0); + if (sockfd >= 0) + { + struct iwreq req; + + /* Put the driver name into the request */ + + memset(&req, 0, sizeof(struct iwreq)); + strncpy(req.ifrn_name, ifname, IFNAMSIZ); + + /* Put pointer to receive the ESSID into the request */ + + req.u.essid.pointer = (FAR void *)essid; + + /* Perform the ioctl to get the ESSID */ + + ret = ioctl(sockfd, SIOCGIWESSID, (unsigned long)&req); + close(sockfd); + } + } + + return ret; +} + +#endif /* CONFIG_NET && CONFIG_NSOCKET_DESCRIPTORS */ diff --git a/netutils/netlib/netlib_setessid.c b/netutils/netlib/netlib_setessid.c index 2ac7c7d92..436465f8d 100644 --- a/netutils/netlib/netlib_setessid.c +++ b/netutils/netlib/netlib_setessid.c @@ -57,10 +57,8 @@ /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ -/* The address family that we used to create the socket and in the IOCTL + + /* The address family that we used to create the socket and in the IOCTL * data really does not matter. It should, however, be valid in the current * configuration. */ @@ -85,10 +83,11 @@ * * Parameters: * ifname The name of the interface to use - * essid MAC address to set, size must be IFHWADDRLEN + * essid Wireless ESSD address to set, size must be less then or equal + * to IW_ESSID_MAX_SIZE + 1 (including the NUL string terminator). * * Return: - * 0 on success; -1 on failure + * 0 on success; -1 on failure (errno may not be set) * ****************************************************************************/ @@ -115,7 +114,7 @@ int netlib_setessid(FAR const char *ifname, FAR const char *essid) req.u.essid.length = strlen(essid) + 1; req.u.essid.flags = 1; - /* Perform the ioctl to set the MAC address */ + /* Perform the ioctl to set the ESSID */ ret = ioctl(sockfd, SIOCSIWESSID, (unsigned long)&req); close(sockfd); diff --git a/nshlib/nsh_proccmds.c b/nshlib/nsh_proccmds.c index 3a15246a3..abd37970b 100644 --- a/nshlib/nsh_proccmds.c +++ b/nshlib/nsh_proccmds.c @@ -478,10 +478,10 @@ static int ps_callback(FAR struct nsh_vtbl_s *vtbl, FAR const char *dirpath, } } - nsh_output(vtbl, "%6.6u ", (unsigned int)stack_size); + nsh_output(vtbl, "%06u ", (unsigned int)stack_size); #ifdef CONFIG_STACK_COLORATION - nsh_output(vtbl, "%6.6u ", (unsigned int)stack_used); + nsh_output(vtbl, "%06u ", (unsigned int)stack_used); stack_filled = 0; if (stack_size > 0 && stack_used > 0) diff --git a/platform/clicker2-stm32/Kconfig b/platform/clicker2-stm32/Kconfig new file mode 100644 index 000000000..fe7668d0c --- /dev/null +++ b/platform/clicker2-stm32/Kconfig @@ -0,0 +1,8 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_CLICKER2_STM32 + +endif diff --git a/platform/clicker2-stm32/Make.defs b/platform/clicker2-stm32/Make.defs new file mode 100644 index 000000000..5f338d50b --- /dev/null +++ b/platform/clicker2-stm32/Make.defs @@ -0,0 +1,40 @@ +############################################################################ +# apps/platform/clicker2-stm32/Make.defs +# +# Copyright (C) 2017 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. +# +############################################################################ + +# Add platform specific sources to ASRCS and CSRCS + +ifeq ($(CONFIG_HAVE_CXX),y) +CSRCS += stm32_cxxinitialize.c +endif diff --git a/platform/clicker2-stm32/stm32_cxxinitialize.c b/platform/clicker2-stm32/stm32_cxxinitialize.c new file mode 100644 index 000000000..8758d63f9 --- /dev/null +++ b/platform/clicker2-stm32/stm32_cxxinitialize.c @@ -0,0 +1,134 @@ +/**************************************************************************** + * apps/platform/clicker2-stm32/src/stm32_cxxinitialize.c + * + * Copyright (C) 2017 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 + +#if defined(CONFIG_HAVE_CXX) && defined(CONFIG_HAVE_CXXINITIALIZE) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +/* Debug ********************************************************************/ +/* Non-standard debug that may be enabled just for testing the static + * constructors. + */ + +#ifdef CONFIG_DEBUG_CXX +# define cxxinfo _info +#else +# define cxxinfo(x...) +#endif + +/**************************************************************************** + * Private Types + ****************************************************************************/ +/* This type defines one entry in initialization array */ + +typedef void (*initializer_t)(void); + +/**************************************************************************** + * External References + ****************************************************************************/ +/* _sinit and _einit are symbols exported by the linker script that mark the + * beginning and the end of the C++ initialization section. + */ + +extern initializer_t _sinit; +extern initializer_t _einit; + +/* _stext and _etext are symbols exported by the linker script that mark the + * beginning and the end of text. + */ + +extern uint32_t _stext; +extern uint32_t _etext; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_cxxinitialize + * + * Description: + * If C++ and C++ static constructors are supported, then this function + * must be provided by board-specific logic in order to perform + * initialization of the static C++ class instances. + * + * This function should then be called in the application-specific + * user_start logic in order to perform the C++ initialization. NOTE + * that no component of the core NuttX RTOS logic is involved; this + * function definition only provides the 'contract' between application + * specific C++ code and platform-specific toolchain support. + * + ****************************************************************************/ + +void up_cxxinitialize(void) +{ + initializer_t *initp; + + cxxinfo("_sinit: %p _einit: %p _stext: %p _etext: %p\n", + &_sinit, &_einit, &_stext, &_etext); + + /* Visit each entry in the initialization table */ + + for (initp = &_sinit; initp != &_einit; initp++) + { + initializer_t initializer = *initp; + cxxinfo("initp: %p initializer: %p\n", initp, initializer); + + /* Make sure that the address is non-NULL and lies in the text region + * defined by the linker script. Some toolchains may put NULL values + * or counts in the initialization table. + */ + + if ((void *)initializer > (void *)&_stext && + (void *)initializer < (void *)&_etext) + { + cxxinfo("Calling %p\n", initializer); + initializer(); + } + } +} + +#endif /* CONFIG_HAVE_CXX && CONFIG_HAVE_CXXINITIALIZE */