diff --git a/arch/arm/src/imx6/imx_serial.c b/arch/arm/src/imx6/imx_serial.c index f5da98d9175..a34d2f988ad 100644 --- a/arch/arm/src/imx6/imx_serial.c +++ b/arch/arm/src/imx6/imx_serial.c @@ -50,6 +50,7 @@ #include #include +#include #include #include @@ -259,6 +260,12 @@ static bool imx_txempty(struct uart_dev_s *dev); * Private Data ****************************************************************************/ +/* Used to assure mutually exclusive access up_putc() */ + +static sem_t g_putc_lock = SEM_INITIALIZER(1); + +/* Serial driver UART operations */ + static const struct uart_ops_s g_uart_ops = { .setup = imx_setup, @@ -1006,6 +1013,27 @@ int up_putc(int ch) { struct imx_uart_s *priv = (struct imx_uart_s *)CONSOLE_DEV.priv; uint32_t ier; + bool locked; + int ret; + + /* Only one thread may enter up_putc at a time. */ + + locked = false; + + if (!up_interrupt_context() && g_os_initstate >= OSINIT_HARDWARE) + { + ret = sem_wait(&g_putc_lock); + if (ret < 0) + { + return ERROR; + } + + locked = true; + } + + /* Disable UART interrupts and wait until the hardware is ready to send + * a byte. + */ imx_disableuartint(priv, &ier); imx_waittxready(priv); @@ -1023,6 +1051,12 @@ int up_putc(int ch) imx_serialout(priv, UART_TXD_OFFSET, (uint32_t)ch); imx_waittxready(priv); imx_restoreuartint(priv, ier); + + if (locked) + { + sem_post(&g_putc_lock); + } + return ch; } diff --git a/configs/stm32f103-minimum/schematic.jpg b/configs/stm32f103-minimum/schematic.jpg new file mode 100644 index 00000000000..672c3184bfb Binary files /dev/null and b/configs/stm32f103-minimum/schematic.jpg differ diff --git a/configs/stm32f103-minimum/src/Makefile b/configs/stm32f103-minimum/src/Makefile index 67129fc524e..b29ce809083 100644 --- a/configs/stm32f103-minimum/src/Makefile +++ b/configs/stm32f103-minimum/src/Makefile @@ -43,8 +43,4 @@ ifeq ($(CONFIG_LIB_BOARDCTL),y) CSRCS += stm32_appinit.c endif -ifeq ($(CONFIG_WATCHDOG),y) -CSRCS += stm32_watchdog.c -endif - include $(TOPDIR)/configs/Board.mk diff --git a/configs/stm32f103-minimum/src/stm32_watchdog.c b/configs/stm32f103-minimum/src/stm32_watchdog.c deleted file mode 100644 index f3847de58a6..00000000000 --- a/configs/stm32f103-minimum/src/stm32_watchdog.c +++ /dev/null @@ -1,140 +0,0 @@ -/**************************************************************************** - * configs/stm32f103-minimum/src/stm32_watchdog.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 "stm32_wdg.h" - -#ifdef CONFIG_WATCHDOG - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/* Configuration ************************************************************/ -/* Wathdog hardware should be enabled */ - -#if !defined(CONFIG_STM32_WWDG) && !defined(CONFIG_STM32_IWDG) -# warning "One of CONFIG_STM32_WWDG or CONFIG_STM32_IWDG must be defined" -#endif - -/* Select the path to the registered watchdog timer device */ - -#ifndef CONFIG_STM32_WDG_DEVPATH -# ifdef CONFIG_EXAMPLES_WATCHDOG_DEVPATH -# define CONFIG_STM32_WDG_DEVPATH CONFIG_EXAMPLES_WATCHDOG_DEVPATH -# else -# define CONFIG_STM32_WDG_DEVPATH "/dev/watchdog0" -# endif -#endif - -/* Use the un-calibrated LSI frequency if we have nothing better */ - -#if defined(CONFIG_STM32_IWDG) && !defined(CONFIG_STM32_LSIFREQ) -# define CONFIG_STM32_LSIFREQ STM32_LSI_FREQUENCY -#endif - -/* Debug ********************************************************************/ -/* Non-standard debug that may be enabled just for testing the watchdog - * timer. - */ - -#ifndef CONFIG_DEBUG -# undef CONFIG_DEBUG_WATCHDOG -#endif - -#ifdef CONFIG_DEBUG_WATCHDOG -# define wdgdbg dbg -# define wdglldbg lldbg -# ifdef CONFIG_DEBUG_VERBOSE -# define wdgvdbg vdbg -# define wdgllvdbg llvdbg -# else -# define wdgvdbg(x...) -# define wdgllvdbg(x...) -# endif -#else -# define wdgdbg(x...) -# define wdglldbg(x...) -# define wdgvdbg(x...) -# define wdgllvdbg(x...) -#endif - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: up_wdginitialize() - * - * Description: - * Perform architecuture-specific initialization of the Watchdog hardware. - * This interface must be provided by all configurations using - * apps/examples/watchdog - * - ****************************************************************************/ - -int up_wdginitialize(void) -{ - /* Initialize and register the watchdog timer device */ - -#if defined(CONFIG_STM32_WWDG) - - stm32_wwdginitialize(CONFIG_STM32_WDG_DEVPATH); - return OK; - -#elif defined(CONFIG_STM32_IWDG) - - stm32_iwdginitialize(CONFIG_STM32_WDG_DEVPATH, CONFIG_STM32_LSIFREQ); - return OK; - -#else - - return -ENODEV; - -#endif -} - -#endif /* CONFIG_WATCHDOG */