diff --git a/Documentation/NuttxUserGuide.html b/Documentation/NuttxUserGuide.html
index 2a1109cdb73..1fc401217f7 100644
--- a/Documentation/NuttxUserGuide.html
+++ b/Documentation/NuttxUserGuide.html
@@ -7037,7 +7037,7 @@ interface of the same name.
#include <pthread.h>
-#ifdef CONFIG_MUTEX_TYPES
+#ifdef CONFIG_PTHREAD_MUTEX_TYPES
int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);
#endif
@@ -7072,7 +7072,7 @@ returned to indicate the error:
#include <pthread.h>
-#ifdef CONFIG_MUTEX_TYPES
+#ifdef CONFIG_PTHREAD_MUTEX_TYPES
int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
#endif
diff --git a/README.txt b/README.txt
index 3db07e882ac..59648d01f4c 100644
--- a/README.txt
+++ b/README.txt
@@ -197,6 +197,9 @@ Ubuntu Bash under Windows 10
C:\Users\Username\AppData\Local\lxss\rootfs
+ However, I am unable to see my files under the rootfs/home directory
+ so this is not very useful.
+
Install Linux Software.
-----------------------
Use "sudo apt-get install ". As examples, this is how
diff --git a/TODO b/TODO
index ad47655bf40..d19ac0f067a 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-NuttX TODO List (Last updated March 14, 2017)
+NuttX TODO List (Last updated March 26, 2017)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This file summarizes known NuttX bugs, limitations, inconsistencies with
@@ -14,7 +14,7 @@ nuttx/:
(1) Memory Management (mm/)
(0) Power Management (drivers/pm)
(3) Signals (sched/signal, arch/)
- (2) pthreads (sched/pthread)
+ (4) pthreads (sched/pthread)
(0) Message Queues (sched/mqueue)
(8) Kernel/Protected Build
(3) C++ Support
@@ -346,7 +346,7 @@ o Signals (sched/signal, arch/)
Priority: Low. Even if there are only 31 usable signals, that is still a lot.
o pthreads (sched/pthreads)
- ^^^^^^^^^^^^^^^^^
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
Title: PTHREAD_PRIO_PROTECT
Description: Extend pthread_mutexattr_setprotocol(). It should support
@@ -448,6 +448,30 @@ o pthreads (sched/pthreads)
Status: Not really open. This is just the way it is.
Priority: Nothing additional is planned.
+ Title: PTHREAD FILES IN WRONG LOCATTION
+ Description: There are many pthread interface functions in files located in
+ sched/pthread. These should be moved from that location to
+ libc/pthread. In the flat build, this really does not matter,
+ but in the protected build that location means that system calls
+ are required to access the pthread interface functions.
+ Status: Open
+ Priority: Medium-low. Priority may be higher if system call overheade becomes
+ an issue.
+
+ Title: ROBUST MUTEX ATTRIBUTE NOT SUPPORTED
+ Description: In NuttX, all mutexes are 'robust' in the sense that an attmpt
+ to lock a mutex will return EOWNDERDEAD if the holder of the
+ mutex has died. Unlocking of a mutex will fail if the caller
+ is not the holder of the mutex.
+
+ POSIX, however, requires that there be a mutex attribute called
+ robust that determines which behavior is supported. non-robust
+ should be the default. NuttX does not support this attribute
+ and robust behavior is the default and only supported behavior.
+ Status: Open
+ Priority: Low. The non-robust behavior is dangerous and really should never
+ be used.
+
o Message Queues (sched/mqueue)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/arch/arm/src/lpc43xx/lpc43_allocateheap.c b/arch/arm/src/lpc43xx/lpc43_allocateheap.c
index b7a947b668f..a6a73284d14 100644
--- a/arch/arm/src/lpc43xx/lpc43_allocateheap.c
+++ b/arch/arm/src/lpc43xx/lpc43_allocateheap.c
@@ -186,7 +186,7 @@
#ifndef CONFIG_LPC43_BOOT_SRAM
/* Configuration A */
-/* CONFIG_RAM_START shoudl be set to the base of local SRAM, Bank 0. */
+/* CONFIG_RAM_START should be set to the base of local SRAM, Bank 0. */
# if CONFIG_RAM_START != LPC43_LOCSRAM_BANK0_BASE
# error "CONFIG_RAM_START must be set to the base address of RAM bank 0"
diff --git a/arch/arm/src/stm32/Kconfig b/arch/arm/src/stm32/Kconfig
index eba911dfc56..6927a3c0544 100644
--- a/arch/arm/src/stm32/Kconfig
+++ b/arch/arm/src/stm32/Kconfig
@@ -1450,7 +1450,7 @@ config STM32_STM32F33XX
select STM32_HAVE_COMP2
select STM32_HAVE_COMP4
select STM32_HAVE_COMP6
- select STM32_HAVE_OPAMP
+ select STM32_HAVE_OPAMP2
select STM32_HAVE_CCM
select STM32_HAVE_TIM1
select STM32_HAVE_TIM15
@@ -1907,18 +1907,34 @@ config STM32_HAVE_CAN2
bool
default n
+config STM32_HAVE_COMP1
+ bool
+ default n
+
config STM32_HAVE_COMP2
bool
default n
+config STM32_HAVE_COMP3
+ bool
+ default n
+
config STM32_HAVE_COMP4
bool
default n
+config STM32_HAVE_COMP5
+ bool
+ default n
+
config STM32_HAVE_COMP6
bool
default n
+config STM32_HAVE_COMP7
+ bool
+ default n
+
config STM32_HAVE_DAC1
bool
default n
@@ -1971,7 +1987,19 @@ config STM32_HAVE_I2SPLL
bool
default n
-config STM32_HAVE_OPAMP
+config STM32_HAVE_OPAMP1
+ bool
+ default n
+
+config STM32_HAVE_OPAMP2
+ bool
+ default n
+
+config STM32_HAVE_OPAMP3
+ bool
+ default n
+
+config STM32_HAVE_OPAMP4
bool
default n
@@ -2032,21 +2060,41 @@ config STM32_COMP
default n
depends on STM32_STM32L15XX
+config STM32_COMP1
+ bool "COMP1"
+ default n
+ depends on STM32_HAVE_COMP1
+
config STM32_COMP2
bool "COMP2"
default n
depends on STM32_HAVE_COMP2
+config STM32_COMP3
+ bool "COMP3"
+ default n
+ depends on STM32_HAVE_COMP3
+
config STM32_COMP4
bool "COMP4"
default n
depends on STM32_HAVE_COMP4
+config STM32_COMP5
+ bool "COMP5"
+ default n
+ depends on STM32_HAVE_COMP5
+
config STM32_COMP6
bool "COMP6"
default n
depends on STM32_HAVE_COMP6
+config STM32_COMP7
+ bool "COMP7"
+ default n
+ depends on STM32_HAVE_COMP6
+
config STM32_BKP
bool "BKP"
default n
@@ -2185,7 +2233,26 @@ config STM32_DMA2D
config STM32_OPAMP
bool "OPAMP"
default n
- depends on STM32_HAVE_OPAMP
+
+config STM32_OPAMP1
+ bool "OPAMP1"
+ default n
+ depends on STM32_HAVE_OPAMP1
+
+config STM32_OPAMP2
+ bool "OPAMP2"
+ default n
+ depends on STM32_HAVE_OPAMP2
+
+config STM32_OPAMP3
+ bool "OPAMP3"
+ default n
+ depends on STM32_HAVE_OPAMP3
+
+config STM32_OPAMP4
+ bool "OPAMP4"
+ default n
+ depends on STM32_HAVE_OPAMP4
config STM32_OTGFS
bool "OTG FS"
@@ -2743,36 +2810,25 @@ menu "Timer Configuration"
if SCHED_TICKLESS
-config STM32_ONESHOT
- bool
- default y
-
-config STM32_FREERUN
- bool
- default y
-
-config STM32_TICKLESS_ONESHOT
- int "Tickless one-shot timer channel"
+config STM32_TICKLESS_TIMER
+ int "Tickless hardware timer"
default 2
range 1 14
- depends on STM32_ONESHOT
---help---
- If the Tickless OS feature is enabled, the one clock must be
- assigned to provided the one-shot timer needed by the OS.
+ If the Tickless OS feature is enabled, then one clock must be
+ assigned to provided the timer needed by the OS.
-config STM32_TICKLESS_FREERUN
- int "Tickless free-running timer channel"
- default 5
- range 1 14
- depends on STM32_FREERUN
+config STM32_TICKLESS_CHANNEL
+ int "Tickless timer channel"
+ default 1
+ range 1 4
---help---
If the Tickless OS feature is enabled, the one clock must be
- assigned to provided the free-running timer needed by the OS.
+ assigned to provided the free-running timer needed by the OS
+ and one channel on that clock is needed to handle intervals.
endif # SCHED_TICKLESS
-if !SCHED_TICKLESS
-
config STM32_ONESHOT
bool "TIM one-shot wrapper"
default n
@@ -2787,8 +2843,6 @@ config STM32_FREERUN
Enable a wrapper around the low level timer/counter functions to
support a free-running timer.
-endif # !SCHED_TICKLESS
-
config STM32_ONESHOT_MAXTIMERS
int "Maximum number of oneshot timers"
default 1
diff --git a/arch/arm/src/stm32/stm32_comp.c b/arch/arm/src/stm32/stm32_comp.c
index 548baa9b110..b580f853987 100644
--- a/arch/arm/src/stm32/stm32_comp.c
+++ b/arch/arm/src/stm32/stm32_comp.c
@@ -45,21 +45,25 @@
#include
#include
+#include
+#include
#include "chip.h"
#include "stm32_gpio.h"
#include "stm32_comp.h"
-#ifdef CONFIG_STM32_COMP
-
/* Some COMP peripheral must be enabled */
-/* Up to 7 comparators in STM32F2 Series */
+/* Up to 7 comparators in STM32F3 Series */
#if defined(CONFIG_STM32_COMP1) || defined(CONFIG_STM32_COMP2) || \
defined(CONFIG_STM32_COMP3) || defined(CONFIG_STM32_COMP4) || \
defined(CONFIG_STM32_COMP5) || defined(CONFIG_STM32_COMP6) || \
defined(CONFIG_STM32_COMP7)
+#ifndef CONFIG_STM32_SYSCFG
+# error "SYSCFG clock enable must be set"
+#endif
+
/* @TODO: support for STM32F30XX and STM32F37XX comparators */
#if defined(CONFIG_STM32_STM32F30XX) || defined(CONFIG_STM32_STM32F33XX) || \
@@ -81,6 +85,7 @@
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
+
/* COMP2 default configuration **********************************************/
#ifdef CONFIG_STM32_COMP2
@@ -145,6 +150,61 @@
* Private Types
****************************************************************************/
+/* This structure describes the configuration of one COMP device */
+
+struct stm32_comp_s
+{
+ uint8_t blanking; /* Blanking source */
+ uint8_t pol; /* Output polarity */
+ uint8_t inm; /* Inverting input selection */
+ uint8_t out; /* Comparator output */
+ uint8_t lock; /* Comparator Lock */
+ uint32_t csr; /* Control and status register */
+#ifndef CONFIG_STM32_STM32F33XX
+ uint8_t mode; /* Comparator mode */
+ uint8_t hyst; /* Comparator hysteresis */
+ /* @TODO: Window mode + INP selection */
+#endif
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/* COMP Register access */
+
+static inline void comp_modify_csr(FAR struct stm32_comp_s *priv,
+ uint32_t clearbits, uint32_t setbits);
+static inline uint32_t comp_getreg_csr(FAR struct stm32_comp_s *priv);
+static inline void comp_putreg_csr(FAR struct stm32_comp_s *priv,
+ uint32_t value);
+static bool stm32_complock_get(FAR struct stm32_comp_s *priv);
+static int stm32_complock(FAR struct stm32_comp_s *priv, bool lock);
+
+/* COMP Driver Methods */
+
+static void comp_shutdown(FAR struct comp_dev_s *dev);
+static int comp_setup(FAR struct comp_dev_s *dev);
+static int comp_read(FAR struct comp_dev_s *dev);
+static int comp_ioctl(FAR struct comp_dev_s *dev, int cmd, unsigned long arg);
+
+/* Initialization */
+
+static int stm32_compconfig(FAR struct stm32_comp_s *priv);
+static int stm32_compenable(FAR struct stm32_comp_s *priv, bool enable);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct comp_ops_s g_compops =
+{
+ .ao_shutdown = comp_shutdown,
+ .ao_setup = comp_setup,
+ .ao_read = comp_read,
+ .ao_ioctl = comp_ioctl,
+};
+
#ifdef CONFIG_STM32_COMP1
static struct stm32_comp_s g_comp1priv =
{
@@ -159,6 +219,12 @@ static struct stm32_comp_s g_comp1priv =
.hyst = COMP1_HYST,
#endif
};
+
+static struct comp_dev_s g_comp1dev =
+{
+ .ad_ops = &g_compops,
+ .ad_priv = &g_comp1priv,
+};
#endif
#ifdef CONFIG_STM32_COMP2
@@ -175,6 +241,12 @@ static struct stm32_comp_s g_comp2priv =
.hyst = COMP2_HYST,
#endif
};
+
+static struct comp_dev_s g_comp2dev =
+{
+ .ad_ops = &g_compops,
+ .ad_priv = &g_comp2priv,
+};
#endif
#ifdef CONFIG_STM32_COMP3
@@ -187,10 +259,16 @@ static struct stm32_comp_s g_comp3priv =
.lock = COMP3_LOCK,
.csr = STM32_COMP3_CSR,
#ifndef CONFIG_STM32_STM32F33XX
- .mode = COMP3_MODE,
- .hyst = COMP3_HYST,
+ .mode = COMP3_MODE,
+ .hyst = COMP3_HYST,
#endif
};
+
+static struct comp_dev_s g_comp3dev =
+{
+ .ad_ops = &g_compops,
+ .ad_priv = &g_comp3priv,
+};
#endif
#ifdef CONFIG_STM32_COMP4
@@ -207,6 +285,12 @@ static struct stm32_comp_s g_comp4priv =
.hyst = COMP4_HYST,
#endif
};
+
+static struct comp_dev_s g_comp4dev =
+{
+ .ad_ops = &g_compops,
+ .ad_priv = &g_comp4priv,
+};
#endif
#ifdef CONFIG_STM32_COMP5
@@ -223,6 +307,12 @@ static struct stm32_comp_s g_comp5priv =
.hyst = COMP5_HYST,
#endif
};
+
+static struct comp_dev_s g_comp5dev =
+{
+ .ad_ops = &g_compops,
+ .ad_priv = &g_comp5priv,
+};
#endif
#ifdef CONFIG_STM32_COMP6
@@ -239,6 +329,12 @@ static struct stm32_comp_s g_comp6priv =
.hyst = COMP6_HYST,
#endif
};
+
+static struct comp_dev_s g_comp6dev =
+{
+ .ad_ops = &g_compops,
+ .ad_priv = &g_comp6priv,
+};
#endif
#ifdef CONFIG_STM32_COMP7
@@ -255,19 +351,14 @@ static struct stm32_comp_s g_comp7priv =
.hyst = COMP7_HYST,
#endif
};
+
+static struct comp_dev_s g_comp7dev =
+{
+ .ad_ops = &g_compops,
+ .ad_priv = &g_comp7priv,
+};
#endif
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-static inline void comp_modify_csr(FAR struct stm32_comp_s *priv,
- uint32_t clearbits, uint32_t setbits);
-static inline uint32_t comp_getreg_csr(FAR struct stm32_comp_s *priv);
-static inline void comp_putreg_csr(FAR struct stm32_comp_s *priv,
- uint32_t value);
-static bool stm32_complock_get(FAR struct stm32_comp_s *priv);
-
/****************************************************************************
* Private Functions
****************************************************************************/
@@ -360,13 +451,52 @@ static bool stm32_complock_get(FAR struct stm32_comp_s *priv)
regval = comp_getreg_csr(priv);
- return ((regval & COMP_CSR_LOCK == 0) ? false : true);
+ return (((regval & COMP_CSR_LOCK) == 0) ? false : true);
}
/****************************************************************************
- * Public Functions
+ * Name: stm32_complock
+ *
+ * Description:
+ * Lock comparator CSR register
+ *
+ * Input Parameters:
+ * priv - A reference to the COMP structure
+ * enable - lock flag
+ *
+ * Returned Value:
+ * 0 on success, a negated errno value on failure
+ *
****************************************************************************/
+static int stm32_complock(FAR struct stm32_comp_s *priv, bool lock)
+{
+ bool current;
+
+ current = stm32_complock_get(priv);
+
+ if (current)
+ {
+ if (lock == false)
+ {
+ aerr("ERROR: COMP LOCK can be cleared only by a system reset\n");
+
+ return -EPERM;
+ }
+ }
+ else
+ {
+ if (lock == true)
+ {
+ comp_modify_csr(priv, 0, COMP_CSR_LOCK);
+
+ priv->lock = COMP_LOCK_RO;
+ }
+ }
+
+ return OK;
+}
+
/****************************************************************************
* Name: stm32_compconfig
*
@@ -383,9 +513,9 @@ static bool stm32_complock_get(FAR struct stm32_comp_s *priv)
*
****************************************************************************/
-int stm32_compconfig(FAR struct stm32_comp_s *priv)
+static int stm32_compconfig(FAR struct stm32_comp_s *priv)
{
- uint32_t regval;
+ uint32_t regval = 0;
int index;
/* Get comparator index */
@@ -665,98 +795,6 @@ int stm32_compconfig(FAR struct stm32_comp_s *priv)
return OK;
}
-/****************************************************************************
- * Name: stm32_compinitialize
- *
- * Description:
- * Initialize the COMP.
- *
- * Input Parameters:
- * intf - The COMP interface number.
- *
- * Returned Value:
- * Valid COMP device structure reference on succcess; a NULL on failure.
- *
- * Assumptions:
- * 1. Clock to the COMP block has enabled,
- * 2. Board-specific logic has already configured
- *
- ****************************************************************************/
-
-FAR struct stm32_comp_s* stm32_compinitialize(int intf)
-{
- FAR struct stm32_comp_s *priv;
- int ret;
-
- switch (intf)
- {
-#ifdef CONFIG_STM32_COMP1
- case 1:
- ainfo("COMP1 selected\n");
- priv = &g_comp1priv;
- break;
-#endif
-
-#ifdef CONFIG_STM32_COMP2
- case 2:
- ainfo("COMP2 selected\n");
- priv = &g_comp2priv;
- break;
-#endif
-
-#ifdef CONFIG_STM32_COMP3
- case 3:
- ainfo("COMP3 selected\n");
- priv = &g_comp3priv;
- break;
-#endif
-
-#ifdef CONFIG_STM32_COMP4
- case 4:
- ainfo("COMP4 selected\n");
- priv = &g_comp4priv;
- break;
-#endif
-
-#ifdef CONFIG_STM32_COMP5
- case 5:
- ainfo("COMP5 selected\n");
- priv = &g_comp5priv;
- break;
-#endif
-
-#ifdef CONFIG_STM32_COMP6
- case 6:
- ainfo("COMP6 selected\n");
- priv = &g_comp6priv;
- break;
-#endif
-
-#ifdef CONFIG_STM32_COMP7
- case 7:
- ainfo("COMP7 selected\n");
- priv = &g_comp7priv;
- break;
-#endif
-
- default:
- aerr("ERROR: No COMP interface defined\n");
- return NULL;
- }
-
- /* Configure selected comparator */
-
- ret = stm32_compconfig(priv);
- if (ret < 0)
- {
- aerr("ERROR: Failed to initialize COMP%d: %d\n", intf, ret);
- errno = -ret;
- return NULL;
- }
-
- return priv;
-}
-
/****************************************************************************
* Name: stm32_compenable
*
@@ -772,7 +810,7 @@ FAR struct stm32_comp_s* stm32_compinitialize(int intf)
*
****************************************************************************/
-int stm32_compenable(FAR struct stm32_comp_s *priv, bool enable)
+static int stm32_compenable(FAR struct stm32_comp_s *priv, bool enable)
{
bool lock;
@@ -792,13 +830,13 @@ int stm32_compenable(FAR struct stm32_comp_s *priv, bool enable)
{
/* Enable the COMP */
- comp_modify_csr(priv, COMP_CSR_COMPEN, 0);
+ comp_modify_csr(priv, 0, COMP_CSR_COMPEN);
}
else
{
/* Disable the COMP */
- comp_modify_csr(priv, 0, COMP_CSR_COMPEN);
+ comp_modify_csr(priv, COMP_CSR_COMPEN, 0);
}
}
@@ -806,46 +844,190 @@ int stm32_compenable(FAR struct stm32_comp_s *priv, bool enable)
}
/****************************************************************************
- * Name: stm32_complock
+ * Name: adc_setup
*
* Description:
- * Lock comparator CSR register
+ * Configure the COMP. This method is called the first time that the COMP
+ * device is opened. This will occur when the port is first opened.
+ * This setup includes configuring and attaching COMP interrupts.
+ * Interrupts are all disabled upon return.
*
* Input Parameters:
- * priv - A reference to the COMP structure
- * enable - lock flag
*
* Returned Value:
- * 0 on success, a negated errno value on failure
*
****************************************************************************/
-int stm32_complock(FAR struct stm32_comp_s *priv, bool lock)
+static int comp_setup(FAR struct comp_dev_s *dev)
{
- bool current;
+#warning "Missing logic"
+ return OK;
+}
- current = stm32_complock_get(priv);
+/****************************************************************************
+ * Name: comp_shutdown
+ *
+ * Description:
+ * Disable the COMP. This method is called when the COMP device is closed.
+ * This method reverses the operation the setup method.
+ * Works only if COMP device is not locked.
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
- if (current)
+static void comp_shutdown(FAR struct comp_dev_s *dev)
+{
+#warning "Missing logic"
+}
+
+/****************************************************************************
+ * Name: comp_read
+ *
+ * Description:
+ * Get the COMP output state.
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ * 0 if output is low (non-inverting input below inverting input),
+ * 1 if output is high (non inverting input above inverting input).
+ *
+ ****************************************************************************/
+
+static int comp_read(FAR struct comp_dev_s *dev)
+{
+ FAR struct stm32_comp_s *priv;
+ uint32_t regval;
+
+ priv = dev->ad_priv;
+ regval = comp_getreg_csr(priv);
+
+ return (((regval & COMP_CSR_OUT) == 0) ? 0 : 1);
+}
+
+/****************************************************************************
+ * Name: comp_ioctl
+ *
+ * Description:
+ * All ioctl calls will be routed through this method.
+ *
+ * Input Parameters:
+ * dev - pointer to device structure used by the driver
+ * cmd - command
+ * arg - arguments passed with command
+ *
+ * Returned Value:
+ * Zero on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+static int comp_ioctl(FAR struct comp_dev_s *dev, int cmd, unsigned long arg)
+{
+#warning "Missing logic"
+ return -ENOTTY;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: stm32_compinitialize
+ *
+ * Description:
+ * Initialize the COMP.
+ *
+ * Input Parameters:
+ * intf - The COMP interface number.
+ *
+ * Returned Value:
+ * Valid COMP device structure reference on succcess; a NULL on failure.
+ *
+ * Assumptions:
+ * 1. Clock to the COMP block has enabled,
+ * 2. Board-specific logic has already configured
+ *
+ ****************************************************************************/
+
+FAR struct comp_dev_s* stm32_compinitialize(int intf)
+{
+ FAR struct comp_dev_s *dev;
+ FAR struct stm32_comp_s *comp;
+ int ret;
+
+ switch (intf)
{
- if (lock == false)
- {
- aerr("ERROR: COMP LOCK can be cleared only by a system reset\n");
+#ifdef CONFIG_STM32_COMP1
+ case 1:
+ ainfo("COMP1 selected\n");
+ dev = &g_comp1dev;
+ break;
+#endif
- return -EPERM;
- }
- }
- else
- {
- if (lock == true)
- {
- comp_modify_csr(priv, COMP_CSR_LOCK, 0);
+#ifdef CONFIG_STM32_COMP2
+ case 2:
+ ainfo("COMP2 selected\n");
+ dev = &g_comp2dev;
+ break;
+#endif
- priv->lock = COMP_LOCK_RO;
- }
+#ifdef CONFIG_STM32_COMP3
+ case 3:
+ ainfo("COMP3 selected\n");
+ dev = &g_comp3dev;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_COMP4
+ case 4:
+ ainfo("COMP4 selected\n");
+ dev = &g_comp4dev;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_COMP5
+ case 5:
+ ainfo("COMP5 selected\n");
+ dev = &g_comp5dev;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_COMP6
+ case 6:
+ ainfo("COMP6 selected\n");
+ dev = &g_comp6dev;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_COMP7
+ case 7:
+ ainfo("COMP7 selected\n");
+ dev = &g_comp7dev;
+ break;
+#endif
+
+ default:
+ aerr("ERROR: No COMP interface defined\n");
+ return NULL;
}
- return OK;
+ /* Configure selected comparator */
+
+ comp = dev->ad_priv;
+
+ ret = stm32_compconfig(comp);
+ if (ret < 0)
+ {
+ aerr("ERROR: Failed to initialize COMP%d: %d\n", intf, ret);
+ errno = -ret;
+ return NULL;
+ }
+
+ return dev;
}
#endif /* CONFIG_STM32_STM32F30XX || CONFIG_STM32_STM32F33XX ||
@@ -853,5 +1035,3 @@ int stm32_complock(FAR struct stm32_comp_s *priv, bool lock)
#endif /* CONFIG_STM32_COMP2 || CONFIG_STM32_COMP4 ||
* CONFIG_STM32_COMP6 */
-
-#endif /* CONFIG_STM32_COMP */
diff --git a/arch/arm/src/stm32/stm32_comp.h b/arch/arm/src/stm32/stm32_comp.h
index c703689d171..16a0ad69713 100644
--- a/arch/arm/src/stm32/stm32_comp.h
+++ b/arch/arm/src/stm32/stm32_comp.h
@@ -60,7 +60,7 @@
#define COMP_POL_DEFAULT COMP_POL_NONINVERT /* Output is not inverted */
#define COMP_INM_DEFAULT COMP_INMSEL_1P4VREF /* 1/4 of Vrefint as INM */
#define COMP_OUTSEL_DEFAULT COMP_OUTSEL_NOSEL /* Output not selected */
-#define COMP_LOCK_DEFAULT COMP_LOCK_RO /* Do not lock CSR register */
+#define COMP_LOCK_DEFAULT COMP_LOCK_RW /* Do not lock CSR register */
#ifndef CONFIG_STM32_STM32F33XX
#define COMP_MODE_DEFAULT
@@ -172,23 +172,6 @@ enum stm32_comp_winmode_e
#endif
-/* Comparator configuration ***********************************************************/
-
-struct stm32_comp_s
-{
- uint8_t blanking; /* Blanking source */
- uint8_t pol; /* Output polarity */
- uint8_t inm; /* Inverting input selection */
- uint8_t out; /* Comparator output */
- uint8_t lock; /* Comparator Lock */
- uint32_t csr; /* Control and status register */
-#ifndef CONFIG_STM32_STM32F33XX
- uint8_t mode; /* Comparator mode */
- uint8_t hyst; /* Comparator hysteresis */
- /* @TODO: Window mode + INP selection */
-#endif
-};
-
/************************************************************************************
* Public Function Prototypes
************************************************************************************/
@@ -202,22 +185,6 @@ extern "C"
#define EXTERN extern
#endif
-/****************************************************************************
-* Name: stm32_compconfig
-*
-* Description:
-* Configure comparator and used I/Os
-*
-* Input Parameters:
-* priv - A reference to the COMP structure
-*
-* Returned Value:
-* 0 on success, a negated errno value on failure
-*
-****************************************************************************/
-
-int stm32_compconfig(FAR struct stm32_comp_s *priv);
-
/****************************************************************************
* Name: stm32_compinitialize
*
@@ -236,41 +203,7 @@ int stm32_compconfig(FAR struct stm32_comp_s *priv);
*
****************************************************************************/
-FAR struct stm32_comp_s* stm32_compinitialize(int intf);
-
-/****************************************************************************
-* Name: stm32_compenable
-*
-* Description:
-* Enable/disable comparator
-*
-* Input Parameters:
-* priv - A reference to the COMP structure
-* enable - enable/disable flag
-*
-* Returned Value:
-* 0 on success, a negated errno value on failure
-*
-****************************************************************************/
-
-int stm32_compenable(FAR struct stm32_comp_s *priv, bool enable);
-
-/****************************************************************************
-* Name: stm32_complock
-*
-* Description:
-* Lock comparator CSR register
-*
-* Input Parameters:
-* priv - A reference to the COMP structure
-* enable - lock flag
-*
-* Returned Value:
-* 0 on success, a negated errno value on failure
-*
-****************************************************************************/
-
-int stm32_complock(FAR struct stm32_comp_s *priv, bool lock);
+FAR struct comp_dev_s* stm32_compinitialize(int intf);
#undef EXTERN
#ifdef __cplusplus
diff --git a/arch/arm/src/stm32/stm32_rng.c b/arch/arm/src/stm32/stm32_rng.c
index ccbbd96dd72..6588814d6c3 100644
--- a/arch/arm/src/stm32/stm32_rng.c
+++ b/arch/arm/src/stm32/stm32_rng.c
@@ -46,6 +46,7 @@
#include
#include
+#include
#include
#include
@@ -97,13 +98,20 @@ static const struct file_operations g_rngops =
#ifndef CONFIG_DISABLE_POLL
, 0 /* poll */
#endif
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+ , 0 /* unlink */
+#endif
};
/****************************************************************************
* Private functions
****************************************************************************/
-static int stm32_rng_initialize()
+/****************************************************************************
+ * Name: stm32_rng_initialize
+ ****************************************************************************/
+
+static int stm32_rng_initialize(void)
{
uint32_t regval;
@@ -133,7 +141,11 @@ static int stm32_rng_initialize()
return OK;
}
-static void stm32_enable()
+/****************************************************************************
+ * Name: stm32_enable
+ ****************************************************************************/
+
+static void stm32_enable(void)
{
uint32_t regval;
@@ -144,7 +156,11 @@ static void stm32_enable()
putreg32(regval, STM32_RNG_CR);
}
-static void stm32_disable()
+/****************************************************************************
+ * Name: stm32_disable
+ ****************************************************************************/
+
+static void stm32_disable(void)
{
uint32_t regval;
regval = getreg32(STM32_RNG_CR);
@@ -152,6 +168,10 @@ static void stm32_disable()
putreg32(regval, STM32_RNG_CR);
}
+/****************************************************************************
+ * Name: stm32_interrupt
+ ****************************************************************************/
+
static int stm32_interrupt(int irq, void *context, FAR void *arg)
{
uint32_t rngsr;
@@ -234,11 +254,14 @@ static ssize_t stm32_read(struct file *filep, char *buffer, size_t buflen)
{
/* We've got the semaphore. */
- /* Initialize semaphore with 0 for blocking until the buffer is filled from
- * interrupts.
+ /* Initialize the operation semaphore with 0 for blocking until the
+ * buffer is filled from interrupts. The readsem semaphore is used
+ * for signaling and, hence, should not have priority inheritance
+ * enabled.
*/
- sem_init(&g_rngdev.rd_readsem, 0, 1);
+ sem_init(&g_rngdev.rd_readsem, 0, 0);
+ sem_setprotocol(&g_rngdev.rd_readsem, SEM_PRIO_NONE);
g_rngdev.rd_buflen = buflen;
g_rngdev.rd_buf = buffer;
diff --git a/arch/arm/src/stm32/stm32_tickless.c b/arch/arm/src/stm32/stm32_tickless.c
index fafa9bcadfd..38162ad7d7c 100644
--- a/arch/arm/src/stm32/stm32_tickless.c
+++ b/arch/arm/src/stm32/stm32_tickless.c
@@ -2,7 +2,9 @@
* arch/arm/src/stm32/stm32_tickless.c
*
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt
+ * Copyright (C) 2017 Ansync Labs. All rights reserved.
+ * Authors: Gregory Nutt
+ * Konstantin Berezenko
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -55,24 +57,19 @@
*
****************************************************************************/
/****************************************************************************
- * SAM34 Timer Usage
+ * STM32 Timer Usage
*
- * This current implementation uses two timers: A one-shot timer to provide
- * the timed events and a free running timer to provide the current time.
- * Since timers are a limited resource, that could be an issue on some
- * systems.
- *
- * We could do the job with a single timer if we were to keep the single
- * timer in a free-running at all times. The STM32 timer/counters have
- * 16-bit/32-bit counters with the capability to generate a compare interrupt
- * when the timer matches a compare value but also to continue counting
- * without stopping (giving another, different interrupt when the timer
- * rolls over from 0xffffffff to zero). So we could potentially just set
- * the compare at the number of ticks you want PLUS the current value of
- * timer. Then you could have both with a single timer: An interval timer
- * and a free-running counter with the same timer!
- *
- * Patches are welcome!
+ * This implementation uses one timer: A free running timer to provide
+ * the current time and a capture/compare channel for timed-events.
+ * The STM32 has both 16-bit and 32-bit timers so to keep things consistent
+ * we limit the timer counters to a 16-bit range. BASIC timers that
+ * are found on some STM32 chips (timers 6 and 7) are incompatible with this
+ * implementation because they don't have capture/compare channels. There
+ * are two interrupts generated from our timer, the overflow interrupt which
+ * drives the timing handler and the capture/compare interrupt which drives
+ * the interval handler. There are some low level timer control functions
+ * implemented here because the API of stm32_tim.c does not provide adequate
+ * control over capture/compare interrupts.
*
****************************************************************************/
@@ -84,12 +81,15 @@
#include
#include
+#include
+#include
#include
#include
-#include "stm32_oneshot.h"
-#include "stm32_freerun.h"
+#include "up_arch.h"
+
+#include "stm32_tim.h"
#ifdef CONFIG_SCHED_TICKLESS
@@ -97,30 +97,24 @@
* Pre-processor Definitions
****************************************************************************/
-#ifndef CONFIG_STM32_ONESHOT
-# error CONFIG_STM32_ONESHOT must be selected for the Tickless OS option
-#endif
-
-#ifndef CONFIG_STM32_FREERUN
-# error CONFIG_STM32_FREERUN must be selected for the Tickless OS option
-#endif
-
-#ifndef CONFIG_STM32_TICKLESS_FREERUN
-# error CONFIG_STM32_TICKLESS_FREERUN must be selected for the Tickless OS option
-#endif
-
-#ifndef CONFIG_STM32_TICKLESS_ONESHOT
-# error CONFIG_STM32_TICKLESS_ONESHOT must be selected for the Tickless OS option
-#endif
-
/****************************************************************************
* Private Types
****************************************************************************/
struct stm32_tickless_s
{
- struct stm32_oneshot_s oneshot;
- struct stm32_freerun_s freerun;
+ uint8_t timer; /* The timer/counter in use */
+ uint8_t channel; /* The timer channel to use for intervals */
+ FAR struct stm32_tim_dev_s *tch; /* Handle returned by stm32_tim_init() */
+ uint32_t frequency;
+#ifdef CONFIG_CLOCK_TIMEKEEPING
+ uint64_t counter_mask;
+#else
+ uint32_t overflow; /* Timer counter overflow */
+#endif
+ volatile bool pending; /* True: pending task */
+ uint32_t period; /* Interval period */
+ uint32_t base;
};
/****************************************************************************
@@ -133,11 +127,159 @@ static struct stm32_tickless_s g_tickless;
* Private Functions
****************************************************************************/
-/****************************************************************************
- * Name: stm32_oneshot_handler
+/************************************************************************************
+ * Name: stm32_getreg16
*
* Description:
- * Called when the one shot timer expires
+ * Get a 16-bit register value by offset
+ *
+ ************************************************************************************/
+
+static inline uint16_t stm32_getreg16(uint8_t offset)
+{
+ return getreg16(g_tickless.base + offset);
+}
+
+/************************************************************************************
+ * Name: stm32_putreg16
+ *
+ * Description:
+ * Put a 16-bit register value by offset
+ *
+ ************************************************************************************/
+
+static inline void stm32_putreg16(uint8_t offset, uint16_t value)
+{
+ putreg16(value, g_tickless.base + offset);
+}
+
+/************************************************************************************
+ * Name: stm32_modifyreg16
+ *
+ * Description:
+ * Modify a 16-bit register value by offset
+ *
+ ************************************************************************************/
+
+static inline void stm32_modifyreg16(uint8_t offset, uint16_t clearbits,
+ uint16_t setbits)
+{
+ modifyreg16(g_tickless.base + offset, clearbits, setbits);
+}
+
+/************************************************************************************
+ * Name: stm32_tickless_enableint
+ ************************************************************************************/
+
+static inline void stm32_tickless_enableint(int channel)
+{
+ stm32_modifyreg16(STM32_BTIM_DIER_OFFSET, 0, 1 << channel);
+}
+
+/************************************************************************************
+ * Name: stm32_tickless_disableint
+ ************************************************************************************/
+
+static inline void stm32_tickless_disableint(int channel)
+{
+ stm32_modifyreg16(STM32_BTIM_DIER_OFFSET, 1 << channel, 0);
+}
+
+/************************************************************************************
+ * Name: stm32_tickless_ackint
+ ************************************************************************************/
+
+static inline void stm32_tickless_ackint(int channel)
+{
+ stm32_putreg16(STM32_BTIM_SR_OFFSET, ~(1 << channel));
+}
+
+/************************************************************************************
+ * Name: stm32_tickless_getint
+ ************************************************************************************/
+
+static inline uint16_t stm32_tickless_getint(void)
+{
+ return stm32_getreg16(STM32_BTIM_SR_OFFSET);
+}
+
+/************************************************************************************
+ * Name: stm32_tickless_setchannel
+ ************************************************************************************/
+
+static int stm32_tickless_setchannel(uint8_t channel)
+{
+ uint16_t ccmr_orig = 0;
+ uint16_t ccmr_val = 0;
+ uint16_t ccmr_mask = 0xff;
+ uint16_t ccer_val = stm32_getreg16(STM32_GTIM_CCER_OFFSET);
+ uint8_t ccmr_offset = STM32_GTIM_CCMR1_OFFSET;
+
+ /* Further we use range as 0..3; if channel=0 it will also overflow here */
+
+ if (--channel > 4)
+ {
+ return -EINVAL;
+ }
+
+ /* Assume that channel is disabled and polarity is active high */
+
+ ccer_val &= ~(3 << (channel << 2));
+
+ /* This function is not supported on basic timers. To enable or
+ * disable it, simply set its clock to valid frequency or zero.
+ */
+
+#if STM32_NBTIM > 0
+ if (g_tickless.base == STM32_TIM6_BASE
+#endif
+#if STM32_NBTIM > 1
+ || g_tickless.base == STM32_TIM7_BASE
+#endif
+#if STM32_NBTIM > 0
+ )
+ {
+ return -EINVAL;
+ }
+#endif
+
+ /* Frozen mode because we don't want to change the GPIO, preload register
+ * disabled.
+ */
+
+ ccmr_val = (ATIM_CCMR_MODE_FRZN << ATIM_CCMR1_OC1M_SHIFT);
+
+ /* Set polarity */
+
+ ccer_val |= ATIM_CCER_CC1P << (channel << 2);
+
+ /* Define its position (shift) and get register offset */
+
+ if ((channel & 1) != 0)
+ {
+ ccmr_val <<= 8;
+ ccmr_mask <<= 8;
+ }
+
+ if (channel > 1)
+ {
+ ccmr_offset = STM32_GTIM_CCMR2_OFFSET;
+ }
+
+ ccmr_orig = stm32_getreg16(ccmr_offset);
+ ccmr_orig &= ~ccmr_mask;
+ ccmr_orig |= ccmr_val;
+ stm32_putreg16(ccmr_offset, ccmr_orig);
+ stm32_putreg16(STM32_GTIM_CCER_OFFSET, ccer_val);
+
+ return OK;
+}
+
+/****************************************************************************
+ * Name: stm32_interval_handler
+ *
+ * Description:
+ * Called when the timer counter matches the compare register
*
* Input Parameters:
* None
@@ -151,12 +293,78 @@ static struct stm32_tickless_s g_tickless;
*
****************************************************************************/
-static void stm32_oneshot_handler(void *arg)
+static void stm32_interval_handler(void)
{
tmrinfo("Expired...\n");
+
+ /* Disable the compare interrupt now. */
+
+ stm32_tickless_disableint(g_tickless.channel);
+ stm32_tickless_ackint(g_tickless.channel);
+
+ g_tickless.pending = false;
+
sched_timer_expiration();
}
+/****************************************************************************
+ * Name: stm32_timing_handler
+ *
+ * Description:
+ * Timer interrupt callback. When the freerun timer counter overflows,
+ * this interrupt will occur. We will just increment an overflow count.
+ *
+ * Input Parameters:
+ * None
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifndef CONFIG_CLOCK_TIMEKEEPING
+static void stm32_timing_handler(void)
+{
+ g_tickless.overflow++;
+
+ STM32_TIM_ACKINT(g_tickless.tch, 0);
+}
+#endif /* CONFIG_CLOCK_TIMEKEEPING */
+
+/****************************************************************************
+ * Name: stm32_tickless_handler
+ *
+ * Description:
+ * Generic interrupt handler for this timer. It checks the source of the
+ * interrupt and fires the appropriate handler.
+ *
+ * Input Parameters:
+ * None
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+static int stm32_tickless_handler(int irq, void *context, void *arg)
+{
+ int interrupt_flags = stm32_tickless_getint();
+
+#ifndef CONFIG_CLOCK_TIMEKEEPING
+ if (interrupt_flags & ATIM_SR_UIF)
+ {
+ stm32_timing_handler();
+ }
+#endif /* CONFIG_CLOCK_TIMEKEEPING */
+
+ if (interrupt_flags & (1 << g_tickless.channel))
+ {
+ stm32_interval_handler();
+ }
+
+ return OK;
+}
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -188,55 +396,172 @@ static void stm32_oneshot_handler(void *arg)
void arm_timer_initialize(void)
{
-#ifdef CONFIG_SCHED_TICKLESS_LIMIT_MAX_SLEEP
- uint64_t max_delay;
-#endif
- int ret;
-
- /* Initialize the one-shot timer */
-
- ret = stm32_oneshot_initialize(&g_tickless.oneshot,
- CONFIG_STM32_TICKLESS_ONESHOT,
- CONFIG_USEC_PER_TICK);
- if (ret < 0)
+ switch (CONFIG_STM32_TICKLESS_TIMER)
{
- tmrerr("ERROR: stm32_oneshot_initialize failed\n");
- PANIC();
- }
-
-#ifdef CONFIG_SCHED_TICKLESS_LIMIT_MAX_SLEEP
- /* Get the maximum delay of the one-shot timer in microseconds */
-
- ret = stm32_oneshot_max_delay(&g_tickless.oneshot, &max_delay);
- if (ret < 0)
- {
- tmrerr("ERROR: stm32_oneshot_max_delay failed\n");
- PANIC();
- }
-
- /* Convert this to configured clock ticks for use by the OS timer logic */
-
- max_delay /= CONFIG_USEC_PER_TICK;
- if (max_delay > UINT32_MAX)
- {
- g_oneshot_maxticks = UINT32_MAX;
- }
- else
- {
- g_oneshot_maxticks = max_delay;
- }
+#ifdef CONFIG_STM32_TIM1
+ case 1:
+ g_tickless.base = STM32_TIM1_BASE;
+ break;
#endif
- /* Initialize the free-running timer */
+#ifdef CONFIG_STM32_TIM2
+ case 2:
+ g_tickless.base = STM32_TIM2_BASE;
+ break;
+#endif
- ret = stm32_freerun_initialize(&g_tickless.freerun,
- CONFIG_STM32_TICKLESS_FREERUN,
- CONFIG_USEC_PER_TICK);
- if (ret < 0)
- {
- tmrerr("ERROR: stm32_freerun_initialize failed\n");
- PANIC();
+#ifdef CONFIG_STM32_TIM3
+ case 3:
+ g_tickless.base = STM32_TIM3_BASE;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_TIM4
+ case 4:
+ g_tickless.base = STM32_TIM4_BASE;
+ break;
+#endif
+#ifdef CONFIG_STM32_TIM5
+ case 5:
+ g_tickless.base = STM32_TIM5_BASE;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_TIM6
+ case 6:
+
+ /* Basic timers not supported by this implementation */
+
+ ASSERT(0);
+ break;
+#endif
+
+#ifdef CONFIG_STM32_TIM7
+ case 7:
+
+ /* Basic timers not supported by this implementation */
+
+ ASSERT(0);
+ break;
+#endif
+
+#ifdef CONFIG_STM32_TIM8
+ case 8:
+ g_tickless.base = STM32_TIM8_BASE;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_TIM9
+ case 9:
+ g_tickless.base = STM32_TIM9_BASE;
+ break;
+#endif
+#ifdef CONFIG_STM32_TIM10
+ case 10:
+ g_tickless.base = STM32_TIM10_BASE;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_TIM11
+ case 11:
+ g_tickless.base = STM32_TIM11_BASE;
+ break;
+#endif
+#ifdef CONFIG_STM32_TIM12
+ case 12:
+ g_tickless.base = STM32_TIM12_BASE;
+ break;
+#endif
+#ifdef CONFIG_STM32_TIM13
+ case 13:
+ g_tickless.base = STM32_TIM13_BASE;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_TIM14
+ case 14:
+ g_tickless.base = STM32_TIM14_BASE;
+ break;
+#endif
+#ifdef CONFIG_STM32_TIM15
+ case 15:
+ g_tickless.base = STM32_TIM15_BASE;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_TIM16
+ case 16:
+ g_tickless.base = STM32_TIM16_BASE;
+ break;
+#endif
+
+#ifdef CONFIG_STM32_TIM17
+ case 17:
+ g_tickless.base = STM32_TIM17_BASE;
+ break;
+#endif
+
+ default:
+ ASSERT(0);
}
+
+ /* Get the TC frequency that corresponds to the requested resolution */
+
+ g_tickless.frequency = USEC_PER_SEC / (uint32_t)CONFIG_USEC_PER_TICK;
+ g_tickless.timer = CONFIG_STM32_TICKLESS_TIMER;
+ g_tickless.channel = CONFIG_STM32_TICKLESS_CHANNEL;
+ g_tickless.pending = false;
+ g_tickless.period = 0;
+
+ tmrinfo("timer=%d channel=%d frequency=%d Hz\n",
+ g_tickless.timer, g_tickless.channel, g_tickless.frequency);
+
+ g_tickless.tch = stm32_tim_init(g_tickless.timer);
+ if (!g_tickless.tch)
+ {
+ tmrerr("ERROR: Failed to allocate TIM%d\n", g_tickless.timer);
+ ASSERT(0);
+ }
+
+ STM32_TIM_SETCLOCK(g_tickless.tch, g_tickless.frequency);
+
+#ifdef CONFIG_CLOCK_TIMEKEEPING
+
+ /* Should this be changed to 0xffff because we use 16 bit timers? */
+
+ g_tickless.counter_mask = 0xffffffffull;
+#else
+ g_tickless.overflow = 0;
+
+ /* Set up to receive the callback when the counter overflow occurs */
+
+ STM32_TIM_SETISR(g_tickless.tch, stm32_tickless_handler, NULL, 0);
+#endif
+
+ /* Initialize interval to zero */
+
+ STM32_TIM_SETCOMPARE(g_tickless.tch, g_tickless.channel, 0);
+
+ /* Setup compare channel for the interval timing */
+
+ stm32_tickless_setchannel(g_tickless.channel);
+
+ /* Set timer period */
+
+ STM32_TIM_SETPERIOD(g_tickless.tch, UINT16_MAX);
+
+ /* Initialize the counter */
+
+ STM32_TIM_SETMODE(g_tickless.tch, STM32_TIM_MODE_UP);
+
+#ifdef CONFIG_SCHED_TICKLESS_LIMIT_MAX_SLEEP
+ g_oneshot_maxticks = UINT16_MAX;
+#endif
+
+ /* Start the timer */
+
+ STM32_TIM_ACKINT(g_tickless.tch, 0);
+ STM32_TIM_ENABLEINT(g_tickless.tch, 0);
}
/****************************************************************************
@@ -276,14 +601,84 @@ void arm_timer_initialize(void)
int up_timer_gettime(FAR struct timespec *ts)
{
- return stm32_freerun_counter(&g_tickless.freerun, ts);
+ uint64_t usec;
+ uint32_t counter;
+ uint32_t verify;
+ uint32_t overflow;
+ uint32_t sec;
+ int pending;
+ irqstate_t flags;
+
+ DEBUGASSERT(g_tickless.tch && ts);
+
+ /* Temporarily disable the overflow counter. NOTE that we have to be
+ * careful here because stm32_tc_getpending() will reset the pending
+ * interrupt status. If we do not handle the overflow here then, it will
+ * be lost.
+ */
+
+ flags = enter_critical_section();
+
+ overflow = g_tickless.overflow;
+ counter = STM32_TIM_GETCOUNTER(g_tickless.tch);
+ pending = STM32_TIM_CHECKINT(g_tickless.tch, 0);
+ verify = STM32_TIM_GETCOUNTER(g_tickless.tch);
+
+ /* If an interrupt was pending before we re-enabled interrupts,
+ * then the overflow needs to be incremented.
+ */
+
+ if (pending)
+ {
+ STM32_TIM_ACKINT(g_tickless.tch, 0);
+
+ /* Increment the overflow count and use the value of the
+ * guaranteed to be AFTER the overflow occurred.
+ */
+
+ overflow++;
+ counter = verify;
+
+ /* Update tickless overflow counter. */
+
+ g_tickless.overflow = overflow;
+ }
+
+ leave_critical_section(flags);
+
+ tmrinfo("counter=%lu (%lu) overflow=%lu, pending=%i\n",
+ (unsigned long)counter, (unsigned long)verify,
+ (unsigned long)overflow, pending);
+ tmrinfo("frequency=%u\n", g_tickless.frequency);
+
+ /* Convert the whole thing to units of microseconds.
+ *
+ * frequency = ticks / second
+ * seconds = ticks * frequency
+ * usecs = (ticks * USEC_PER_SEC) / frequency;
+ */
+
+ usec = ((((uint64_t)overflow << 16) + (uint64_t)counter) * USEC_PER_SEC) /
+ g_tickless.frequency;
+
+ /* And return the value of the timer */
+
+ sec = (uint32_t)(usec / USEC_PER_SEC);
+ ts->tv_sec = sec;
+ ts->tv_nsec = (usec - (sec * USEC_PER_SEC)) * NSEC_PER_USEC;
+
+ tmrinfo("usec=%llu ts=(%u, %lu)\n",
+ usec, (unsigned long)ts->tv_sec, (unsigned long)ts->tv_nsec);
+
+ return OK;
}
#else
int up_timer_getcounter(FAR uint64_t *cycles)
{
- return stm32_freerun_counter(&g_tickless.freerun, cycles);
+ *cycles = (uint64_t)STM32_TIM_GETCOUNTER(g_tickless.tch);
+ return OK;
}
#endif /* CONFIG_CLOCK_TIMEKEEPING */
@@ -306,7 +701,7 @@ int up_timer_getcounter(FAR uint64_t *cycles)
void up_timer_getmask(FAR uint64_t *mask)
{
DEBUGASSERT(mask != NULL);
- *mask = g_tickless.freerun.counter_mask;
+ *mask = g_tickless.counter_mask;
}
#endif /* CONFIG_CLOCK_TIMEKEEPING */
@@ -348,7 +743,101 @@ void up_timer_getmask(FAR uint64_t *mask)
int up_timer_cancel(FAR struct timespec *ts)
{
- return stm32_oneshot_cancel(&g_tickless.oneshot, ts);
+ irqstate_t flags;
+ uint64_t usec;
+ uint64_t sec;
+ uint64_t nsec;
+ uint32_t count;
+ uint32_t period;
+
+ /* Was the timer running? */
+
+ flags = enter_critical_section();
+ if (!g_tickless.pending)
+ {
+ /* No.. Just return zero timer remaining and successful cancellation.
+ * This function may execute at a high rate with no timer running
+ * (as when pre-emption is enabled and disabled).
+ */
+
+ if (ts)
+ {
+ ts->tv_sec = 0;
+ ts->tv_nsec = 0;
+ }
+
+ leave_critical_section(flags);
+ return OK;
+ }
+
+ /* Yes.. Get the timer counter and period registers and disable the compare interrupt.
+ *
+ */
+
+ tmrinfo("Cancelling...\n");
+
+ /* Disable the interrupt. */
+
+ stm32_tickless_disableint(g_tickless.channel);
+
+ count = STM32_TIM_GETCOUNTER(g_tickless.tch);
+ period = g_tickless.period;
+
+ g_tickless.pending = false;
+ leave_critical_section(flags);
+
+ /* Did the caller provide us with a location to return the time
+ * remaining?
+ */
+
+ if (ts != NULL)
+ {
+ /* Yes.. then calculate and return the time remaining on the
+ * oneshot timer.
+ */
+
+ tmrinfo("period=%lu count=%lu\n",
+ (unsigned long)period, (unsigned long)count);
+
+ if (count > period)
+ {
+ /* Handle rollover */
+
+ period += UINT16_MAX;
+ }
+ else if (count == period)
+ {
+ /* No time remaining */
+
+ ts->tv_sec = 0;
+ ts->tv_nsec = 0;
+ return OK;
+ }
+
+ /* The total time remaining is the difference. Convert that
+ * to units of microseconds.
+ *
+ * frequency = ticks / second
+ * seconds = ticks * frequency
+ * usecs = (ticks * USEC_PER_SEC) / frequency;
+ */
+
+ usec = (((uint64_t)(period - count)) * USEC_PER_SEC) /
+ g_tickless.frequency;
+
+ /* Return the time remaining in the correct form */
+
+ sec = usec / USEC_PER_SEC;
+ nsec = ((usec) - (sec * USEC_PER_SEC)) * NSEC_PER_USEC;
+
+ ts->tv_sec = (time_t)sec;
+ ts->tv_nsec = (unsigned long)nsec;
+
+ tmrinfo("remaining (%lu, %lu)\n",
+ (unsigned long)ts->tv_sec, (unsigned long)ts->tv_nsec);
+ }
+
+ return OK;
}
/****************************************************************************
@@ -378,6 +867,65 @@ int up_timer_cancel(FAR struct timespec *ts)
int up_timer_start(FAR const struct timespec *ts)
{
- return stm32_oneshot_start(&g_tickless.oneshot, stm32_oneshot_handler, NULL, ts);
+ uint64_t usec;
+ uint64_t period;
+ uint32_t count;
+ irqstate_t flags;
+
+ tmrinfo("handler=%p arg=%p, ts=(%lu, %lu)\n",
+ handler, arg, (unsigned long)ts->tv_sec, (unsigned long)ts->tv_nsec);
+ DEBUGASSERT(ts);
+ DEBUGASSERT(g_tickless.tch);
+
+ /* Was an interval already running? */
+
+ flags = enter_critical_section();
+ if (g_tickless.pending)
+ {
+ /* Yes.. then cancel it */
+
+ tmrinfo("Already running... cancelling\n");
+ (void)up_timer_cancel(NULL);
+ }
+
+ /* Express the delay in microseconds */
+
+ usec = (uint64_t)ts->tv_sec * USEC_PER_SEC +
+ (uint64_t)(ts->tv_nsec / NSEC_PER_USEC);
+
+ /* Get the timer counter frequency and determine the number of counts need
+ * to achieve the requested delay.
+ *
+ * frequency = ticks / second
+ * ticks = seconds * frequency
+ * = (usecs * frequency) / USEC_PER_SEC;
+ */
+
+ period = (usec * (uint64_t)g_tickless.frequency) / USEC_PER_SEC;
+ count = STM32_TIM_GETCOUNTER(g_tickless.tch);
+
+ tmrinfo("usec=%llu period=%08llx\n", usec, period);
+ DEBUGASSERT(period <= UINT16_MAX);
+
+ /* Set interval compare value. Rollover is fine,
+ * channel will trigger on the next period. (uint16_t) cast
+ * handles the overflow.
+ */
+
+ g_tickless.period = (uint16_t)(period + count);
+
+ STM32_TIM_SETCOMPARE(g_tickless.tch, g_tickless.channel,
+ g_tickless.period);
+
+ /* Enable interrupts. We should get the callback when the interrupt
+ * occurs.
+ */
+
+ stm32_tickless_ackint(g_tickless.channel);
+ stm32_tickless_enableint(g_tickless.channel);
+
+ g_tickless.pending = true;
+ leave_critical_section(flags);
+ return OK;
}
#endif /* CONFIG_SCHED_TICKLESS */
diff --git a/arch/arm/src/stm32f7/Make.defs b/arch/arm/src/stm32f7/Make.defs
index d25b702d67d..8baa4fbf135 100644
--- a/arch/arm/src/stm32f7/Make.defs
+++ b/arch/arm/src/stm32f7/Make.defs
@@ -194,3 +194,7 @@ endif
ifeq ($(CONFIG_STM32F7_BBSRAM),y)
CHIP_CSRCS += stm32_bbsram.c
endif
+
+ifeq ($(CONFIG_STM32F7_RNG),y)
+CHIP_CSRCS += stm32_rng.c
+endif
diff --git a/arch/arm/src/stm32f7/chip/stm32_rng.h b/arch/arm/src/stm32f7/chip/stm32_rng.h
new file mode 100644
index 00000000000..3f5351a074b
--- /dev/null
+++ b/arch/arm/src/stm32f7/chip/stm32_rng.h
@@ -0,0 +1,77 @@
+/************************************************************************************
+ * arch/arm/src/stm32f7/chip/stm32_rng.h
+ *
+ * Copyright (C) 2012 Max Holtzberg. All rights reserved.
+ * Author: Max Holtzberg
+ *
+ * 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.
+ *
+ ************************************************************************************/
+
+#ifndef __ARCH_ARM_STC_STM32F7_CHIP_STM32_RNG_H
+#define __ARCH_ARM_STC_STM32F7_CHIP_STM32_RNG_H
+
+/************************************************************************************
+ * Included Files
+ ************************************************************************************/
+
+#include
+#include "chip.h"
+
+/************************************************************************************
+ * Pre-processor Definitions
+ ************************************************************************************/
+
+/* Register Offsets *****************************************************************/
+
+#define STM32_RNG_CR_OFFSET 0x0000 /* RNG Control Register */
+#define STM32_RNG_SR_OFFSET 0x0004 /* RNG Status Register */
+#define STM32_RNG_DR_OFFSET 0x0008 /* RNG Data Register */
+
+/* Register Addresses ***************************************************************/
+
+#define STM32_RNG_CR (STM32_RNG_BASE+STM32_RNG_CR_OFFSET)
+#define STM32_RNG_SR (STM32_RNG_BASE+STM32_RNG_SR_OFFSET)
+#define STM32_RNG_DR (STM32_RNG_BASE+STM32_RNG_DR_OFFSET)
+
+/* Register Bitfield Definitions ****************************************************/
+
+/* RNG Control Register */
+
+#define RNG_CR_RNGEN (1 << 2) /* Bit 2: RNG enable */
+#define RNG_CR_IE (1 << 3) /* Bit 3: Interrupt enable */
+
+/* RNG Status Register */
+
+#define RNG_SR_DRDY (1 << 0) /* Bit 0: Data ready */
+#define RNG_SR_CECS (1 << 1) /* Bit 1: Clock error current status */
+#define RNG_SR_SECS (1 << 2) /* Bit 2: Seed error current status */
+#define RNG_SR_CEIS (1 << 5) /* Bit 5: Clock error interrupt status */
+#define RNG_SR_SEIS (1 << 6) /* Bit 6: Seed error interrupt status */
+
+#endif /* __ARCH_ARM_STC_STM32F7_CHIP_STM32_RNG_H */
diff --git a/arch/arm/src/stm32f7/stm32_rng.c b/arch/arm/src/stm32f7/stm32_rng.c
new file mode 100644
index 00000000000..8fb0f466859
--- /dev/null
+++ b/arch/arm/src/stm32f7/stm32_rng.c
@@ -0,0 +1,362 @@
+/****************************************************************************
+ * arch/arm/src/stm32f7/stm32_rng.c
+ *
+ * Copyright (C) 2012 Max Holtzberg. All rights reserved.
+ * Author: Max Holtzberg
+ * mods for STL32L4 port by dev@ziggurat29.com
+ *
+ * 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
+#include
+#include
+
+#include "up_arch.h"
+#include "chip/stm32_rng.h"
+#include "up_internal.h"
+
+#if defined(CONFIG_STM32F7_RNG)
+#if defined(CONFIG_DEV_RANDOM) || defined(CONFIG_DEV_URANDOM_ARCH)
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static int stm32_rng_initialize(void);
+static int stm32_rnginterrupt(int irq, void *context, FAR void *arg);
+static void stm32_rngenable(void);
+static void stm32_rngdisable(void);
+static ssize_t stm32_rngread(struct file *filep, char *buffer, size_t);
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct rng_dev_s
+{
+ sem_t rd_devsem; /* Threads can only exclusively access the RNG */
+ sem_t rd_readsem; /* To block until the buffer is filled */
+ char *rd_buf;
+ size_t rd_buflen;
+ uint32_t rd_lastval;
+ bool rd_first;
+};
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static struct rng_dev_s g_rngdev;
+
+static const struct file_operations g_rngops =
+{
+ 0, /* open */
+ 0, /* close */
+ stm32_rngread, /* read */
+ 0, /* write */
+ 0, /* seek */
+ 0 /* ioctl */
+#ifndef CONFIG_DISABLE_POLL
+ , 0 /* poll */
+#endif
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+ , 0 /* unlink */
+#endif
+};
+
+/****************************************************************************
+ * Private functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: stm32_rng_initialize
+ ****************************************************************************/
+
+static int stm32_rng_initialize(void)
+{
+ _info("Initializing RNG\n");
+
+ memset(&g_rngdev, 0, sizeof(struct rng_dev_s));
+
+ sem_init(&g_rngdev.rd_devsem, 0, 1);
+
+ if (irq_attach(STM32_IRQ_RNG, stm32_rnginterrupt, NULL))
+ {
+ /* We could not attach the ISR to the interrupt */
+
+ _info("Could not attach IRQ.\n");
+
+ return -EAGAIN;
+ }
+
+ return OK;
+}
+
+/****************************************************************************
+ * Name: stm32_rngenable
+ ****************************************************************************/
+
+static void stm32_rngenable(void)
+{
+ uint32_t regval;
+
+ g_rngdev.rd_first = true;
+
+ /* Enable generation and interrupts */
+
+ regval = getreg32(STM32_RNG_CR);
+ regval |= RNG_CR_RNGEN;
+ regval |= RNG_CR_IE;
+ putreg32(regval, STM32_RNG_CR);
+
+ up_enable_irq(STM32_IRQ_RNG);
+}
+
+/****************************************************************************
+ * Name: stm32_rngdisable
+ ****************************************************************************/
+
+static void stm32_rngdisable(void)
+{
+ uint32_t regval;
+
+ up_disable_irq(STM32_IRQ_RNG);
+
+ regval = getreg32(STM32_RNG_CR);
+ regval &= ~RNG_CR_IE;
+ regval &= ~RNG_CR_RNGEN;
+ putreg32(regval, STM32_RNG_CR);
+}
+
+/****************************************************************************
+ * Name: stm32_rnginterrupt
+ ****************************************************************************/
+
+static int stm32_rnginterrupt(int irq, void *context, FAR void *arg)
+{
+ uint32_t rngsr;
+ uint32_t data;
+
+ rngsr = getreg32(STM32_RNG_SR);
+ if (rngsr & RNG_SR_CEIS) /* Check for clock error int stat */
+ {
+ /* Clear it, we will try again. */
+
+ putreg32(rngsr & ~RNG_SR_CEIS, STM32_RNG_SR);
+ return OK;
+ }
+
+ if (rngsr & RNG_SR_SEIS) /* Check for seed error in int stat */
+ {
+ uint32_t crval;
+
+ /* Clear seed error, then disable/enable the rng and try again. */
+
+ putreg32(rngsr & ~RNG_SR_SEIS, STM32_RNG_SR);
+ crval = getreg32(STM32_RNG_CR);
+ crval &= ~RNG_CR_RNGEN;
+ putreg32(crval, STM32_RNG_CR);
+ crval |= RNG_CR_RNGEN;
+ putreg32(crval, STM32_RNG_CR);
+ return OK;
+ }
+
+ if (!(rngsr & RNG_SR_DRDY)) /* Data ready must be set */
+ {
+ /* This random value is not valid, we will try again. */
+
+ return OK;
+ }
+
+ data = getreg32(STM32_RNG_DR);
+
+ /* As required by the FIPS PUB (Federal Information Processing Standard
+ * Publication) 140-2, the first random number generated after setting the
+ * RNGEN bit should not be used, but saved for comparison with the next
+ * generated random number. Each subsequent generated random number has to be
+ * compared with the previously generated number. The test fails if any two
+ * compared numbers are equal (continuous random number generator test).
+ */
+
+ if (g_rngdev.rd_first)
+ {
+ g_rngdev.rd_first = false;
+ g_rngdev.rd_lastval = data;
+ return OK;
+ }
+
+ if (g_rngdev.rd_lastval == data)
+ {
+ /* Two subsequent same numbers, we will try again. */
+
+ return OK;
+ }
+
+ /* If we get here, the random number is valid. */
+
+ g_rngdev.rd_lastval = data;
+
+ if (g_rngdev.rd_buflen >= 4)
+ {
+ g_rngdev.rd_buflen -= 4;
+ *(uint32_t *)&g_rngdev.rd_buf[g_rngdev.rd_buflen] = data;
+ }
+ else
+ {
+ while (g_rngdev.rd_buflen > 0)
+ {
+ g_rngdev.rd_buf[--g_rngdev.rd_buflen] = (char)data;
+ data >>= 8;
+ }
+ }
+
+ if (g_rngdev.rd_buflen == 0)
+ {
+ /* Buffer filled, stop further interrupts. */
+
+ stm32_rngdisable();
+ sem_post(&g_rngdev.rd_readsem);
+ }
+
+ return OK;
+}
+
+/****************************************************************************
+ * Name: stm32_rngread
+ ****************************************************************************/
+
+static ssize_t stm32_rngread(struct file *filep, char *buffer, size_t buflen)
+{
+ if (sem_wait(&g_rngdev.rd_devsem) != OK)
+ {
+ return -errno;
+ }
+ else
+ {
+ /* We've got the device semaphore, proceed with reading */
+
+ /* Initialize the operation semaphore with 0 for blocking until the
+ * buffer is filled from interrupts. The readsem semaphore is used
+ * for signaling and, hence, should not have priority inheritance
+ * enabled.
+ */
+
+ sem_init(&g_rngdev.rd_readsem, 0, 0);
+ sem_setprotocol(&g_rngdev.rd_readsem, SEM_PRIO_NONE);
+
+ g_rngdev.rd_buflen = buflen;
+ g_rngdev.rd_buf = buffer;
+
+ /* Enable RNG with interrupts */
+
+ stm32_rngenable();
+
+ /* Wait until the buffer is filled */
+
+ sem_wait(&g_rngdev.rd_readsem);
+
+ /* Done with the operation semaphore */
+
+ sem_destroy(&g_rngdev.rd_readsem);
+
+ /* Free RNG via the device semaphore for next use */
+
+ sem_post(&g_rngdev.rd_devsem);
+
+ return buflen;
+ }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: devrandom_register
+ *
+ * Description:
+ * Initialize the RNG hardware and register the /dev/random driver.
+ * Must be called BEFORE devurandom_register.
+ *
+ * Input Parameters:
+ * None
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_DEV_RANDOM
+void devrandom_register(void)
+{
+ stm32_rng_initialize();
+ (void)register_driver("/dev/random", &g_rngops, 0444, NULL);
+}
+#endif
+
+/****************************************************************************
+ * Name: devurandom_register
+ *
+ * Description:
+ * Register /dev/urandom
+ *
+ * Input Parameters:
+ * None
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_DEV_URANDOM_ARCH
+void devurandom_register(void)
+{
+#ifndef CONFIG_DEV_RANDOM
+ stm32_rng_initialize();
+#endif
+ (void)register_driver("/dev/urandom", &g_rngops, 0444, NULL);
+}
+#endif
+
+#endif /* CONFIG_DEV_RANDOM || CONFIG_DEV_URANDOM_ARCH */
+#endif /* CONFIG_STM32F7_RNG */
diff --git a/arch/arm/src/stm32l4/stm32l4_rng.c b/arch/arm/src/stm32l4/stm32l4_rng.c
index dd0f782f2d0..3334d86ec0a 100644
--- a/arch/arm/src/stm32l4/stm32l4_rng.c
+++ b/arch/arm/src/stm32l4/stm32l4_rng.c
@@ -145,7 +145,7 @@ static void stm32l4_rngenable(void)
up_enable_irq(STM32L4_IRQ_RNG);
}
-static void stm32l4_rngdisable()
+static void stm32l4_rngdisable(void)
{
uint32_t regval;
@@ -261,7 +261,7 @@ static ssize_t stm32l4_rngread(struct file *filep, char *buffer, size_t buflen)
/* We've got the device semaphore, proceed with reading */
/* Initialize the operation semaphore with 0 for blocking until the
- * buffer is filled from interrupts. The waitsem semaphore is used
+ * buffer is filled from interrupts. The readsem semaphore is used
* for signaling and, hence, should not have priority inheritance
* enabled.
*/
diff --git a/configs/Kconfig b/configs/Kconfig
index aef29eecd66..27d98e0821e 100644
--- a/configs/Kconfig
+++ b/configs/Kconfig
@@ -2015,6 +2015,27 @@ config BOARD_RESET_ON_CRASH
If selected the board_crashdump should reset the machine after
saveing the state of the machine
+config BOARD_ENTROPY_POOL
+ bool "Enable Board level storing of entropy pool structure"
+ default n
+ depends on CRYPTO_RANDOM_POOL
+ ---help---
+ Entropy pool structure can be provided by board source.
+ Use for this is, for example, to allocate entropy pool
+ from special area of RAM which content is kept over
+ system reset.
+
+config BOARD_INITRNGSEED
+ bool "Enable Board level initial seeding of entropy pool RNG"
+ default n
+ depends on CRYPTO_RANDOM_POOL
+ ---help---
+ If enabled, entropy pool random number generator will call
+ board_init_rndseed() upon initialization. This function
+ can then provide early entropy seed to the pool through
+ entropy injection APIs provided at 'nuttx/random.h'.
+#endif
+
config LIB_BOARDCTL
bool "Enable boardctl() interface"
default n
diff --git a/configs/arduino-due/nsh/defconfig b/configs/arduino-due/nsh/defconfig
index b41d96a19d5..00694eb692a 100644
--- a/configs/arduino-due/nsh/defconfig
+++ b/configs/arduino-due/nsh/defconfig
@@ -392,7 +392,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/avr32dev1/nsh/defconfig b/configs/avr32dev1/nsh/defconfig
index 0536c98a8e5..c561d5cfd7c 100644
--- a/configs/avr32dev1/nsh/defconfig
+++ b/configs/avr32dev1/nsh/defconfig
@@ -242,7 +242,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/avr32dev1/ostest/defconfig b/configs/avr32dev1/ostest/defconfig
index 1d47dd30b71..2ad1f6896ed 100644
--- a/configs/avr32dev1/ostest/defconfig
+++ b/configs/avr32dev1/ostest/defconfig
@@ -242,7 +242,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/bambino-200e/netnsh/defconfig b/configs/bambino-200e/netnsh/defconfig
index 55267ea9e93..a064c254860 100644
--- a/configs/bambino-200e/netnsh/defconfig
+++ b/configs/bambino-200e/netnsh/defconfig
@@ -400,7 +400,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/bambino-200e/nsh/defconfig b/configs/bambino-200e/nsh/defconfig
index 4f62a210c2b..3d4282dbc83 100644
--- a/configs/bambino-200e/nsh/defconfig
+++ b/configs/bambino-200e/nsh/defconfig
@@ -385,7 +385,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/bambino-200e/usbnsh/defconfig b/configs/bambino-200e/usbnsh/defconfig
index 46a155e47e2..01f5f865615 100644
--- a/configs/bambino-200e/usbnsh/defconfig
+++ b/configs/bambino-200e/usbnsh/defconfig
@@ -385,7 +385,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/c5471evm/httpd/defconfig b/configs/c5471evm/httpd/defconfig
index 35ccf58008a..d72ae45b169 100644
--- a/configs/c5471evm/httpd/defconfig
+++ b/configs/c5471evm/httpd/defconfig
@@ -288,7 +288,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/c5471evm/nsh/defconfig b/configs/c5471evm/nsh/defconfig
index fce9fd49402..014118ad613 100644
--- a/configs/c5471evm/nsh/defconfig
+++ b/configs/c5471evm/nsh/defconfig
@@ -288,7 +288,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/cc3200-launchpad/nsh/defconfig b/configs/cc3200-launchpad/nsh/defconfig
index 2be216cfef1..0c3ea5e93d1 100644
--- a/configs/cc3200-launchpad/nsh/defconfig
+++ b/configs/cc3200-launchpad/nsh/defconfig
@@ -351,7 +351,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/clicker2-stm32/Kconfig b/configs/clicker2-stm32/Kconfig
index b2e5965456c..1ca0fbc9eef 100644
--- a/configs/clicker2-stm32/Kconfig
+++ b/configs/clicker2-stm32/Kconfig
@@ -7,16 +7,14 @@ if ARCH_BOARD_CLICKER2_STM32
config CLICKER2_STM32_MB1_SPI
bool "mikroBUS1 SPI"
- default n if !STM32_SPI3
- default y if STM32_SPI3
+ default n
select STM32_SPI3
---help---
Enable SPI support on mikroBUS1 (STM32 SPI3)
config CLICKER2_STM32_MB2_SPI
bool "mikroBUS2 SPI"
- default n if !STM32_SPI2
- default y if STM32_SPI2
+ default n
select STM32_SPI2
---help---
Enable SPI support on mikroBUS1 (STM32 SPI2)
diff --git a/configs/clicker2-stm32/README.txt b/configs/clicker2-stm32/README.txt
index c412c114350..e265d475c0f 100644
--- a/configs/clicker2-stm32/README.txt
+++ b/configs/clicker2-stm32/README.txt
@@ -249,3 +249,55 @@ Configurations
CONFIG_HAVE_CXX=y
CONFIG_HAVE_CXXINITIALIZE=y
CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
+
+ usbnsh:
+ -------
+
+ This is another NSH example. If differs from other 'nsh' configurations
+ in that this configurations uses a USB serial device for console I/O.
+ Such a configuration is useful on the Clicker2 STM32 which has no
+ builtin RS-232 drivers.
+
+ NOTES:
+
+ 1. This configuration does have USART3 output enabled and set up as
+ the system logging device:
+
+ CONFIG_SYSLOG_CHAR=y : Use a character device for system logging
+ CONFIG_SYSLOG_DEVPATH="/dev/ttyS0" : USART3 will be /dev/ttyS0
+
+ However, there is nothing to generate SYLOG output in the default
+ configuration so nothing should appear on USART3 unless you enable
+ some debug output or enable the USB monitor.
+
+ 2. Enabling USB monitor SYSLOG output. If tracing is enabled, the USB
+ device will save encoded trace output in in-memory buffer; if the
+ USB monitor is enabled, that trace buffer will be periodically
+ emptied and dumped to the system logging device (USART3 in this
+ configuration):
+
+ CONFIG_USBDEV_TRACE=y : Enable USB trace feature
+ CONFIG_USBDEV_TRACE_NRECORDS=128 : Buffer 128 records in memory
+ CONFIG_NSH_USBDEV_TRACE=n : No builtin tracing from NSH
+ CONFIG_NSH_ARCHINIT=y : Automatically start the USB monitor
+ CONFIG_USBMONITOR=y : Enable the USB monitor daemon
+ CONFIG_USBMONITOR_STACKSIZE=2048 : USB monitor daemon stack size
+ CONFIG_USBMONITOR_PRIORITY=50 : USB monitor daemon priority
+ CONFIG_USBMONITOR_INTERVAL=2 : Dump trace data every 2 seconds
+
+ CONFIG_USBMONITOR_TRACEINIT=y : Enable TRACE output
+ CONFIG_USBMONITOR_TRACECLASS=y
+ CONFIG_USBMONITOR_TRACETRANSFERS=y
+ CONFIG_USBMONITOR_TRACECONTROLLER=y
+ CONFIG_USBMONITOR_TRACEINTERRUPTS=y
+
+ Using the Prolifics PL2303 Emulation
+ ------------------------------------
+ You could also use the non-standard PL2303 serial device instead of
+ the standard CDC/ACM serial device by changing:
+
+ CONFIG_CDCACM=n : Disable the CDC/ACM serial device class
+ CONFIG_CDCACM_CONSOLE=n : The CDC/ACM serial device is NOT the console
+ CONFIG_PL2303=y : The Prolifics PL2303 emulation is enabled
+ CONFIG_PL2303_CONSOLE=y : The PL2303 serial device is the console
+
diff --git a/configs/clicker2-stm32/nsh/defconfig b/configs/clicker2-stm32/nsh/defconfig
index 764b16372c6..22ba79f501e 100644
--- a/configs/clicker2-stm32/nsh/defconfig
+++ b/configs/clicker2-stm32/nsh/defconfig
@@ -148,14 +148,10 @@ CONFIG_ARM_HAVE_MPU_UNIFIED=y
# CONFIG_ARMV7M_TOOLCHAIN_CODEREDL is not set
# CONFIG_ARMV7M_TOOLCHAIN_CODESOURCERYL is not set
CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIL=y
-# CONFIG_ARMV7M_OABI_TOOLCHAIN is not set
CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_STACKCHECK is not set
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
-# CONFIG_USBHOST_BULK_DISABLE is not set
-# CONFIG_USBHOST_INT_DISABLE is not set
-# CONFIG_USBHOST_ISOC_DISABLE is not set
#
# STM32 Configuration Options
@@ -414,7 +410,7 @@ CONFIG_STM32_HAVE_SPI3=y
# CONFIG_STM32_I2C1 is not set
# CONFIG_STM32_I2C2 is not set
# CONFIG_STM32_I2C3 is not set
-CONFIG_STM32_OTGFS=y
+# CONFIG_STM32_OTGFS is not set
# CONFIG_STM32_OTGHS is not set
CONFIG_STM32_PWR=y
# CONFIG_STM32_RNG is not set
@@ -451,6 +447,7 @@ CONFIG_STM32_USART3=y
# Alternate Pin Mapping
#
# CONFIG_STM32_FLASH_PREFETCH is not set
+# CONFIG_STM32_FLASH_WORKAROUND_DATA_CACHE_CORRUPTION_ON_RWW is not set
# CONFIG_STM32_JTAG_DISABLE is not set
# CONFIG_STM32_JTAG_FULL_ENABLE is not set
# CONFIG_STM32_JTAG_NOJNTRST_ENABLE is not set
@@ -504,11 +501,6 @@ CONFIG_STM32_USART3_SERIALDRIVER=y
#
# USB FS Host Configuration
#
-CONFIG_STM32_OTGFS_RXFIFO_SIZE=128
-CONFIG_STM32_OTGFS_NPTXFIFO_SIZE=96
-CONFIG_STM32_OTGFS_PTXFIFO_SIZE=128
-CONFIG_STM32_OTGFS_DESCSIZE=128
-# CONFIG_STM32_OTGFS_SOFINTR is not set
#
# USB HS Host Configuration
@@ -603,6 +595,8 @@ CONFIG_ARCH_IRQBUTTONS=y
#
# Board-Specific Options
#
+# CONFIG_CLICKER2_STM32_MB1_SPI is not set
+# CONFIG_CLICKER2_STM32_MB2_SPI is not set
# CONFIG_BOARD_CRASHDUMP is not set
CONFIG_LIB_BOARDCTL=y
# CONFIG_BOARDCTL_RESET is not set
@@ -631,9 +625,9 @@ CONFIG_USEC_PER_TICK=10000
# CONFIG_CLOCK_MONOTONIC is not set
CONFIG_ARCH_HAVE_TIMEKEEPING=y
# CONFIG_JULIAN_TIME is not set
-CONFIG_START_YEAR=2013
-CONFIG_START_MONTH=1
-CONFIG_START_DAY=1
+CONFIG_START_YEAR=2017
+CONFIG_START_MONTH=3
+CONFIG_START_DAY=25
CONFIG_MAX_WDOGPARMS=2
CONFIG_PREALLOC_WDOGS=8
CONFIG_WDOG_INTRESERVE=1
@@ -657,7 +651,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
@@ -843,18 +838,7 @@ CONFIG_USART3_2STOP=0
# CONFIG_USART3_DMA is not set
# CONFIG_PSEUDOTERM is not set
# CONFIG_USBDEV is not set
-CONFIG_USBHOST=y
-CONFIG_USBHOST_NPREALLOC=4
-CONFIG_USBHOST_HAVE_ASYNCH=y
-# CONFIG_USBHOST_ASYNCH is not set
-# CONFIG_USBHOST_HUB is not set
-# CONFIG_USBHOST_COMPOSITE is not set
-CONFIG_USBHOST_MSC=y
-# CONFIG_USBHOST_CDCACM is not set
-# CONFIG_USBHOST_HIDKBD is not set
-# CONFIG_USBHOST_HIDMOUSE is not set
-# CONFIG_USBHOST_XBOXCONTROLLER is not set
-# CONFIG_USBHOST_TRACE is not set
+# CONFIG_USBHOST is not set
# CONFIG_HAVE_USBTRACE is not set
# CONFIG_DRIVERS_WIRELESS is not set
# CONFIG_DRIVERS_CONTACTLESS is not set
@@ -901,10 +885,7 @@ CONFIG_FS_WRITABLE=y
# CONFIG_FS_NAMED_SEMAPHORES is not set
CONFIG_FS_MQUEUE_MPATH="/var/mqueue"
# CONFIG_FS_RAMMAP is not set
-CONFIG_FS_FAT=y
-CONFIG_FAT_LCNAMES=y
-CONFIG_FAT_LFN=y
-CONFIG_FAT_MAXFNAME=32
+# CONFIG_FS_FAT is not set
# CONFIG_FS_FATTIME is not set
# CONFIG_FAT_FORCE_INDIRECT is not set
# CONFIG_FAT_DMAMEMORY is not set
@@ -1152,6 +1133,7 @@ CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
# CONFIG_EXAMPLES_USBSERIAL is not set
# CONFIG_EXAMPLES_WATCHDOG is not set
# CONFIG_EXAMPLES_WEBSERVER is not set
+# CONFIG_EXAMPLES_XBC_TEST is not set
#
# File System Utilities
diff --git a/configs/clicker2-stm32/src/clicker2-stm32.h b/configs/clicker2-stm32/src/clicker2-stm32.h
index 24dd9e54dc6..5def0fdce83 100644
--- a/configs/clicker2-stm32/src/clicker2-stm32.h
+++ b/configs/clicker2-stm32/src/clicker2-stm32.h
@@ -233,6 +233,17 @@
* Public Functions
************************************************************************************/
+/****************************************************************************
+ * Name: stm32_spidev_initialize
+ *
+ * Description:
+ * Called to configure SPI chip select GPIO pins for the Mikroe Clicker2 STM32
+ * board.
+ *
+ ****************************************************************************/
+
+void weak_function stm32_spidev_initialize(void);
+
/************************************************************************************
* Name: stm32_bringup
*
@@ -254,7 +265,7 @@ int stm32_bringup(void);
*
* Description:
* Called from stm32_boardinitialize very early in inialization to setup USB-related
- * GPIO pins for the Olimex STM32 P407 board.
+ * GPIO pins for the Mikroe Clicker2 STM32 board.
*
************************************************************************************/
diff --git a/configs/clicker2-stm32/src/stm32_boot.c b/configs/clicker2-stm32/src/stm32_boot.c
index fff7bb87648..e87d316572e 100644
--- a/configs/clicker2-stm32/src/stm32_boot.c
+++ b/configs/clicker2-stm32/src/stm32_boot.c
@@ -63,6 +63,17 @@
void stm32_boardinitialize(void)
{
+#if defined(CONFIG_STM32_SPI1) || defined(CONFIG_STM32_SPI2) || defined(CONFIG_STM32_SPI3)
+ /* Configure SPI chip selects if 1) SPI is not disabled, and 2) the weak function
+ * stm32_spidev_initialize() has been brought into the link.
+ */
+
+ if (stm32_spidev_initialize)
+ {
+ stm32_spidev_initialize();
+ }
+#endif
+
#ifdef CONFIG_STM32_OTGFS
/* Initialize USB if the 1) OTG FS controller is in the configuration and 2)
* disabled, and 3) the weak function stm32_usb_configure() has been brought
diff --git a/configs/clicker2-stm32/src/stm32_spi.c b/configs/clicker2-stm32/src/stm32_spi.c
index 87e6e8d1d10..9780fcdb424 100644
--- a/configs/clicker2-stm32/src/stm32_spi.c
+++ b/configs/clicker2-stm32/src/stm32_spi.c
@@ -135,7 +135,18 @@ uint8_t stm32_spi2status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
void stm32_spi3select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
{
spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
- /* To be provided */
+
+ switch(devid)
+ {
+#ifdef CONFIG_IEEE802154_MRF24J40
+ case SPIDEV_IEEE802154:
+ /* Set the GPIO low to select and high to de-select */
+ stm32_gpiowrite(GPIO_MB1_CS, !selected);
+ break;
+#endif
+ default:
+ break;
+ }
}
uint8_t stm32_spi3status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
diff --git a/configs/clicker2-stm32/usbnsh/Make.defs b/configs/clicker2-stm32/usbnsh/Make.defs
new file mode 100644
index 00000000000..c2982852db2
--- /dev/null
+++ b/configs/clicker2-stm32/usbnsh/Make.defs
@@ -0,0 +1,122 @@
+############################################################################
+# configs/clicker2-stm32/usbnsh/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.
+#
+############################################################################
+
+include ${TOPDIR}/.config
+include ${TOPDIR}/tools/Config.mk
+include ${TOPDIR}/arch/arm/src/armv7-m/Toolchain.defs
+
+LDSCRIPT = flash.ld
+
+ifeq ($(WINTOOL),y)
+ # Windows-native toolchains
+ DIRLINK = $(TOPDIR)/tools/copydir.sh
+ DIRUNLINK = $(TOPDIR)/tools/unlink.sh
+ MKDEP = $(TOPDIR)/tools/mkwindeps.sh
+ ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
+ ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
+ ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/$(LDSCRIPT)}"
+else
+ # Linux/Cygwin-native toolchain
+ MKDEP = $(TOPDIR)/tools/mkdeps$(HOSTEXEEXT)
+ ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
+ ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
+ ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/$(LDSCRIPT)
+endif
+
+CC = $(CROSSDEV)gcc
+CXX = $(CROSSDEV)g++
+CPP = $(CROSSDEV)gcc -E
+LD = $(CROSSDEV)ld
+AR = $(CROSSDEV)ar rcs
+NM = $(CROSSDEV)nm
+OBJCOPY = $(CROSSDEV)objcopy
+OBJDUMP = $(CROSSDEV)objdump
+
+ARCHCCVERSION = ${shell $(CC) -v 2>&1 | sed -n '/^gcc version/p' | sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q'}
+ARCHCCMAJOR = ${shell echo $(ARCHCCVERSION) | cut -d'.' -f1}
+
+ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
+ ARCHOPTIMIZATION = -g
+endif
+
+ifneq ($(CONFIG_DEBUG_NOOPT),y)
+ ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
+endif
+
+ARCHCFLAGS = -fno-builtin
+ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti
+ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
+ARCHWARNINGSXX = -Wall -Wshadow -Wundef
+ARCHDEFINES =
+ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
+
+CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
+CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
+CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
+CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS)
+CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES)
+AFLAGS = $(CFLAGS) -D__ASSEMBLY__
+
+NXFLATLDFLAGS1 = -r -d -warn-common
+NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-gotoff.ld -no-check-sections
+LDNXFLATFLAGS = -e main -s 2048
+
+# Loadable module definitions
+
+CMODULEFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
+
+LDMODULEFLAGS = -r -e module_initialize
+ifeq ($(WINTOOL),y)
+ LDMODULEFLAGS += -T "${shell cygpath -w $(TOPDIR)/libc/modlib/gnu-elf.ld}"
+else
+ LDMODULEFLAGS += -T $(TOPDIR)/libc/modlib/gnu-elf.ld
+endif
+
+ASMEXT = .S
+OBJEXT = .o
+LIBEXT = .a
+EXEEXT =
+
+ifneq ($(CROSSDEV),arm-nuttx-elf-)
+ LDFLAGS += -nostartfiles -nodefaultlibs
+endif
+ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
+ LDFLAGS += -g
+endif
+
+HOSTCC = gcc
+HOSTINCLUDES = -I.
+HOSTCFLAGS = -Wall -Wstrict-prototypes -Wshadow -Wundef -g -pipe
+HOSTLDFLAGS =
diff --git a/configs/clicker2-stm32/usbnsh/defconfig b/configs/clicker2-stm32/usbnsh/defconfig
new file mode 100644
index 00000000000..55d3bb74235
--- /dev/null
+++ b/configs/clicker2-stm32/usbnsh/defconfig
@@ -0,0 +1,1354 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Nuttx/ Configuration
+#
+
+#
+# Build Setup
+#
+# CONFIG_EXPERIMENTAL is not set
+# CONFIG_DEFAULT_SMALL is not set
+CONFIG_HOST_LINUX=y
+# CONFIG_HOST_OSX is not set
+# CONFIG_HOST_WINDOWS is not set
+# CONFIG_HOST_OTHER is not set
+
+#
+# Build Configuration
+#
+# CONFIG_APPS_DIR="../apps"
+CONFIG_BUILD_FLAT=y
+# CONFIG_BUILD_2PASS is not set
+
+#
+# Binary Output Formats
+#
+# CONFIG_RRLOAD_BINARY is not set
+CONFIG_INTELHEX_BINARY=y
+# CONFIG_MOTOROLA_SREC is not set
+CONFIG_RAW_BINARY=y
+# CONFIG_UBOOT_UIMAGE is not set
+
+#
+# Customize Header Files
+#
+# CONFIG_ARCH_STDINT_H is not set
+# CONFIG_ARCH_STDBOOL_H is not set
+# CONFIG_ARCH_MATH_H is not set
+# CONFIG_ARCH_FLOAT_H is not set
+# CONFIG_ARCH_STDARG_H is not set
+# CONFIG_ARCH_DEBUG_H is not set
+
+#
+# Debug Options
+#
+CONFIG_DEBUG_ALERT=y
+# CONFIG_DEBUG_FEATURES is not set
+CONFIG_ARCH_HAVE_STACKCHECK=y
+# CONFIG_STACK_COLORATION is not set
+CONFIG_ARCH_HAVE_HEAPCHECK=y
+# CONFIG_HEAP_COLORATION is not set
+# CONFIG_DEBUG_SYMBOLS is not set
+CONFIG_ARCH_HAVE_CUSTOMOPT=y
+# CONFIG_DEBUG_NOOPT is not set
+# CONFIG_DEBUG_CUSTOMOPT is not set
+CONFIG_DEBUG_FULLOPT=y
+
+#
+# System Type
+#
+CONFIG_ARCH_ARM=y
+# CONFIG_ARCH_AVR is not set
+# CONFIG_ARCH_HC is not set
+# CONFIG_ARCH_MIPS is not set
+# CONFIG_ARCH_MISOC is not set
+# CONFIG_ARCH_RENESAS is not set
+# CONFIG_ARCH_RISCV is not set
+# CONFIG_ARCH_SIM is not set
+# CONFIG_ARCH_X86 is not set
+# CONFIG_ARCH_XTENSA is not set
+# CONFIG_ARCH_Z16 is not set
+# CONFIG_ARCH_Z80 is not set
+CONFIG_ARCH="arm"
+
+#
+# ARM Options
+#
+# CONFIG_ARCH_CHIP_A1X is not set
+# CONFIG_ARCH_CHIP_C5471 is not set
+# CONFIG_ARCH_CHIP_DM320 is not set
+# CONFIG_ARCH_CHIP_EFM32 is not set
+# CONFIG_ARCH_CHIP_IMX1 is not set
+# CONFIG_ARCH_CHIP_IMX6 is not set
+# CONFIG_ARCH_CHIP_KINETIS is not set
+# CONFIG_ARCH_CHIP_KL is not set
+# CONFIG_ARCH_CHIP_LM is not set
+# CONFIG_ARCH_CHIP_TIVA is not set
+# CONFIG_ARCH_CHIP_LPC11XX is not set
+# CONFIG_ARCH_CHIP_LPC17XX is not set
+# CONFIG_ARCH_CHIP_LPC214X is not set
+# CONFIG_ARCH_CHIP_LPC2378 is not set
+# CONFIG_ARCH_CHIP_LPC31XX is not set
+# CONFIG_ARCH_CHIP_LPC43XX is not set
+# CONFIG_ARCH_CHIP_MOXART is not set
+# CONFIG_ARCH_CHIP_NUC1XX is not set
+# CONFIG_ARCH_CHIP_SAMA5 is not set
+# CONFIG_ARCH_CHIP_SAMD is not set
+# CONFIG_ARCH_CHIP_SAML is not set
+# CONFIG_ARCH_CHIP_SAM34 is not set
+# CONFIG_ARCH_CHIP_SAMV7 is not set
+CONFIG_ARCH_CHIP_STM32=y
+# CONFIG_ARCH_CHIP_STM32F7 is not set
+# CONFIG_ARCH_CHIP_STM32L4 is not set
+# CONFIG_ARCH_CHIP_STR71X is not set
+# CONFIG_ARCH_CHIP_TMS570 is not set
+# CONFIG_ARCH_CHIP_XMC4 is not set
+# CONFIG_ARCH_ARM7TDMI is not set
+# CONFIG_ARCH_ARM926EJS is not set
+# CONFIG_ARCH_ARM920T is not set
+# CONFIG_ARCH_CORTEXM0 is not set
+# CONFIG_ARCH_CORTEXM23 is not set
+# CONFIG_ARCH_CORTEXM3 is not set
+# CONFIG_ARCH_CORTEXM33 is not set
+CONFIG_ARCH_CORTEXM4=y
+# CONFIG_ARCH_CORTEXM7 is not set
+# CONFIG_ARCH_CORTEXA5 is not set
+# CONFIG_ARCH_CORTEXA8 is not set
+# CONFIG_ARCH_CORTEXA9 is not set
+# CONFIG_ARCH_CORTEXR4 is not set
+# CONFIG_ARCH_CORTEXR4F is not set
+# CONFIG_ARCH_CORTEXR5 is not set
+# CONFIG_ARCH_CORTEX5F is not set
+# CONFIG_ARCH_CORTEXR7 is not set
+# CONFIG_ARCH_CORTEXR7F is not set
+CONFIG_ARCH_FAMILY="armv7-m"
+CONFIG_ARCH_CHIP="stm32"
+# CONFIG_ARM_TOOLCHAIN_IAR is not set
+CONFIG_ARM_TOOLCHAIN_GNU=y
+# CONFIG_ARMV7M_USEBASEPRI is not set
+CONFIG_ARCH_HAVE_CMNVECTOR=y
+# CONFIG_ARMV7M_CMNVECTOR is not set
+# CONFIG_ARMV7M_LAZYFPU is not set
+CONFIG_ARCH_HAVE_FPU=y
+# CONFIG_ARCH_HAVE_DPFPU is not set
+CONFIG_ARCH_FPU=y
+# CONFIG_ARCH_HAVE_TRUSTZONE is not set
+CONFIG_ARM_HAVE_MPU_UNIFIED=y
+# CONFIG_ARM_MPU is not set
+
+#
+# ARMV7M Configuration Options
+#
+# CONFIG_ARMV7M_HAVE_ICACHE is not set
+# CONFIG_ARMV7M_HAVE_DCACHE is not set
+# CONFIG_ARMV7M_HAVE_ITCM is not set
+# CONFIG_ARMV7M_HAVE_DTCM is not set
+# CONFIG_ARMV7M_TOOLCHAIN_IARL is not set
+# CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT is not set
+# CONFIG_ARMV7M_TOOLCHAIN_CODEREDL is not set
+# CONFIG_ARMV7M_TOOLCHAIN_CODESOURCERYL is not set
+CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIL=y
+CONFIG_ARMV7M_HAVE_STACKCHECK=y
+# CONFIG_ARMV7M_STACKCHECK is not set
+# CONFIG_ARMV7M_ITMSYSLOG is not set
+# CONFIG_SERIAL_TERMIOS is not set
+
+#
+# STM32 Configuration Options
+#
+# CONFIG_ARCH_CHIP_STM32L151C6 is not set
+# CONFIG_ARCH_CHIP_STM32L151C8 is not set
+# CONFIG_ARCH_CHIP_STM32L151CB is not set
+# CONFIG_ARCH_CHIP_STM32L151R6 is not set
+# CONFIG_ARCH_CHIP_STM32L151R8 is not set
+# CONFIG_ARCH_CHIP_STM32L151RB is not set
+# CONFIG_ARCH_CHIP_STM32L151V6 is not set
+# CONFIG_ARCH_CHIP_STM32L151V8 is not set
+# CONFIG_ARCH_CHIP_STM32L151VB is not set
+# CONFIG_ARCH_CHIP_STM32L152C6 is not set
+# CONFIG_ARCH_CHIP_STM32L152C8 is not set
+# CONFIG_ARCH_CHIP_STM32L152CB is not set
+# CONFIG_ARCH_CHIP_STM32L152R6 is not set
+# CONFIG_ARCH_CHIP_STM32L152R8 is not set
+# CONFIG_ARCH_CHIP_STM32L152RB is not set
+# CONFIG_ARCH_CHIP_STM32L152V6 is not set
+# CONFIG_ARCH_CHIP_STM32L152V8 is not set
+# CONFIG_ARCH_CHIP_STM32L152VB is not set
+# CONFIG_ARCH_CHIP_STM32L162ZD is not set
+# CONFIG_ARCH_CHIP_STM32L162VE is not set
+# CONFIG_ARCH_CHIP_STM32F100C8 is not set
+# CONFIG_ARCH_CHIP_STM32F100CB is not set
+# CONFIG_ARCH_CHIP_STM32F100R8 is not set
+# CONFIG_ARCH_CHIP_STM32F100RB is not set
+# CONFIG_ARCH_CHIP_STM32F100RC is not set
+# CONFIG_ARCH_CHIP_STM32F100RD is not set
+# CONFIG_ARCH_CHIP_STM32F100RE is not set
+# CONFIG_ARCH_CHIP_STM32F100V8 is not set
+# CONFIG_ARCH_CHIP_STM32F100VB is not set
+# CONFIG_ARCH_CHIP_STM32F100VC is not set
+# CONFIG_ARCH_CHIP_STM32F100VD is not set
+# CONFIG_ARCH_CHIP_STM32F100VE is not set
+# CONFIG_ARCH_CHIP_STM32F102CB is not set
+# CONFIG_ARCH_CHIP_STM32F103T8 is not set
+# CONFIG_ARCH_CHIP_STM32F103TB is not set
+# CONFIG_ARCH_CHIP_STM32F103C4 is not set
+# CONFIG_ARCH_CHIP_STM32F103C8 is not set
+# CONFIG_ARCH_CHIP_STM32F103CB is not set
+# CONFIG_ARCH_CHIP_STM32F103R8 is not set
+# CONFIG_ARCH_CHIP_STM32F103RB is not set
+# CONFIG_ARCH_CHIP_STM32F103RC is not set
+# CONFIG_ARCH_CHIP_STM32F103RD is not set
+# CONFIG_ARCH_CHIP_STM32F103RE is not set
+# CONFIG_ARCH_CHIP_STM32F103RG is not set
+# CONFIG_ARCH_CHIP_STM32F103V8 is not set
+# CONFIG_ARCH_CHIP_STM32F103VB is not set
+# CONFIG_ARCH_CHIP_STM32F103VC is not set
+# CONFIG_ARCH_CHIP_STM32F103VE is not set
+# CONFIG_ARCH_CHIP_STM32F103ZE is not set
+# CONFIG_ARCH_CHIP_STM32F105VB is not set
+# CONFIG_ARCH_CHIP_STM32F105RB is not set
+# CONFIG_ARCH_CHIP_STM32F107VC is not set
+# CONFIG_ARCH_CHIP_STM32F205RG is not set
+# CONFIG_ARCH_CHIP_STM32F207IG is not set
+# CONFIG_ARCH_CHIP_STM32F207ZE is not set
+# CONFIG_ARCH_CHIP_STM32F302K6 is not set
+# CONFIG_ARCH_CHIP_STM32F302K8 is not set
+# CONFIG_ARCH_CHIP_STM32F302CB is not set
+# CONFIG_ARCH_CHIP_STM32F302CC is not set
+# CONFIG_ARCH_CHIP_STM32F302RB is not set
+# CONFIG_ARCH_CHIP_STM32F302RC is not set
+# CONFIG_ARCH_CHIP_STM32F302VB is not set
+# CONFIG_ARCH_CHIP_STM32F302VC is not set
+# CONFIG_ARCH_CHIP_STM32F303K6 is not set
+# CONFIG_ARCH_CHIP_STM32F303K8 is not set
+# CONFIG_ARCH_CHIP_STM32F303C6 is not set
+# CONFIG_ARCH_CHIP_STM32F303C8 is not set
+# CONFIG_ARCH_CHIP_STM32F303CB is not set
+# CONFIG_ARCH_CHIP_STM32F303CC is not set
+# CONFIG_ARCH_CHIP_STM32F303RB is not set
+# CONFIG_ARCH_CHIP_STM32F303RC is not set
+# CONFIG_ARCH_CHIP_STM32F303RD is not set
+# CONFIG_ARCH_CHIP_STM32F303RE is not set
+# CONFIG_ARCH_CHIP_STM32F303VB is not set
+# CONFIG_ARCH_CHIP_STM32F303VC is not set
+# CONFIG_ARCH_CHIP_STM32F334K4 is not set
+# CONFIG_ARCH_CHIP_STM32F334K6 is not set
+# CONFIG_ARCH_CHIP_STM32F334K8 is not set
+# CONFIG_ARCH_CHIP_STM32F334C4 is not set
+# CONFIG_ARCH_CHIP_STM32F334C6 is not set
+# CONFIG_ARCH_CHIP_STM32F334C8 is not set
+# CONFIG_ARCH_CHIP_STM32F334R4 is not set
+# CONFIG_ARCH_CHIP_STM32F334R6 is not set
+# CONFIG_ARCH_CHIP_STM32F334R8 is not set
+# CONFIG_ARCH_CHIP_STM32F372C8 is not set
+# CONFIG_ARCH_CHIP_STM32F372R8 is not set
+# CONFIG_ARCH_CHIP_STM32F372V8 is not set
+# CONFIG_ARCH_CHIP_STM32F372CB is not set
+# CONFIG_ARCH_CHIP_STM32F372RB is not set
+# CONFIG_ARCH_CHIP_STM32F372VB is not set
+# CONFIG_ARCH_CHIP_STM32F372CC is not set
+# CONFIG_ARCH_CHIP_STM32F372RC is not set
+# CONFIG_ARCH_CHIP_STM32F372VC is not set
+# CONFIG_ARCH_CHIP_STM32F373C8 is not set
+# CONFIG_ARCH_CHIP_STM32F373R8 is not set
+# CONFIG_ARCH_CHIP_STM32F373V8 is not set
+# CONFIG_ARCH_CHIP_STM32F373CB is not set
+# CONFIG_ARCH_CHIP_STM32F373RB is not set
+# CONFIG_ARCH_CHIP_STM32F373VB is not set
+# CONFIG_ARCH_CHIP_STM32F373CC is not set
+# CONFIG_ARCH_CHIP_STM32F373RC is not set
+# CONFIG_ARCH_CHIP_STM32F373VC is not set
+# CONFIG_ARCH_CHIP_STM32F401RE is not set
+# CONFIG_ARCH_CHIP_STM32F411RE is not set
+# CONFIG_ARCH_CHIP_STM32F411VE is not set
+# CONFIG_ARCH_CHIP_STM32F405RG is not set
+# CONFIG_ARCH_CHIP_STM32F405VG is not set
+# CONFIG_ARCH_CHIP_STM32F405ZG is not set
+# CONFIG_ARCH_CHIP_STM32F407VE is not set
+CONFIG_ARCH_CHIP_STM32F407VG=y
+# CONFIG_ARCH_CHIP_STM32F407ZE is not set
+# CONFIG_ARCH_CHIP_STM32F407ZG is not set
+# CONFIG_ARCH_CHIP_STM32F407IE is not set
+# CONFIG_ARCH_CHIP_STM32F407IG is not set
+# CONFIG_ARCH_CHIP_STM32F427V is not set
+# CONFIG_ARCH_CHIP_STM32F427Z is not set
+# CONFIG_ARCH_CHIP_STM32F427I is not set
+# CONFIG_ARCH_CHIP_STM32F429V is not set
+# CONFIG_ARCH_CHIP_STM32F429Z is not set
+# CONFIG_ARCH_CHIP_STM32F429I is not set
+# CONFIG_ARCH_CHIP_STM32F429B is not set
+# CONFIG_ARCH_CHIP_STM32F429N is not set
+# CONFIG_ARCH_CHIP_STM32F446M is not set
+# CONFIG_ARCH_CHIP_STM32F446R is not set
+# CONFIG_ARCH_CHIP_STM32F446V is not set
+# CONFIG_ARCH_CHIP_STM32F446Z is not set
+# CONFIG_ARCH_CHIP_STM32F469A is not set
+# CONFIG_ARCH_CHIP_STM32F469I is not set
+# CONFIG_ARCH_CHIP_STM32F469B is not set
+# CONFIG_ARCH_CHIP_STM32F469N is not set
+CONFIG_STM32_FLASH_CONFIG_DEFAULT=y
+# CONFIG_STM32_FLASH_CONFIG_4 is not set
+# CONFIG_STM32_FLASH_CONFIG_6 is not set
+# CONFIG_STM32_FLASH_CONFIG_8 is not set
+# CONFIG_STM32_FLASH_CONFIG_B is not set
+# CONFIG_STM32_FLASH_CONFIG_C is not set
+# CONFIG_STM32_FLASH_CONFIG_D is not set
+# CONFIG_STM32_FLASH_CONFIG_E is not set
+# CONFIG_STM32_FLASH_CONFIG_F is not set
+# CONFIG_STM32_FLASH_CONFIG_G is not set
+# CONFIG_STM32_FLASH_CONFIG_I is not set
+# CONFIG_STM32_STM32L15XX is not set
+# CONFIG_STM32_ENERGYLITE is not set
+# CONFIG_STM32_STM32F10XX is not set
+# CONFIG_STM32_VALUELINE is not set
+# CONFIG_STM32_CONNECTIVITYLINE is not set
+# CONFIG_STM32_PERFORMANCELINE is not set
+# CONFIG_STM32_USBACCESSLINE is not set
+# CONFIG_STM32_HIGHDENSITY is not set
+# CONFIG_STM32_MEDIUMDENSITY is not set
+# CONFIG_STM32_LOWDENSITY is not set
+# CONFIG_STM32_STM32F20XX is not set
+# CONFIG_STM32_STM32F205 is not set
+# CONFIG_STM32_STM32F207 is not set
+# CONFIG_STM32_STM32F30XX is not set
+# CONFIG_STM32_STM32F302 is not set
+# CONFIG_STM32_STM32F303 is not set
+# CONFIG_STM32_STM32F33XX is not set
+# CONFIG_STM32_STM32F37XX is not set
+CONFIG_STM32_STM32F40XX=y
+# CONFIG_STM32_STM32F401 is not set
+# CONFIG_STM32_STM32F411 is not set
+# CONFIG_STM32_STM32F405 is not set
+CONFIG_STM32_STM32F407=y
+# CONFIG_STM32_STM32F427 is not set
+# CONFIG_STM32_STM32F429 is not set
+# CONFIG_STM32_STM32F446 is not set
+# CONFIG_STM32_STM32F469 is not set
+# CONFIG_STM32_DFU is not set
+
+#
+# STM32 Peripheral Support
+#
+CONFIG_STM32_HAVE_CCM=y
+# CONFIG_STM32_HAVE_USBDEV is not set
+CONFIG_STM32_HAVE_OTGFS=y
+CONFIG_STM32_HAVE_FSMC=y
+# CONFIG_STM32_HAVE_HRTIM1 is not set
+# CONFIG_STM32_HAVE_LTDC is not set
+CONFIG_STM32_HAVE_USART3=y
+CONFIG_STM32_HAVE_UART4=y
+CONFIG_STM32_HAVE_UART5=y
+CONFIG_STM32_HAVE_USART6=y
+# CONFIG_STM32_HAVE_UART7 is not set
+# CONFIG_STM32_HAVE_UART8 is not set
+CONFIG_STM32_HAVE_TIM1=y
+CONFIG_STM32_HAVE_TIM2=y
+CONFIG_STM32_HAVE_TIM3=y
+CONFIG_STM32_HAVE_TIM4=y
+CONFIG_STM32_HAVE_TIM5=y
+CONFIG_STM32_HAVE_TIM6=y
+CONFIG_STM32_HAVE_TIM7=y
+CONFIG_STM32_HAVE_TIM8=y
+CONFIG_STM32_HAVE_TIM9=y
+CONFIG_STM32_HAVE_TIM10=y
+CONFIG_STM32_HAVE_TIM11=y
+CONFIG_STM32_HAVE_TIM12=y
+CONFIG_STM32_HAVE_TIM13=y
+CONFIG_STM32_HAVE_TIM14=y
+# CONFIG_STM32_HAVE_TIM15 is not set
+# CONFIG_STM32_HAVE_TIM16 is not set
+# CONFIG_STM32_HAVE_TIM17 is not set
+CONFIG_STM32_HAVE_ADC2=y
+CONFIG_STM32_HAVE_ADC3=y
+# CONFIG_STM32_HAVE_ADC4 is not set
+# CONFIG_STM32_HAVE_ADC1_DMA is not set
+# CONFIG_STM32_HAVE_ADC2_DMA is not set
+# CONFIG_STM32_HAVE_ADC3_DMA is not set
+# CONFIG_STM32_HAVE_ADC4_DMA is not set
+# CONFIG_STM32_HAVE_SDADC1 is not set
+# CONFIG_STM32_HAVE_SDADC2 is not set
+# CONFIG_STM32_HAVE_SDADC3 is not set
+# CONFIG_STM32_HAVE_SDADC1_DMA is not set
+# CONFIG_STM32_HAVE_SDADC2_DMA is not set
+# CONFIG_STM32_HAVE_SDADC3_DMA is not set
+CONFIG_STM32_HAVE_CAN1=y
+CONFIG_STM32_HAVE_CAN2=y
+# CONFIG_STM32_HAVE_COMP2 is not set
+# CONFIG_STM32_HAVE_COMP4 is not set
+# CONFIG_STM32_HAVE_COMP6 is not set
+CONFIG_STM32_HAVE_DAC1=y
+CONFIG_STM32_HAVE_DAC2=y
+CONFIG_STM32_HAVE_RNG=y
+CONFIG_STM32_HAVE_ETHMAC=y
+CONFIG_STM32_HAVE_I2C2=y
+CONFIG_STM32_HAVE_I2C3=y
+CONFIG_STM32_HAVE_SPI2=y
+CONFIG_STM32_HAVE_SPI3=y
+# CONFIG_STM32_HAVE_SPI4 is not set
+# CONFIG_STM32_HAVE_SPI5 is not set
+# CONFIG_STM32_HAVE_SPI6 is not set
+# CONFIG_STM32_HAVE_SAIPLL is not set
+# CONFIG_STM32_HAVE_I2SPLL is not set
+# CONFIG_STM32_HAVE_OPAMP is not set
+# CONFIG_STM32_ADC1 is not set
+# CONFIG_STM32_ADC2 is not set
+# CONFIG_STM32_ADC3 is not set
+# CONFIG_STM32_BKPSRAM is not set
+# CONFIG_STM32_CAN1 is not set
+# CONFIG_STM32_CAN2 is not set
+# CONFIG_STM32_CCMDATARAM is not set
+# CONFIG_STM32_CRC is not set
+# CONFIG_STM32_CRYP is not set
+# CONFIG_STM32_DMA1 is not set
+# CONFIG_STM32_DMA2 is not set
+# CONFIG_STM32_DAC1 is not set
+# CONFIG_STM32_DAC2 is not set
+# CONFIG_STM32_DCMI is not set
+# CONFIG_STM32_ETHMAC is not set
+# CONFIG_STM32_FSMC is not set
+# CONFIG_STM32_HASH is not set
+# CONFIG_STM32_I2C1 is not set
+# CONFIG_STM32_I2C2 is not set
+# CONFIG_STM32_I2C3 is not set
+CONFIG_STM32_OTGFS=y
+# CONFIG_STM32_OTGHS is not set
+CONFIG_STM32_PWR=y
+# CONFIG_STM32_RNG is not set
+# CONFIG_STM32_SDIO is not set
+# CONFIG_STM32_SPI1 is not set
+# CONFIG_STM32_SPI2 is not set
+# CONFIG_STM32_SPI3 is not set
+CONFIG_STM32_SYSCFG=y
+# CONFIG_STM32_TIM1 is not set
+# CONFIG_STM32_TIM2 is not set
+# CONFIG_STM32_TIM3 is not set
+# CONFIG_STM32_TIM4 is not set
+# CONFIG_STM32_TIM5 is not set
+# CONFIG_STM32_TIM6 is not set
+# CONFIG_STM32_TIM7 is not set
+# CONFIG_STM32_TIM8 is not set
+# CONFIG_STM32_TIM9 is not set
+# CONFIG_STM32_TIM10 is not set
+# CONFIG_STM32_TIM11 is not set
+# CONFIG_STM32_TIM12 is not set
+# CONFIG_STM32_TIM13 is not set
+# CONFIG_STM32_TIM14 is not set
+# CONFIG_STM32_USART1 is not set
+# CONFIG_STM32_USART2 is not set
+CONFIG_STM32_USART3=y
+# CONFIG_STM32_UART4 is not set
+# CONFIG_STM32_UART5 is not set
+# CONFIG_STM32_USART6 is not set
+# CONFIG_STM32_IWDG is not set
+# CONFIG_STM32_WWDG is not set
+# CONFIG_STM32_NOEXT_VECTORS is not set
+
+#
+# Alternate Pin Mapping
+#
+# CONFIG_STM32_FLASH_PREFETCH is not set
+# CONFIG_STM32_FLASH_WORKAROUND_DATA_CACHE_CORRUPTION_ON_RWW is not set
+# CONFIG_STM32_JTAG_DISABLE is not set
+# CONFIG_STM32_JTAG_FULL_ENABLE is not set
+# CONFIG_STM32_JTAG_NOJNTRST_ENABLE is not set
+CONFIG_STM32_JTAG_SW_ENABLE=y
+CONFIG_STM32_DISABLE_IDLE_SLEEP_DURING_DEBUG=y
+# CONFIG_STM32_FORCEPOWER is not set
+# CONFIG_ARCH_BOARD_STM32_CUSTOM_CLOCKCONFIG is not set
+CONFIG_STM32_CCMEXCLUDE=y
+
+#
+# Timer Configuration
+#
+# CONFIG_STM32_ONESHOT is not set
+# CONFIG_STM32_FREERUN is not set
+# CONFIG_STM32_TIM1_CAP is not set
+# CONFIG_STM32_TIM2_CAP is not set
+# CONFIG_STM32_TIM3_CAP is not set
+# CONFIG_STM32_TIM4_CAP is not set
+# CONFIG_STM32_TIM5_CAP is not set
+# CONFIG_STM32_TIM8_CAP is not set
+# CONFIG_STM32_TIM9_CAP is not set
+# CONFIG_STM32_TIM10_CAP is not set
+# CONFIG_STM32_TIM11_CAP is not set
+# CONFIG_STM32_TIM12_CAP is not set
+# CONFIG_STM32_TIM13_CAP is not set
+# CONFIG_STM32_TIM14_CAP is not set
+CONFIG_STM32_USART=y
+CONFIG_STM32_SERIALDRIVER=y
+
+#
+# U[S]ART Configuration
+#
+
+#
+# U[S]ART Device Configuration
+#
+CONFIG_STM32_USART3_SERIALDRIVER=y
+# CONFIG_STM32_USART3_1WIREDRIVER is not set
+# CONFIG_USART3_RS485 is not set
+
+#
+# Serial Driver Configuration
+#
+# CONFIG_SERIAL_DISABLE_REORDERING is not set
+# CONFIG_STM32_FLOWCONTROL_BROKEN is not set
+# CONFIG_STM32_USART_BREAKS is not set
+# CONFIG_STM32_USART_SINGLEWIRE is not set
+# CONFIG_STM32_HAVE_RTC_COUNTER is not set
+# CONFIG_STM32_HAVE_RTC_SUBSECONDS is not set
+
+#
+# USB FS Host Configuration
+#
+
+#
+# USB HS Host Configuration
+#
+
+#
+# USB Host Debug Configuration
+#
+
+#
+# USB Device Configuration
+#
+
+#
+# Architecture Options
+#
+# CONFIG_ARCH_NOINTC is not set
+# CONFIG_ARCH_VECNOTIRQ is not set
+# CONFIG_ARCH_DMA is not set
+CONFIG_ARCH_HAVE_IRQPRIO=y
+# CONFIG_ARCH_L2CACHE is not set
+# CONFIG_ARCH_HAVE_COHERENT_DCACHE is not set
+# CONFIG_ARCH_HAVE_ADDRENV is not set
+# CONFIG_ARCH_NEED_ADDRENV_MAPPING is not set
+# CONFIG_ARCH_HAVE_MULTICPU is not set
+CONFIG_ARCH_HAVE_VFORK=y
+# CONFIG_ARCH_HAVE_MMU is not set
+CONFIG_ARCH_HAVE_MPU=y
+# CONFIG_ARCH_NAND_HWECC is not set
+# CONFIG_ARCH_HAVE_EXTCLK is not set
+# CONFIG_ARCH_HAVE_POWEROFF is not set
+CONFIG_ARCH_HAVE_RESET=y
+# CONFIG_ARCH_USE_MPU is not set
+# CONFIG_ARCH_IRQPRIO is not set
+CONFIG_ARCH_STACKDUMP=y
+# CONFIG_ENDIAN_BIG is not set
+# CONFIG_ARCH_IDLE_CUSTOM is not set
+# CONFIG_ARCH_HAVE_RAMFUNCS is not set
+CONFIG_ARCH_HAVE_RAMVECTORS=y
+# CONFIG_ARCH_RAMVECTORS is not set
+# CONFIG_ARCH_MINIMAL_VECTORTABLE is not set
+
+#
+# Board Settings
+#
+CONFIG_BOARD_LOOPSPERMSEC=16717
+# CONFIG_ARCH_CALIBRATION is not set
+
+#
+# Interrupt options
+#
+CONFIG_ARCH_HAVE_INTERRUPTSTACK=y
+CONFIG_ARCH_INTERRUPTSTACK=0
+CONFIG_ARCH_HAVE_HIPRI_INTERRUPT=y
+# CONFIG_ARCH_HIPRI_INTERRUPT is not set
+
+#
+# Boot options
+#
+# CONFIG_BOOT_RUNFROMEXTSRAM is not set
+CONFIG_BOOT_RUNFROMFLASH=y
+# CONFIG_BOOT_RUNFROMISRAM is not set
+# CONFIG_BOOT_RUNFROMSDRAM is not set
+# CONFIG_BOOT_COPYTORAM is not set
+
+#
+# Boot Memory Configuration
+#
+CONFIG_RAM_START=0x20000000
+CONFIG_RAM_SIZE=131072
+# CONFIG_ARCH_HAVE_SDRAM is not set
+
+#
+# Board Selection
+#
+CONFIG_ARCH_BOARD_CLICKER2_STM32=y
+# CONFIG_ARCH_BOARD_STM32F4_DISCOVERY is not set
+# CONFIG_ARCH_BOARD_MIKROE_STM32F4 is not set
+# CONFIG_ARCH_BOARD_CUSTOM is not set
+CONFIG_ARCH_BOARD="clicker2-stm32"
+
+#
+# Common Board Options
+#
+CONFIG_ARCH_HAVE_LEDS=y
+CONFIG_ARCH_LEDS=y
+CONFIG_ARCH_HAVE_BUTTONS=y
+CONFIG_ARCH_BUTTONS=y
+CONFIG_ARCH_HAVE_IRQBUTTONS=y
+CONFIG_ARCH_IRQBUTTONS=y
+
+#
+# Board-Specific Options
+#
+# CONFIG_CLICKER2_STM32_MB1_SPI is not set
+# CONFIG_CLICKER2_STM32_MB2_SPI is not set
+# CONFIG_BOARD_CRASHDUMP is not set
+CONFIG_LIB_BOARDCTL=y
+# CONFIG_BOARDCTL_RESET is not set
+# CONFIG_BOARDCTL_UNIQUEID is not set
+CONFIG_BOARDCTL_USBDEVCTRL=y
+# CONFIG_BOARDCTL_TSCTEST is not set
+# CONFIG_BOARDCTL_GRAPHICS is not set
+# CONFIG_BOARDCTL_IOCTL is not set
+
+#
+# RTOS Features
+#
+CONFIG_DISABLE_OS_API=y
+# CONFIG_DISABLE_POSIX_TIMERS is not set
+# CONFIG_DISABLE_PTHREAD is not set
+# CONFIG_DISABLE_SIGNALS is not set
+# CONFIG_DISABLE_MQUEUE is not set
+# CONFIG_DISABLE_ENVIRON is not set
+
+#
+# Clocks and Timers
+#
+CONFIG_ARCH_HAVE_TICKLESS=y
+# CONFIG_SCHED_TICKLESS is not set
+CONFIG_USEC_PER_TICK=10000
+# CONFIG_SYSTEM_TIME64 is not set
+# CONFIG_CLOCK_MONOTONIC is not set
+CONFIG_ARCH_HAVE_TIMEKEEPING=y
+# CONFIG_JULIAN_TIME is not set
+CONFIG_START_YEAR=2017
+CONFIG_START_MONTH=3
+CONFIG_START_DAY=25
+CONFIG_MAX_WDOGPARMS=2
+CONFIG_PREALLOC_WDOGS=16
+CONFIG_WDOG_INTRESERVE=4
+CONFIG_PREALLOC_TIMERS=4
+
+#
+# Tasks and Scheduling
+#
+# CONFIG_SPINLOCK is not set
+# CONFIG_INIT_NONE is not set
+CONFIG_INIT_ENTRYPOINT=y
+# CONFIG_INIT_FILEPATH is not set
+CONFIG_USER_ENTRYPOINT="nsh_main"
+CONFIG_RR_INTERVAL=200
+# CONFIG_SCHED_SPORADIC is not set
+CONFIG_TASK_NAME_SIZE=32
+CONFIG_MAX_TASKS=16
+# CONFIG_SCHED_HAVE_PARENT is not set
+CONFIG_SCHED_WAITPID=y
+
+#
+# Pthread Options
+#
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
+CONFIG_NPTHREAD_KEYS=4
+# CONFIG_PTHREAD_CLEANUP is not set
+# CONFIG_CANCELLATION_POINTS is not set
+
+#
+# Performance Monitoring
+#
+# CONFIG_SCHED_CPULOAD is not set
+# CONFIG_SCHED_INSTRUMENTATION is not set
+
+#
+# Files and I/O
+#
+# CONFIG_DEV_CONSOLE is not set
+# CONFIG_FDCLONE_DISABLE is not set
+# CONFIG_FDCLONE_STDIO is not set
+CONFIG_SDCLONE_DISABLE=y
+CONFIG_NFILE_DESCRIPTORS=8
+CONFIG_NFILE_STREAMS=8
+CONFIG_NAME_MAX=32
+# CONFIG_PRIORITY_INHERITANCE is not set
+
+#
+# RTOS hooks
+#
+CONFIG_BOARD_INITIALIZE=y
+# CONFIG_BOARD_INITTHREAD is not set
+# CONFIG_SCHED_STARTHOOK is not set
+# CONFIG_SCHED_ATEXIT is not set
+# CONFIG_SCHED_ONEXIT is not set
+# CONFIG_SIG_EVTHREAD is not set
+
+#
+# Signal Numbers
+#
+CONFIG_SIG_SIGUSR1=1
+CONFIG_SIG_SIGUSR2=2
+CONFIG_SIG_SIGALARM=3
+CONFIG_SIG_SIGCONDTIMEDOUT=16
+CONFIG_SIG_SIGWORK=17
+
+#
+# POSIX Message Queue Options
+#
+CONFIG_PREALLOC_MQ_MSGS=4
+CONFIG_MQ_MAXMSGSIZE=32
+# CONFIG_MODULE is not set
+
+#
+# Work queue support
+#
+CONFIG_SCHED_WORKQUEUE=y
+CONFIG_SCHED_HPWORK=y
+CONFIG_SCHED_HPWORKPRIORITY=192
+CONFIG_SCHED_HPWORKPERIOD=50000
+CONFIG_SCHED_HPWORKSTACKSIZE=2048
+# CONFIG_SCHED_LPWORK is not set
+
+#
+# Stack and heap information
+#
+CONFIG_IDLETHREAD_STACKSIZE=1024
+CONFIG_USERMAIN_STACKSIZE=2048
+CONFIG_PTHREAD_STACK_MIN=256
+CONFIG_PTHREAD_STACK_DEFAULT=2048
+# CONFIG_LIB_SYSCALL is not set
+
+#
+# Device Drivers
+#
+CONFIG_DISABLE_POLL=y
+CONFIG_DEV_NULL=y
+# CONFIG_DEV_ZERO is not set
+# CONFIG_DEV_URANDOM is not set
+# CONFIG_DEV_LOOP is not set
+
+#
+# Buffering
+#
+# CONFIG_DRVR_WRITEBUFFER is not set
+# CONFIG_DRVR_READAHEAD is not set
+# CONFIG_RAMDISK is not set
+# CONFIG_CAN is not set
+# CONFIG_ARCH_HAVE_PWM_PULSECOUNT is not set
+# CONFIG_ARCH_HAVE_PWM_MULTICHAN is not set
+# CONFIG_PWM is not set
+CONFIG_ARCH_HAVE_I2CRESET=y
+# CONFIG_I2C is not set
+# CONFIG_ARCH_HAVE_SPI_CRCGENERATION is not set
+# CONFIG_ARCH_HAVE_SPI_CS_CONTROL is not set
+CONFIG_ARCH_HAVE_SPI_BITORDER=y
+# CONFIG_SPI is not set
+# CONFIG_I2S is not set
+
+#
+# Timer Driver Support
+#
+# CONFIG_TIMER is not set
+# CONFIG_ONESHOT is not set
+# CONFIG_RTC is not set
+# CONFIG_WATCHDOG is not set
+# CONFIG_ANALOG is not set
+# CONFIG_AUDIO_DEVICES is not set
+# CONFIG_VIDEO_DEVICES is not set
+# CONFIG_BCH is not set
+# CONFIG_INPUT is not set
+
+#
+# IO Expander/GPIO Support
+#
+# CONFIG_IOEXPANDER is not set
+# CONFIG_DEV_GPIO is not set
+
+#
+# LCD Driver Support
+#
+# CONFIG_LCD is not set
+# CONFIG_SLCD is not set
+
+#
+# LED Support
+#
+# CONFIG_USERLED is not set
+# CONFIG_RGBLED is not set
+# CONFIG_PCA9635PW is not set
+# CONFIG_NCP5623C is not set
+# CONFIG_MMCSD is not set
+# CONFIG_MODEM is not set
+# CONFIG_MTD is not set
+# CONFIG_EEPROM is not set
+# CONFIG_PIPES is not set
+# CONFIG_PM is not set
+# CONFIG_POWER is not set
+# CONFIG_SENSORS is not set
+CONFIG_SERIAL=y
+CONFIG_SERIAL_REMOVABLE=y
+# CONFIG_SERIAL_CONSOLE is not set
+# CONFIG_16550_UART is not set
+# CONFIG_UART_SERIALDRIVER is not set
+# CONFIG_UART0_SERIALDRIVER is not set
+# CONFIG_UART1_SERIALDRIVER is not set
+# CONFIG_UART2_SERIALDRIVER is not set
+# CONFIG_UART3_SERIALDRIVER is not set
+# CONFIG_UART4_SERIALDRIVER is not set
+# CONFIG_UART5_SERIALDRIVER is not set
+# CONFIG_UART6_SERIALDRIVER is not set
+# CONFIG_UART7_SERIALDRIVER is not set
+# CONFIG_UART8_SERIALDRIVER is not set
+# CONFIG_SCI0_SERIALDRIVER is not set
+# CONFIG_SCI1_SERIALDRIVER is not set
+# CONFIG_USART0_SERIALDRIVER is not set
+# CONFIG_USART1_SERIALDRIVER is not set
+# CONFIG_USART2_SERIALDRIVER is not set
+CONFIG_USART3_SERIALDRIVER=y
+# CONFIG_USART4_SERIALDRIVER is not set
+# CONFIG_USART5_SERIALDRIVER is not set
+# CONFIG_USART6_SERIALDRIVER is not set
+# CONFIG_USART7_SERIALDRIVER is not set
+# CONFIG_USART8_SERIALDRIVER is not set
+# CONFIG_OTHER_UART_SERIALDRIVER is not set
+CONFIG_MCU_SERIAL=y
+CONFIG_STANDARD_SERIAL=y
+# CONFIG_SERIAL_IFLOWCONTROL is not set
+# CONFIG_SERIAL_OFLOWCONTROL is not set
+# CONFIG_SERIAL_DMA is not set
+CONFIG_ARCH_HAVE_SERIAL_TERMIOS=y
+# CONFIG_USART3_SERIAL_CONSOLE is not set
+# CONFIG_OTHER_SERIAL_CONSOLE is not set
+CONFIG_NO_SERIAL_CONSOLE=y
+
+#
+# USART3 Configuration
+#
+CONFIG_USART3_RXBUFSIZE=256
+CONFIG_USART3_TXBUFSIZE=256
+CONFIG_USART3_BAUD=115200
+CONFIG_USART3_BITS=8
+CONFIG_USART3_PARITY=0
+CONFIG_USART3_2STOP=0
+# CONFIG_USART3_IFLOWCONTROL is not set
+# CONFIG_USART3_OFLOWCONTROL is not set
+# CONFIG_USART3_DMA is not set
+# CONFIG_PSEUDOTERM is not set
+CONFIG_USBDEV=y
+
+#
+# USB Device Controller Driver Options
+#
+# CONFIG_USBDEV_ISOCHRONOUS is not set
+# CONFIG_USBDEV_DUALSPEED is not set
+CONFIG_USBDEV_SELFPOWERED=y
+# CONFIG_USBDEV_BUSPOWERED is not set
+CONFIG_USBDEV_MAXPOWER=100
+# CONFIG_USBDEV_DMA is not set
+# CONFIG_ARCH_USBDEV_STALLQUEUE is not set
+# CONFIG_USBDEV_TRACE is not set
+
+#
+# USB Device Class Driver Options
+#
+# CONFIG_USBDEV_COMPOSITE is not set
+# CONFIG_PL2303 is not set
+CONFIG_CDCACM=y
+CONFIG_CDCACM_CONSOLE=y
+CONFIG_CDCACM_EP0MAXPACKET=64
+CONFIG_CDCACM_EPINTIN=1
+CONFIG_CDCACM_EPINTIN_FSSIZE=64
+CONFIG_CDCACM_EPINTIN_HSSIZE=64
+CONFIG_CDCACM_EPBULKOUT=3
+CONFIG_CDCACM_EPBULKOUT_FSSIZE=64
+CONFIG_CDCACM_EPBULKOUT_HSSIZE=512
+CONFIG_CDCACM_EPBULKIN=2
+CONFIG_CDCACM_EPBULKIN_FSSIZE=64
+CONFIG_CDCACM_EPBULKIN_HSSIZE=512
+CONFIG_CDCACM_NRDREQS=4
+CONFIG_CDCACM_NWRREQS=4
+CONFIG_CDCACM_BULKIN_REQLEN=96
+CONFIG_CDCACM_RXBUFSIZE=256
+CONFIG_CDCACM_TXBUFSIZE=256
+CONFIG_CDCACM_VENDORID=0x0525
+CONFIG_CDCACM_PRODUCTID=0xa4a7
+CONFIG_CDCACM_VENDORSTR="NuttX"
+CONFIG_CDCACM_PRODUCTSTR="CDC/ACM Serial"
+# CONFIG_USBMSC is not set
+# CONFIG_USBHOST is not set
+# CONFIG_HAVE_USBTRACE is not set
+# CONFIG_DRIVERS_WIRELESS is not set
+# CONFIG_DRIVERS_CONTACTLESS is not set
+
+#
+# System Logging
+#
+# CONFIG_ARCH_SYSLOG is not set
+# CONFIG_RAMLOG is not set
+CONFIG_SYSLOG_INTBUFFER=y
+CONFIG_SYSLOG_INTBUFSIZE=396
+# CONFIG_SYSLOG_TIMESTAMP is not set
+# CONFIG_SYSLOG_SERIAL_CONSOLE is not set
+CONFIG_SYSLOG_CHAR=y
+# CONFIG_SYSLOG_NONE is not set
+# CONFIG_SYSLOG_FILE is not set
+CONFIG_SYSLOG_CHAR_CRLF=y
+CONFIG_SYSLOG_DEVPATH="/dev/ttyS0"
+# CONFIG_SYSLOG_CHARDEV is not set
+
+#
+# Networking Support
+#
+# CONFIG_ARCH_HAVE_NET is not set
+# CONFIG_ARCH_HAVE_PHY is not set
+# CONFIG_NET is not set
+
+#
+# Crypto API
+#
+# CONFIG_CRYPTO is not set
+
+#
+# File Systems
+#
+
+#
+# File system configuration
+#
+# CONFIG_DISABLE_MOUNTPOINT is not set
+# CONFIG_FS_AUTOMOUNTER is not set
+# CONFIG_DISABLE_PSEUDOFS_OPERATIONS is not set
+# CONFIG_PSEUDOFS_SOFTLINKS is not set
+CONFIG_FS_READABLE=y
+CONFIG_FS_WRITABLE=y
+# CONFIG_FS_NAMED_SEMAPHORES is not set
+CONFIG_FS_MQUEUE_MPATH="/var/mqueue"
+# CONFIG_FS_RAMMAP is not set
+CONFIG_FS_FAT=y
+CONFIG_FAT_LCNAMES=y
+CONFIG_FAT_LFN=y
+CONFIG_FAT_MAXFNAME=32
+# CONFIG_FS_FATTIME is not set
+# CONFIG_FAT_FORCE_INDIRECT is not set
+# CONFIG_FAT_DMAMEMORY is not set
+# CONFIG_FAT_DIRECT_RETRY is not set
+# CONFIG_FS_NXFFS is not set
+# CONFIG_FS_ROMFS is not set
+# CONFIG_FS_TMPFS is not set
+# CONFIG_FS_SMARTFS is not set
+# CONFIG_FS_BINFS is not set
+CONFIG_FS_PROCFS=y
+# CONFIG_FS_PROCFS_REGISTER is not set
+
+#
+# Exclude individual procfs entries
+#
+# CONFIG_FS_PROCFS_EXCLUDE_PROCESS is not set
+# CONFIG_FS_PROCFS_EXCLUDE_UPTIME is not set
+# CONFIG_FS_PROCFS_EXCLUDE_MOUNTS is not set
+# CONFIG_FS_UNIONFS is not set
+
+#
+# Graphics Support
+#
+# CONFIG_NX is not set
+
+#
+# Memory Management
+#
+# CONFIG_MM_SMALL is not set
+CONFIG_MM_REGIONS=1
+# CONFIG_ARCH_HAVE_HEAP2 is not set
+# CONFIG_GRAN is not set
+
+#
+# Audio Support
+#
+# CONFIG_AUDIO is not set
+
+#
+# Wireless Support
+#
+
+#
+# Binary Loader
+#
+# CONFIG_BINFMT_DISABLE is not set
+# CONFIG_BINFMT_EXEPATH is not set
+# CONFIG_NXFLAT is not set
+# CONFIG_ELF is not set
+CONFIG_BUILTIN=y
+# CONFIG_PIC is not set
+# CONFIG_SYMTAB_ORDEREDBYNAME is not set
+
+#
+# Library Routines
+#
+
+#
+# Standard C Library Options
+#
+
+#
+# Standard C I/O
+#
+# CONFIG_STDIO_DISABLE_BUFFERING is not set
+CONFIG_STDIO_BUFFER_SIZE=64
+CONFIG_STDIO_LINEBUFFER=y
+CONFIG_NUNGET_CHARS=2
+# CONFIG_NOPRINTF_FIELDWIDTH is not set
+# CONFIG_LIBC_FLOATINGPOINT is not set
+CONFIG_LIBC_LONG_LONG=y
+# CONFIG_LIBC_SCANSET is not set
+# CONFIG_EOL_IS_CR is not set
+# CONFIG_EOL_IS_LF is not set
+# CONFIG_EOL_IS_BOTH_CRLF is not set
+CONFIG_EOL_IS_EITHER_CRLF=y
+# CONFIG_MEMCPY_VIK is not set
+# CONFIG_LIBM is not set
+
+#
+# Architecture-Specific Support
+#
+CONFIG_ARCH_LOWPUTC=y
+# CONFIG_ARCH_ROMGETC is not set
+# CONFIG_LIBC_ARCH_MEMCPY is not set
+# CONFIG_LIBC_ARCH_MEMCMP is not set
+# CONFIG_LIBC_ARCH_MEMMOVE is not set
+# CONFIG_LIBC_ARCH_MEMSET is not set
+# CONFIG_LIBC_ARCH_STRCHR is not set
+# CONFIG_LIBC_ARCH_STRCMP is not set
+# CONFIG_LIBC_ARCH_STRCPY is not set
+# CONFIG_LIBC_ARCH_STRNCPY is not set
+# CONFIG_LIBC_ARCH_STRLEN is not set
+# CONFIG_LIBC_ARCH_STRNLEN is not set
+# CONFIG_LIBC_ARCH_ELF is not set
+# CONFIG_ARMV7M_MEMCPY is not set
+
+#
+# stdlib Options
+#
+CONFIG_LIB_RAND_ORDER=1
+CONFIG_LIB_HOMEDIR="/"
+CONFIG_LIBC_TMPDIR="/tmp"
+CONFIG_LIBC_MAX_TMPFILE=32
+
+#
+# Program Execution Options
+#
+# CONFIG_LIBC_EXECFUNCS is not set
+CONFIG_POSIX_SPAWN_PROXY_STACKSIZE=1024
+CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=2048
+
+#
+# errno Decode Support
+#
+# CONFIG_LIBC_STRERROR is not set
+# CONFIG_LIBC_PERROR_STDOUT is not set
+
+#
+# memcpy/memset Options
+#
+# CONFIG_MEMSET_OPTSPEED is not set
+# CONFIG_LIBC_DLLFCN is not set
+# CONFIG_LIBC_MODLIB is not set
+# CONFIG_LIBC_WCHAR is not set
+# CONFIG_LIBC_LOCALE is not set
+
+#
+# Time/Time Zone Support
+#
+# CONFIG_LIBC_LOCALTIME is not set
+# CONFIG_TIME_EXTENDED is not set
+CONFIG_ARCH_HAVE_TLS=y
+
+#
+# Thread Local Storage (TLS)
+#
+# CONFIG_TLS is not set
+
+#
+# Network-Related Options
+#
+# CONFIG_LIBC_IPv4_ADDRCONV is not set
+# CONFIG_LIBC_IPv6_ADDRCONV is not set
+# CONFIG_LIBC_NETDB is not set
+
+#
+# NETDB Support
+#
+# CONFIG_NETDB_HOSTFILE is not set
+# CONFIG_LIBC_IOCTL_VARIADIC is not set
+CONFIG_LIB_SENDFILE_BUFSIZE=512
+
+#
+# Non-standard Library Support
+#
+# CONFIG_LIB_CRC64_FAST is not set
+# CONFIG_LIB_KBDCODEC is not set
+# CONFIG_LIB_SLCDCODEC is not set
+# CONFIG_LIB_HEX2BIN is not set
+
+#
+# Basic CXX Support
+#
+# CONFIG_C99_BOOL8 is not set
+CONFIG_HAVE_CXX=y
+CONFIG_HAVE_CXXINITIALIZE=y
+# CONFIG_CXX_NEWLONG is not set
+
+#
+# LLVM C++ Library (libcxx)
+#
+# CONFIG_LIBCXX is not set
+
+#
+# uClibc++ Standard C++ Library
+#
+# CONFIG_UCLIBCXX is not set
+
+#
+# Application Configuration
+#
+
+#
+# Built-In Applications
+#
+CONFIG_BUILTIN_PROXY_STACKSIZE=1024
+
+#
+# CAN Utilities
+#
+
+#
+# Examples
+#
+# CONFIG_EXAMPLES_BUTTONS is not set
+# CONFIG_EXAMPLES_CCTYPE is not set
+# CONFIG_EXAMPLES_CHAT is not set
+# CONFIG_EXAMPLES_CONFIGDATA is not set
+# CONFIG_EXAMPLES_CXXTEST is not set
+# CONFIG_EXAMPLES_DHCPD is not set
+# CONFIG_EXAMPLES_ELF is not set
+# CONFIG_EXAMPLES_FSTEST is not set
+# CONFIG_EXAMPLES_FTPC is not set
+# CONFIG_EXAMPLES_FTPD is not set
+# CONFIG_EXAMPLES_HELLO is not set
+# CONFIG_EXAMPLES_HELLOXX is not set
+# CONFIG_EXAMPLES_HIDKBD is not set
+# CONFIG_EXAMPLES_IGMP is not set
+# CONFIG_EXAMPLES_JSON is not set
+# CONFIG_EXAMPLES_KEYPADTEST is not set
+# CONFIG_EXAMPLES_MEDIA is not set
+# CONFIG_EXAMPLES_MM is not set
+# CONFIG_EXAMPLES_MODBUS is not set
+# CONFIG_EXAMPLES_MOUNT is not set
+CONFIG_EXAMPLES_NSH=y
+CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
+# CONFIG_EXAMPLES_NULL is not set
+# CONFIG_EXAMPLES_NX is not set
+# CONFIG_EXAMPLES_NXFFS is not set
+# CONFIG_EXAMPLES_NXHELLO is not set
+# CONFIG_EXAMPLES_NXIMAGE is not set
+# CONFIG_EXAMPLES_NXLINES is not set
+# CONFIG_EXAMPLES_NXTERM is not set
+# CONFIG_EXAMPLES_NXTEXT is not set
+# CONFIG_EXAMPLES_OSTEST is not set
+# CONFIG_EXAMPLES_PCA9635 is not set
+# CONFIG_EXAMPLES_POSIXSPAWN is not set
+# CONFIG_EXAMPLES_PPPD is not set
+# CONFIG_EXAMPLES_RFID_READUID is not set
+# CONFIG_EXAMPLES_RGBLED is not set
+# CONFIG_EXAMPLES_SENDMAIL is not set
+# CONFIG_EXAMPLES_SERIALBLASTER is not set
+# CONFIG_EXAMPLES_SERIALRX is not set
+# CONFIG_EXAMPLES_SERLOOP is not set
+# CONFIG_EXAMPLES_SLCD is not set
+# CONFIG_EXAMPLES_SMART is not set
+# CONFIG_EXAMPLES_SMART_TEST is not set
+# CONFIG_EXAMPLES_SMP is not set
+# CONFIG_EXAMPLES_STAT is not set
+# CONFIG_EXAMPLES_TCPECHO is not set
+# CONFIG_EXAMPLES_TELNETD is not set
+# CONFIG_EXAMPLES_TIFF is not set
+# CONFIG_EXAMPLES_TOUCHSCREEN is not set
+# CONFIG_EXAMPLES_USBSERIAL is not set
+# CONFIG_EXAMPLES_WATCHDOG is not set
+# CONFIG_EXAMPLES_WEBSERVER is not set
+# CONFIG_EXAMPLES_XBC_TEST is not set
+
+#
+# File System Utilities
+#
+# CONFIG_FSUTILS_INIFILE is not set
+# CONFIG_FSUTILS_PASSWD is not set
+
+#
+# GPS Utilities
+#
+# CONFIG_GPSUTILS_MINMEA_LIB is not set
+
+#
+# Graphics Support
+#
+# CONFIG_TIFF is not set
+# CONFIG_GRAPHICS_TRAVELER is not set
+
+#
+# Interpreters
+#
+# CONFIG_INTERPRETERS_BAS is not set
+# CONFIG_INTERPRETERS_FICL is not set
+# CONFIG_INTERPRETERS_MICROPYTHON is not set
+# CONFIG_INTERPRETERS_MINIBASIC is not set
+# CONFIG_INTERPRETERS_PCODE is not set
+
+#
+# FreeModBus
+#
+# CONFIG_MODBUS is not set
+
+#
+# Network Utilities
+#
+# CONFIG_NETUTILS_CODECS is not set
+# CONFIG_NETUTILS_ESP8266 is not set
+# CONFIG_NETUTILS_FTPC is not set
+# CONFIG_NETUTILS_JSON is not set
+# CONFIG_NETUTILS_SMTP is not set
+
+#
+# NSH Library
+#
+CONFIG_NSH_LIBRARY=y
+# CONFIG_NSH_MOTD is not set
+
+#
+# Command Line Configuration
+#
+CONFIG_NSH_READLINE=y
+# CONFIG_NSH_CLE is not set
+CONFIG_NSH_LINELEN=64
+# CONFIG_NSH_DISABLE_SEMICOLON is not set
+CONFIG_NSH_CMDPARMS=y
+CONFIG_NSH_MAXARGUMENTS=6
+CONFIG_NSH_ARGCAT=y
+CONFIG_NSH_NESTDEPTH=3
+# CONFIG_NSH_DISABLEBG is not set
+CONFIG_NSH_BUILTIN_APPS=y
+
+#
+# Disable Individual commands
+#
+# CONFIG_NSH_DISABLE_ADDROUTE is not set
+# CONFIG_NSH_DISABLE_BASENAME is not set
+# CONFIG_NSH_DISABLE_CAT is not set
+# CONFIG_NSH_DISABLE_CD is not set
+# CONFIG_NSH_DISABLE_CP is not set
+# CONFIG_NSH_DISABLE_CMP is not set
+CONFIG_NSH_DISABLE_DATE=y
+# CONFIG_NSH_DISABLE_DD is not set
+# CONFIG_NSH_DISABLE_DF is not set
+# CONFIG_NSH_DISABLE_DELROUTE is not set
+# CONFIG_NSH_DISABLE_DIRNAME is not set
+# CONFIG_NSH_DISABLE_ECHO is not set
+# CONFIG_NSH_DISABLE_EXEC is not set
+# CONFIG_NSH_DISABLE_EXIT is not set
+# CONFIG_NSH_DISABLE_FREE is not set
+CONFIG_NSH_DISABLE_GET=y
+# CONFIG_NSH_DISABLE_HELP is not set
+# CONFIG_NSH_DISABLE_HEXDUMP is not set
+# CONFIG_NSH_DISABLE_IFCONFIG is not set
+CONFIG_NSH_DISABLE_IFUPDOWN=y
+# CONFIG_NSH_DISABLE_KILL is not set
+# CONFIG_NSH_DISABLE_LOSETUP is not set
+CONFIG_NSH_DISABLE_LOSMART=y
+# CONFIG_NSH_DISABLE_LS is not set
+# CONFIG_NSH_DISABLE_MB is not set
+# CONFIG_NSH_DISABLE_MKDIR is not set
+# CONFIG_NSH_DISABLE_MKFATFS is not set
+# CONFIG_NSH_DISABLE_MKRD is not set
+# CONFIG_NSH_DISABLE_MH is not set
+# CONFIG_NSH_DISABLE_MOUNT is not set
+# CONFIG_NSH_DISABLE_MV is not set
+# CONFIG_NSH_DISABLE_MW is not set
+CONFIG_NSH_DISABLE_PRINTF=y
+# CONFIG_NSH_DISABLE_PS is not set
+CONFIG_NSH_DISABLE_PUT=y
+# CONFIG_NSH_DISABLE_PWD is not set
+# CONFIG_NSH_DISABLE_RM is not set
+# CONFIG_NSH_DISABLE_RMDIR is not set
+# CONFIG_NSH_DISABLE_SET is not set
+# CONFIG_NSH_DISABLE_SH is not set
+# CONFIG_NSH_DISABLE_SLEEP is not set
+# CONFIG_NSH_DISABLE_TIME is not set
+# CONFIG_NSH_DISABLE_TEST is not set
+# CONFIG_NSH_DISABLE_UMOUNT is not set
+# CONFIG_NSH_DISABLE_UNAME is not set
+# CONFIG_NSH_DISABLE_UNSET is not set
+# CONFIG_NSH_DISABLE_USLEEP is not set
+CONFIG_NSH_DISABLE_WGET=y
+# CONFIG_NSH_DISABLE_XD is not set
+CONFIG_NSH_MMCSDMINOR=0
+
+#
+# Configure Command Options
+#
+# CONFIG_NSH_CMDOPT_DF_H is not set
+# CONFIG_NSH_CMDOPT_DD_STATS is not set
+CONFIG_NSH_CODECS_BUFSIZE=128
+CONFIG_NSH_CMDOPT_HEXDUMP=y
+CONFIG_NSH_PROC_MOUNTPOINT="/proc"
+CONFIG_NSH_FILEIOSIZE=512
+
+#
+# Scripting Support
+#
+# CONFIG_NSH_DISABLESCRIPT is not set
+# CONFIG_NSH_DISABLE_ITEF is not set
+# CONFIG_NSH_DISABLE_LOOPS is not set
+
+#
+# Console Configuration
+#
+CONFIG_NSH_CONSOLE=y
+# CONFIG_NSH_USBCONSOLE is not set
+# CONFIG_NSH_ALTCONDEV is not set
+CONFIG_NSH_ARCHINIT=y
+# CONFIG_NSH_LOGIN is not set
+# CONFIG_NSH_CONSOLE_LOGIN is not set
+
+#
+# NxWidgets/NxWM
+#
+
+#
+# Platform-specific Support
+#
+# CONFIG_PLATFORM_CONFIGDATA is not set
+
+#
+# System Libraries and NSH Add-Ons
+#
+# CONFIG_SYSTEM_CDCACM is not set
+# CONFIG_SYSTEM_CLE is not set
+# CONFIG_SYSTEM_CUTERM is not set
+# CONFIG_SYSTEM_FREE is not set
+# CONFIG_SYSTEM_HEX2BIN is not set
+# CONFIG_SYSTEM_HEXED is not set
+# CONFIG_SYSTEM_INSTALL is not set
+# CONFIG_SYSTEM_RAMTEST is not set
+CONFIG_READLINE_HAVE_EXTMATCH=y
+CONFIG_SYSTEM_READLINE=y
+CONFIG_READLINE_ECHO=y
+# CONFIG_READLINE_TABCOMPLETION is not set
+# CONFIG_READLINE_CMD_HISTORY is not set
+# CONFIG_SYSTEM_SUDOKU is not set
+# CONFIG_SYSTEM_SYSTEM is not set
+# CONFIG_SYSTEM_TEE is not set
+# CONFIG_SYSTEM_UBLOXMODEM is not set
+# CONFIG_SYSTEM_VI is not set
+# CONFIG_SYSTEM_ZMODEM is not set
diff --git a/configs/clicker2-stm32/usbnsh/setenv.sh b/configs/clicker2-stm32/usbnsh/setenv.sh
new file mode 100644
index 00000000000..17b9fd2a3db
--- /dev/null
+++ b/configs/clicker2-stm32/usbnsh/setenv.sh
@@ -0,0 +1,80 @@
+#!/bin/bash
+# configs/clicker2-stm32/usbnsh/setenv.sh
+#
+# 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.
+#
+
+if [ "$_" = "$0" ] ; then
+ echo "You must source this script, not run it!" 1>&2
+ exit 1
+fi
+
+WD=`pwd`
+if [ ! -x "setenv.sh" ]; then
+ echo "This script must be executed from the top-level NuttX build directory"
+ exit 1
+fi
+
+if [ -z "${PATH_ORIG}" ]; then
+ export PATH_ORIG="${PATH}"
+fi
+
+# This is the Cygwin path to the location where I installed the CodeSourcery
+# toolchain under windows. You will also have to edit this if you install
+# the CodeSourcery toolchain in any other location
+#export TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/CodeSourcery/Sourcery G++ Lite/bin"
+#export TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_EABI/bin"
+# export TOOLCHAIN_BIN="/cygdrive/c/Users/MyName/MentorGraphics/Sourcery_CodeBench_Lite_for_ARM_EABI/bin"
+
+# This is the location where I installed the ARM "GNU Tools for ARM Embedded Processors"
+# You can this free toolchain here https://launchpad.net/gcc-arm-embedded
+export TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/GNU Tools ARM Embedded/4.9 2015q2/bin"
+
+# This is the path to the location where I installed the devkitARM toolchain
+# You can get this free toolchain from http://devkitpro.org/ or http://sourceforge.net/projects/devkitpro/
+#export TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/devkitARM/bin"
+
+# These are the Cygwin paths to the locations where I installed the Atollic
+# toolchain under windows. You will also have to edit this if you install
+# the Atollic toolchain in any other location. /usr/bin is added before
+# the Atollic bin path because there is are binaries named gcc.exe and g++.exe
+# at those locations as well.
+#export TOOLCHAIN_BIN="/usr/bin:/cygdrive/c/Program Files (x86)/Atollic/TrueSTUDIO for ARM Pro 2.3.0/ARMTools/bin"
+#export TOOLCHAIN_BIN="/usr/bin:/cygdrive/c/Program Files (x86)/Atollic/TrueSTUDIO for STMicroelectronics STM32 Lite 2.3.0/ARMTools/bin"
+
+# This is the Cygwin path to the location where I build the buildroot
+# toolchain.
+# export TOOLCHAIN_BIN="${WD}/../buildroot/build_arm_nofpu/staging_dir/bin"
+
+# Add the path to the toolchain to the PATH varialble
+export PATH="${TOOLCHAIN_BIN}:/sbin:/usr/sbin:${PATH_ORIG}"
+
+echo "PATH : ${PATH}"
diff --git a/configs/cloudctrl/nsh/defconfig b/configs/cloudctrl/nsh/defconfig
index 0f138988ec2..9f9139982a1 100644
--- a/configs/cloudctrl/nsh/defconfig
+++ b/configs/cloudctrl/nsh/defconfig
@@ -661,7 +661,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/dk-tm4c129x/ipv6/defconfig b/configs/dk-tm4c129x/ipv6/defconfig
index 328b1ffd43c..36d1a16a75f 100644
--- a/configs/dk-tm4c129x/ipv6/defconfig
+++ b/configs/dk-tm4c129x/ipv6/defconfig
@@ -418,7 +418,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/dk-tm4c129x/nsh/defconfig b/configs/dk-tm4c129x/nsh/defconfig
index 1032d725802..6e33f59d6de 100644
--- a/configs/dk-tm4c129x/nsh/defconfig
+++ b/configs/dk-tm4c129x/nsh/defconfig
@@ -418,7 +418,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ea3131/nsh/defconfig b/configs/ea3131/nsh/defconfig
index 06faf8210dc..dc4dd7bff8b 100644
--- a/configs/ea3131/nsh/defconfig
+++ b/configs/ea3131/nsh/defconfig
@@ -311,7 +311,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ea3131/pgnsh/defconfig b/configs/ea3131/pgnsh/defconfig
index 205056e5c2e..1d6a5864ac1 100644
--- a/configs/ea3131/pgnsh/defconfig
+++ b/configs/ea3131/pgnsh/defconfig
@@ -331,7 +331,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ea3131/usbserial/defconfig b/configs/ea3131/usbserial/defconfig
index 16133499cc8..4a502be9b7b 100644
--- a/configs/ea3131/usbserial/defconfig
+++ b/configs/ea3131/usbserial/defconfig
@@ -320,7 +320,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ea3152/ostest/defconfig b/configs/ea3152/ostest/defconfig
index 765553c8ed6..74acabf1d26 100644
--- a/configs/ea3152/ostest/defconfig
+++ b/configs/ea3152/ostest/defconfig
@@ -307,7 +307,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/eagle100/httpd/defconfig b/configs/eagle100/httpd/defconfig
index a1685a22e9f..d12c0f15302 100644
--- a/configs/eagle100/httpd/defconfig
+++ b/configs/eagle100/httpd/defconfig
@@ -392,7 +392,8 @@ CONFIG_MAX_TASKS=8
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/eagle100/nsh/defconfig b/configs/eagle100/nsh/defconfig
index 5c9b6151435..77155e25bcb 100644
--- a/configs/eagle100/nsh/defconfig
+++ b/configs/eagle100/nsh/defconfig
@@ -397,7 +397,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/eagle100/nxflat/defconfig b/configs/eagle100/nxflat/defconfig
index 6b1e90c7c90..c6af5b59d55 100644
--- a/configs/eagle100/nxflat/defconfig
+++ b/configs/eagle100/nxflat/defconfig
@@ -377,7 +377,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/efm32-g8xx-stk/nsh/defconfig b/configs/efm32-g8xx-stk/nsh/defconfig
index 7d27d8a4773..999021c2315 100644
--- a/configs/efm32-g8xx-stk/nsh/defconfig
+++ b/configs/efm32-g8xx-stk/nsh/defconfig
@@ -342,7 +342,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/efm32gg-stk3700/nsh/defconfig b/configs/efm32gg-stk3700/nsh/defconfig
index b52a063e1c2..73141e3451d 100644
--- a/configs/efm32gg-stk3700/nsh/defconfig
+++ b/configs/efm32gg-stk3700/nsh/defconfig
@@ -342,7 +342,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ekk-lm3s9b96/nsh/defconfig b/configs/ekk-lm3s9b96/nsh/defconfig
index 970a1bd97a6..dc7faf5968e 100644
--- a/configs/ekk-lm3s9b96/nsh/defconfig
+++ b/configs/ekk-lm3s9b96/nsh/defconfig
@@ -384,7 +384,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/esp32-core/nsh/defconfig b/configs/esp32-core/nsh/defconfig
index b8b3ee020b7..5b2d824242c 100644
--- a/configs/esp32-core/nsh/defconfig
+++ b/configs/esp32-core/nsh/defconfig
@@ -224,7 +224,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/esp32-core/ostest/defconfig b/configs/esp32-core/ostest/defconfig
index ab632aa6290..1add834b7a2 100644
--- a/configs/esp32-core/ostest/defconfig
+++ b/configs/esp32-core/ostest/defconfig
@@ -224,7 +224,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/esp32-core/smp/defconfig b/configs/esp32-core/smp/defconfig
index cf958086595..e603eab3a72 100644
--- a/configs/esp32-core/smp/defconfig
+++ b/configs/esp32-core/smp/defconfig
@@ -226,7 +226,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ez80f910200zco/httpd/defconfig b/configs/ez80f910200zco/httpd/defconfig
index 96272435810..3985af46a61 100644
--- a/configs/ez80f910200zco/httpd/defconfig
+++ b/configs/ez80f910200zco/httpd/defconfig
@@ -273,7 +273,8 @@ CONFIG_MAX_TASKS=8
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ez80f910200zco/nsh/defconfig b/configs/ez80f910200zco/nsh/defconfig
index 8fc46b9b99d..87f8bffe924 100644
--- a/configs/ez80f910200zco/nsh/defconfig
+++ b/configs/ez80f910200zco/nsh/defconfig
@@ -273,7 +273,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ez80f910200zco/poll/defconfig b/configs/ez80f910200zco/poll/defconfig
index 4fbc368263e..26cc069f33f 100644
--- a/configs/ez80f910200zco/poll/defconfig
+++ b/configs/ez80f910200zco/poll/defconfig
@@ -273,7 +273,8 @@ CONFIG_MAX_TASKS=8
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/fire-stm32v2/nsh/defconfig b/configs/fire-stm32v2/nsh/defconfig
index a7ec0209312..e7d49f2a4d2 100644
--- a/configs/fire-stm32v2/nsh/defconfig
+++ b/configs/fire-stm32v2/nsh/defconfig
@@ -670,7 +670,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/freedom-k64f/netnsh/defconfig b/configs/freedom-k64f/netnsh/defconfig
index c94d75f4385..d546e3cdf80 100644
--- a/configs/freedom-k64f/netnsh/defconfig
+++ b/configs/freedom-k64f/netnsh/defconfig
@@ -413,7 +413,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/freedom-k64f/nsh/defconfig b/configs/freedom-k64f/nsh/defconfig
index 83424e7838d..9494c766b79 100644
--- a/configs/freedom-k64f/nsh/defconfig
+++ b/configs/freedom-k64f/nsh/defconfig
@@ -408,7 +408,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/freedom-k66f/netnsh/defconfig b/configs/freedom-k66f/netnsh/defconfig
index 67c13b30892..3ed87ae329e 100644
--- a/configs/freedom-k66f/netnsh/defconfig
+++ b/configs/freedom-k66f/netnsh/defconfig
@@ -414,7 +414,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/freedom-k66f/nsh/defconfig b/configs/freedom-k66f/nsh/defconfig
index 9605b84c9d1..c1b4346b06b 100644
--- a/configs/freedom-k66f/nsh/defconfig
+++ b/configs/freedom-k66f/nsh/defconfig
@@ -420,7 +420,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/freedom-kl25z/nsh/defconfig b/configs/freedom-kl25z/nsh/defconfig
index 0061583e6fc..44409adf6f5 100644
--- a/configs/freedom-kl25z/nsh/defconfig
+++ b/configs/freedom-kl25z/nsh/defconfig
@@ -319,7 +319,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/freedom-kl26z/nsh/defconfig b/configs/freedom-kl26z/nsh/defconfig
index f54ed0d572b..fc1c40a7593 100644
--- a/configs/freedom-kl26z/nsh/defconfig
+++ b/configs/freedom-kl26z/nsh/defconfig
@@ -319,7 +319,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/hymini-stm32v/nsh/defconfig b/configs/hymini-stm32v/nsh/defconfig
index 0a91779a141..fe68926811c 100644
--- a/configs/hymini-stm32v/nsh/defconfig
+++ b/configs/hymini-stm32v/nsh/defconfig
@@ -627,7 +627,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/hymini-stm32v/nsh2/defconfig b/configs/hymini-stm32v/nsh2/defconfig
index fa837c23271..ee5e4f93f1e 100644
--- a/configs/hymini-stm32v/nsh2/defconfig
+++ b/configs/hymini-stm32v/nsh2/defconfig
@@ -646,7 +646,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/hymini-stm32v/usbmsc/defconfig b/configs/hymini-stm32v/usbmsc/defconfig
index d80cc63e6f9..eec91e46a45 100644
--- a/configs/hymini-stm32v/usbmsc/defconfig
+++ b/configs/hymini-stm32v/usbmsc/defconfig
@@ -633,7 +633,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/hymini-stm32v/usbnsh/defconfig b/configs/hymini-stm32v/usbnsh/defconfig
index dc1652e6bd3..239c6c23836 100644
--- a/configs/hymini-stm32v/usbnsh/defconfig
+++ b/configs/hymini-stm32v/usbnsh/defconfig
@@ -620,7 +620,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/hymini-stm32v/usbserial/defconfig b/configs/hymini-stm32v/usbserial/defconfig
index e1c0a80dc34..e5ec56e3e1c 100644
--- a/configs/hymini-stm32v/usbserial/defconfig
+++ b/configs/hymini-stm32v/usbserial/defconfig
@@ -624,7 +624,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/kwikstik-k40/ostest/defconfig b/configs/kwikstik-k40/ostest/defconfig
index 874390fb7aa..17e0f84d149 100644
--- a/configs/kwikstik-k40/ostest/defconfig
+++ b/configs/kwikstik-k40/ostest/defconfig
@@ -380,7 +380,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/launchxl-tms57004/nsh/defconfig b/configs/launchxl-tms57004/nsh/defconfig
index c13d511f8a1..22236f0c960 100644
--- a/configs/launchxl-tms57004/nsh/defconfig
+++ b/configs/launchxl-tms57004/nsh/defconfig
@@ -309,7 +309,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lincoln60/netnsh/defconfig b/configs/lincoln60/netnsh/defconfig
index 06961522e4f..4e1fad4b0db 100644
--- a/configs/lincoln60/netnsh/defconfig
+++ b/configs/lincoln60/netnsh/defconfig
@@ -375,7 +375,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lincoln60/nsh/defconfig b/configs/lincoln60/nsh/defconfig
index a7f5e64b13e..5151256ba65 100644
--- a/configs/lincoln60/nsh/defconfig
+++ b/configs/lincoln60/nsh/defconfig
@@ -353,7 +353,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lm3s6432-s2e/nsh/defconfig b/configs/lm3s6432-s2e/nsh/defconfig
index e258aec9586..11925f41393 100644
--- a/configs/lm3s6432-s2e/nsh/defconfig
+++ b/configs/lm3s6432-s2e/nsh/defconfig
@@ -379,7 +379,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lm3s6965-ek/discover/defconfig b/configs/lm3s6965-ek/discover/defconfig
index bdf565b3a64..d8f8639ebfa 100644
--- a/configs/lm3s6965-ek/discover/defconfig
+++ b/configs/lm3s6965-ek/discover/defconfig
@@ -389,7 +389,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lm3s6965-ek/nsh/defconfig b/configs/lm3s6965-ek/nsh/defconfig
index bdf565b3a64..d8f8639ebfa 100644
--- a/configs/lm3s6965-ek/nsh/defconfig
+++ b/configs/lm3s6965-ek/nsh/defconfig
@@ -389,7 +389,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lm3s6965-ek/nx/defconfig b/configs/lm3s6965-ek/nx/defconfig
index 4a54e8007f4..890bf26a43b 100644
--- a/configs/lm3s6965-ek/nx/defconfig
+++ b/configs/lm3s6965-ek/nx/defconfig
@@ -374,7 +374,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lm3s6965-ek/tcpecho/defconfig b/configs/lm3s6965-ek/tcpecho/defconfig
index 2efa710813c..f790652e650 100644
--- a/configs/lm3s6965-ek/tcpecho/defconfig
+++ b/configs/lm3s6965-ek/tcpecho/defconfig
@@ -378,7 +378,7 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lm3s8962-ek/nsh/defconfig b/configs/lm3s8962-ek/nsh/defconfig
index 58a8f095cac..1c62f37b57c 100644
--- a/configs/lm3s8962-ek/nsh/defconfig
+++ b/configs/lm3s8962-ek/nsh/defconfig
@@ -401,7 +401,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lm3s8962-ek/nx/defconfig b/configs/lm3s8962-ek/nx/defconfig
index 8c343bd1c6d..dfa23602926 100644
--- a/configs/lm3s8962-ek/nx/defconfig
+++ b/configs/lm3s8962-ek/nx/defconfig
@@ -386,7 +386,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lm4f120-launchpad/nsh/defconfig b/configs/lm4f120-launchpad/nsh/defconfig
index 6f028482834..b62982b2d45 100644
--- a/configs/lm4f120-launchpad/nsh/defconfig
+++ b/configs/lm4f120-launchpad/nsh/defconfig
@@ -383,7 +383,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lpc4330-xplorer/nsh/defconfig b/configs/lpc4330-xplorer/nsh/defconfig
index 89bc4fa73a8..15fdeb23a5b 100644
--- a/configs/lpc4330-xplorer/nsh/defconfig
+++ b/configs/lpc4330-xplorer/nsh/defconfig
@@ -386,7 +386,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lpc4337-ws/nsh/defconfig b/configs/lpc4337-ws/nsh/defconfig
index 067cffc7eec..85c38182c05 100644
--- a/configs/lpc4337-ws/nsh/defconfig
+++ b/configs/lpc4337-ws/nsh/defconfig
@@ -391,7 +391,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lpc4357-evb/nsh/defconfig b/configs/lpc4357-evb/nsh/defconfig
index bd1bcc04c56..f12eb6b565c 100644
--- a/configs/lpc4357-evb/nsh/defconfig
+++ b/configs/lpc4357-evb/nsh/defconfig
@@ -377,7 +377,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lpc4370-link2/nsh/defconfig b/configs/lpc4370-link2/nsh/defconfig
index 9a8ae1315d2..e8c417a6381 100644
--- a/configs/lpc4370-link2/nsh/defconfig
+++ b/configs/lpc4370-link2/nsh/defconfig
@@ -387,7 +387,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lpcxpresso-lpc1115/nsh/defconfig b/configs/lpcxpresso-lpc1115/nsh/defconfig
index d38217dc0ae..deeddca94b0 100644
--- a/configs/lpcxpresso-lpc1115/nsh/defconfig
+++ b/configs/lpcxpresso-lpc1115/nsh/defconfig
@@ -291,7 +291,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lpcxpresso-lpc1768/nsh/defconfig b/configs/lpcxpresso-lpc1768/nsh/defconfig
index 981c237dc0d..06ceda8cc15 100644
--- a/configs/lpcxpresso-lpc1768/nsh/defconfig
+++ b/configs/lpcxpresso-lpc1768/nsh/defconfig
@@ -365,7 +365,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lpcxpresso-lpc1768/nx/defconfig b/configs/lpcxpresso-lpc1768/nx/defconfig
index f8991bb731b..48816c4ef3d 100644
--- a/configs/lpcxpresso-lpc1768/nx/defconfig
+++ b/configs/lpcxpresso-lpc1768/nx/defconfig
@@ -353,7 +353,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/lpcxpresso-lpc1768/usbmsc/defconfig b/configs/lpcxpresso-lpc1768/usbmsc/defconfig
index 4258e43386a..ef5d2b4b476 100644
--- a/configs/lpcxpresso-lpc1768/usbmsc/defconfig
+++ b/configs/lpcxpresso-lpc1768/usbmsc/defconfig
@@ -365,7 +365,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/maple/nsh/defconfig b/configs/maple/nsh/defconfig
index d5707caf97e..5a9f920921a 100644
--- a/configs/maple/nsh/defconfig
+++ b/configs/maple/nsh/defconfig
@@ -608,7 +608,7 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/maple/nx/defconfig b/configs/maple/nx/defconfig
index 4badf8cce01..7a3e6154303 100644
--- a/configs/maple/nx/defconfig
+++ b/configs/maple/nx/defconfig
@@ -639,7 +639,7 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/maple/usbnsh/defconfig b/configs/maple/usbnsh/defconfig
index 4b61b62be73..b74195b5920 100644
--- a/configs/maple/usbnsh/defconfig
+++ b/configs/maple/usbnsh/defconfig
@@ -614,7 +614,7 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mbed/nsh/defconfig b/configs/mbed/nsh/defconfig
index 91040faa587..98949e8db01 100644
--- a/configs/mbed/nsh/defconfig
+++ b/configs/mbed/nsh/defconfig
@@ -354,7 +354,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mcu123-lpc214x/composite/defconfig b/configs/mcu123-lpc214x/composite/defconfig
index 1867544145f..4df7bb1f414 100644
--- a/configs/mcu123-lpc214x/composite/defconfig
+++ b/configs/mcu123-lpc214x/composite/defconfig
@@ -302,7 +302,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mcu123-lpc214x/nsh/defconfig b/configs/mcu123-lpc214x/nsh/defconfig
index 602812eff3e..eceeefccbaa 100644
--- a/configs/mcu123-lpc214x/nsh/defconfig
+++ b/configs/mcu123-lpc214x/nsh/defconfig
@@ -292,7 +292,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mcu123-lpc214x/usbmsc/defconfig b/configs/mcu123-lpc214x/usbmsc/defconfig
index 46e3629c620..8c544ff6818 100644
--- a/configs/mcu123-lpc214x/usbmsc/defconfig
+++ b/configs/mcu123-lpc214x/usbmsc/defconfig
@@ -302,7 +302,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mcu123-lpc214x/usbserial/defconfig b/configs/mcu123-lpc214x/usbserial/defconfig
index cbfecf5e664..a0e67fe99bb 100644
--- a/configs/mcu123-lpc214x/usbserial/defconfig
+++ b/configs/mcu123-lpc214x/usbserial/defconfig
@@ -301,7 +301,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mikroe-stm32f4/fulldemo/defconfig b/configs/mikroe-stm32f4/fulldemo/defconfig
index c41315b980c..bbf651b9013 100644
--- a/configs/mikroe-stm32f4/fulldemo/defconfig
+++ b/configs/mikroe-stm32f4/fulldemo/defconfig
@@ -669,7 +669,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mikroe-stm32f4/kostest/defconfig b/configs/mikroe-stm32f4/kostest/defconfig
index 627f3da390b..821dbd9b9ff 100644
--- a/configs/mikroe-stm32f4/kostest/defconfig
+++ b/configs/mikroe-stm32f4/kostest/defconfig
@@ -671,7 +671,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mikroe-stm32f4/nsh/defconfig b/configs/mikroe-stm32f4/nsh/defconfig
index 8389737436a..fa6618f8607 100644
--- a/configs/mikroe-stm32f4/nsh/defconfig
+++ b/configs/mikroe-stm32f4/nsh/defconfig
@@ -647,7 +647,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mikroe-stm32f4/nx/defconfig b/configs/mikroe-stm32f4/nx/defconfig
index 397c14892e3..762f5db69ac 100644
--- a/configs/mikroe-stm32f4/nx/defconfig
+++ b/configs/mikroe-stm32f4/nx/defconfig
@@ -620,7 +620,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mikroe-stm32f4/nxlines/defconfig b/configs/mikroe-stm32f4/nxlines/defconfig
index 9c806f8868a..0c3708e13aa 100644
--- a/configs/mikroe-stm32f4/nxlines/defconfig
+++ b/configs/mikroe-stm32f4/nxlines/defconfig
@@ -620,7 +620,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mikroe-stm32f4/nxtext/defconfig b/configs/mikroe-stm32f4/nxtext/defconfig
index ae61dcf8290..00091f13c8c 100644
--- a/configs/mikroe-stm32f4/nxtext/defconfig
+++ b/configs/mikroe-stm32f4/nxtext/defconfig
@@ -620,7 +620,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mikroe-stm32f4/usbnsh/defconfig b/configs/mikroe-stm32f4/usbnsh/defconfig
index 3a15a1f7dfe..6aff27e81ae 100644
--- a/configs/mikroe-stm32f4/usbnsh/defconfig
+++ b/configs/mikroe-stm32f4/usbnsh/defconfig
@@ -655,7 +655,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mirtoo/nsh/defconfig b/configs/mirtoo/nsh/defconfig
index 287646a85d1..64d0001e69d 100644
--- a/configs/mirtoo/nsh/defconfig
+++ b/configs/mirtoo/nsh/defconfig
@@ -383,7 +383,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/misoc/hello/defconfig b/configs/misoc/hello/defconfig
index bcd0724148d..cf0c955efc8 100644
--- a/configs/misoc/hello/defconfig
+++ b/configs/misoc/hello/defconfig
@@ -236,7 +236,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/moxa/nsh/defconfig b/configs/moxa/nsh/defconfig
index 5d8bf233e32..6cd8e330c18 100644
--- a/configs/moxa/nsh/defconfig
+++ b/configs/moxa/nsh/defconfig
@@ -268,7 +268,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/mx1ads/ostest/defconfig b/configs/mx1ads/ostest/defconfig
index 4885086e8e7..7de94989e19 100644
--- a/configs/mx1ads/ostest/defconfig
+++ b/configs/mx1ads/ostest/defconfig
@@ -273,7 +273,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nr5m100-nexys4/nsh/defconfig b/configs/nr5m100-nexys4/nsh/defconfig
index cd3d16c67bc..d3e363576fd 100644
--- a/configs/nr5m100-nexys4/nsh/defconfig
+++ b/configs/nr5m100-nexys4/nsh/defconfig
@@ -230,7 +230,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ntosd-dm320/nsh/defconfig b/configs/ntosd-dm320/nsh/defconfig
index 12651fcce7b..02ff89e1cc6 100644
--- a/configs/ntosd-dm320/nsh/defconfig
+++ b/configs/ntosd-dm320/nsh/defconfig
@@ -270,7 +270,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ntosd-dm320/poll/defconfig b/configs/ntosd-dm320/poll/defconfig
index d7c104d42e5..943fd679dce 100644
--- a/configs/ntosd-dm320/poll/defconfig
+++ b/configs/ntosd-dm320/poll/defconfig
@@ -270,7 +270,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ntosd-dm320/webserver/defconfig b/configs/ntosd-dm320/webserver/defconfig
index 1e5e452cebc..4c6f2635f55 100644
--- a/configs/ntosd-dm320/webserver/defconfig
+++ b/configs/ntosd-dm320/webserver/defconfig
@@ -270,7 +270,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-144/f746-evalos/defconfig b/configs/nucleo-144/f746-evalos/defconfig
index 98e5af12164..5603a1aaa27 100644
--- a/configs/nucleo-144/f746-evalos/defconfig
+++ b/configs/nucleo-144/f746-evalos/defconfig
@@ -489,7 +489,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-144/f746-nsh/defconfig b/configs/nucleo-144/f746-nsh/defconfig
index cabf00e30b3..98eb5c263ee 100644
--- a/configs/nucleo-144/f746-nsh/defconfig
+++ b/configs/nucleo-144/f746-nsh/defconfig
@@ -489,7 +489,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-144/f767-evalos/defconfig b/configs/nucleo-144/f767-evalos/defconfig
index e2965f6489c..57a3aeeed04 100644
--- a/configs/nucleo-144/f767-evalos/defconfig
+++ b/configs/nucleo-144/f767-evalos/defconfig
@@ -493,7 +493,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-144/f767-nsh/defconfig b/configs/nucleo-144/f767-nsh/defconfig
index e638ac71ec0..772f1f89b63 100644
--- a/configs/nucleo-144/f767-nsh/defconfig
+++ b/configs/nucleo-144/f767-nsh/defconfig
@@ -493,7 +493,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-f303re/adc/defconfig b/configs/nucleo-f303re/adc/defconfig
index 74668a9f05a..e5357a746b7 100644
--- a/configs/nucleo-f303re/adc/defconfig
+++ b/configs/nucleo-f303re/adc/defconfig
@@ -609,7 +609,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-f303re/can/defconfig b/configs/nucleo-f303re/can/defconfig
index f251bc90655..4db532a8625 100644
--- a/configs/nucleo-f303re/can/defconfig
+++ b/configs/nucleo-f303re/can/defconfig
@@ -612,7 +612,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-f303re/hello/defconfig b/configs/nucleo-f303re/hello/defconfig
index 42c6bc187b4..6a1e7fb7c45 100644
--- a/configs/nucleo-f303re/hello/defconfig
+++ b/configs/nucleo-f303re/hello/defconfig
@@ -619,7 +619,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-f303re/nxlines/defconfig b/configs/nucleo-f303re/nxlines/defconfig
index 9e7986d9229..60d56ecc84e 100644
--- a/configs/nucleo-f303re/nxlines/defconfig
+++ b/configs/nucleo-f303re/nxlines/defconfig
@@ -611,7 +611,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-f303re/pwm/defconfig b/configs/nucleo-f303re/pwm/defconfig
index c91563199ff..630d14fa4e5 100644
--- a/configs/nucleo-f303re/pwm/defconfig
+++ b/configs/nucleo-f303re/pwm/defconfig
@@ -613,7 +613,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-f303re/serialrx/defconfig b/configs/nucleo-f303re/serialrx/defconfig
index 20333da3a54..b4ff9650dc1 100644
--- a/configs/nucleo-f303re/serialrx/defconfig
+++ b/configs/nucleo-f303re/serialrx/defconfig
@@ -624,7 +624,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-f303re/uavcan/defconfig b/configs/nucleo-f303re/uavcan/defconfig
index 9918c008158..090fcb42e85 100644
--- a/configs/nucleo-f303re/uavcan/defconfig
+++ b/configs/nucleo-f303re/uavcan/defconfig
@@ -597,7 +597,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-f334r8/src/stm32_comp.c b/configs/nucleo-f334r8/src/stm32_comp.c
index 0f775e1f3dc..c6b8be8249c 100644
--- a/configs/nucleo-f334r8/src/stm32_comp.c
+++ b/configs/nucleo-f334r8/src/stm32_comp.c
@@ -44,7 +44,7 @@
#include
#include
-/* #include */
+#include
#include "stm32.h"
@@ -52,6 +52,20 @@
defined(CONFIG_STM32_COMP4) || \
defined(CONFIG_STM32_COMP6))
+#ifdef CONFIG_STM32_COMP2
+# if defined(CONFIG_STM32_COMP4) || defined(CONFIG_STM32_COMP6)
+# error "Currently only one COMP device supported"
+# endif
+#elif CONFIG_STM32_COMP4
+# if defined(CONFIG_STM32_COMP2) || defined(CONFIG_STM32_COMP6)
+# error "Currently only one COMP device supported"
+# endif
+#elif CONFIG_STM32_COMP6
+# if defined(CONFIG_STM32_COMP2) || defined(CONFIG_STM32_COMP4)
+# error "Currently only one COMP device supported"
+# endif
+#endif
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -67,12 +81,13 @@
int stm32_comp_setup(void)
{
static bool initialized = false;
- struct stm32_comp_s* comp = NULL;
+ struct comp_dev_s* comp = NULL;
int ret;
- UNUSED(ret);
if (!initialized)
{
+ /* Get the comparator interface */
+
#ifdef CONFIG_STM32_COMP2
comp = stm32_compinitialize(2);
if (comp == NULL)
@@ -100,8 +115,7 @@ int stm32_comp_setup(void)
}
#endif
-#if 0
- /* COMP driver not implemented yet */
+ /* Register the comparator character driver at /dev/comp0 */
ret = comp_register("/dev/comp0", comp);
if (ret < 0)
@@ -109,7 +123,6 @@ int stm32_comp_setup(void)
aerr("ERROR: comp_register failed: %d\n", ret);
return ret;
}
-#endif
initialized = true;
}
diff --git a/configs/nucleo-f4x1re/f401-nsh/defconfig b/configs/nucleo-f4x1re/f401-nsh/defconfig
index 5783b024fcc..6ac098d6b00 100644
--- a/configs/nucleo-f4x1re/f401-nsh/defconfig
+++ b/configs/nucleo-f4x1re/f401-nsh/defconfig
@@ -616,7 +616,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-f4x1re/f411-nsh/defconfig b/configs/nucleo-f4x1re/f411-nsh/defconfig
index ce765110b7c..ddbdc44dac7 100644
--- a/configs/nucleo-f4x1re/f411-nsh/defconfig
+++ b/configs/nucleo-f4x1re/f411-nsh/defconfig
@@ -618,7 +618,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-l476rg/nsh/defconfig b/configs/nucleo-l476rg/nsh/defconfig
index e851d0a797c..f78446519f8 100644
--- a/configs/nucleo-l476rg/nsh/defconfig
+++ b/configs/nucleo-l476rg/nsh/defconfig
@@ -441,7 +441,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/nucleo-l476rg/src/nucleo-l476rg.h b/configs/nucleo-l476rg/src/nucleo-l476rg.h
index e82283b177c..a6f676da547 100644
--- a/configs/nucleo-l476rg/src/nucleo-l476rg.h
+++ b/configs/nucleo-l476rg/src/nucleo-l476rg.h
@@ -71,7 +71,7 @@
# undef HAVE_RTC_DRIVER
#endif
-#if !defined(CONFIG_STM32_SDIO) || !defined(CONFIG_MMCSD) || \
+#if !defined(CONFIG_STM32L4_SDIO) || !defined(CONFIG_MMCSD) || \
!defined(CONFIG_MMCSD_SDIO)
# undef HAVE_MMCSD
#endif
@@ -293,10 +293,10 @@
/* Global driver instances */
-#ifdef CONFIG_STM32_SPI1
+#ifdef CONFIG_STM32L4_SPI1
extern struct spi_dev_s *g_spi1;
#endif
-#ifdef CONFIG_STM32_SPI2
+#ifdef CONFIG_STM32L4_SPI2
extern struct spi_dev_s *g_spi2;
#endif
#ifdef HAVE_MMCSD
@@ -308,27 +308,27 @@ extern struct sdio_dev_s *g_sdio;
************************************************************************************/
/************************************************************************************
- * Name: stm32_spiinitialize
+ * Name: stm32l4_spiinitialize
*
* Description:
* Called to configure SPI chip select GPIO pins.
*
************************************************************************************/
-void stm32_spiinitialize(void);
+void stm32l4_spiinitialize(void);
/************************************************************************************
- * Name: stm32_usbinitialize
+ * Name: stm32l4_usbinitialize
*
* Description:
* Called to setup USB-related GPIO pins.
*
************************************************************************************/
-void stm32_usbinitialize(void);
+void stm32l4_usbinitialize(void);
/************************************************************************************
- * Name: stm32_pwm_setup
+ * Name: stm32l4_pwm_setup
*
* Description:
* Initialize PWM and register the PWM device.
@@ -336,11 +336,11 @@ void stm32_usbinitialize(void);
************************************************************************************/
#ifdef CONFIG_PWM
-int stm32_pwm_setup(void);
+int stm32l4_pwm_setup(void);
#endif
/************************************************************************************
- * Name: stm32_adc_setup
+ * Name: stm32l4_adc_setup
*
* Description:
* Initialize ADC and register the ADC driver.
@@ -348,7 +348,7 @@ int stm32_pwm_setup(void);
************************************************************************************/
#ifdef CONFIG_ADC
-int stm32_adc_setup(void);
+int stm32l4_adc_setup(void);
#endif
/****************************************************************************
diff --git a/configs/nucleo-l476rg/src/stm32_appinit.c b/configs/nucleo-l476rg/src/stm32_appinit.c
index 41b54976ae4..ceaa3a76f52 100644
--- a/configs/nucleo-l476rg/src/stm32_appinit.c
+++ b/configs/nucleo-l476rg/src/stm32_appinit.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * configs/nucleo-l476rg/src/stm32_appinit.c
+ * configs/nucleo-l476rg/src/stm32l4_appinit.c
*
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
@@ -199,20 +199,20 @@ int board_app_initialize(uintptr_t arg)
#ifdef CONFIG_PWM
/* Initialize PWM and register the PWM device. */
- ret = stm32_pwm_setup();
+ ret = stm32l4_pwm_setup();
if (ret < 0)
{
- syslog(LOG_ERR, "ERROR: stm32_pwm_setup() failed: %d\n", ret);
+ syslog(LOG_ERR, "ERROR: stm32l4_pwm_setup() failed: %d\n", ret);
}
#endif
#ifdef CONFIG_ADC
/* Initialize ADC and register the ADC driver. */
- ret = stm32_adc_setup();
+ ret = stm32l4_adc_setup();
if (ret < 0)
{
- syslog(LOG_ERR, "ERROR: stm32_adc_setup failed: %d\n", ret);
+ syslog(LOG_ERR, "ERROR: stm32l4_adc_setup failed: %d\n", ret);
}
#endif
diff --git a/configs/nucleo-l476rg/src/stm32_boot.c b/configs/nucleo-l476rg/src/stm32_boot.c
index 0389d18cf11..2acb52ee62e 100644
--- a/configs/nucleo-l476rg/src/stm32_boot.c
+++ b/configs/nucleo-l476rg/src/stm32_boot.c
@@ -1,5 +1,5 @@
/************************************************************************************
- * configs/nucleo-l476rg/src/stm32_boot.c
+ * configs/nucleo-l476rg/src/stm32l4_boot.c
*
* Copyright (C) 2014-2015 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
@@ -82,19 +82,19 @@ void stm32l4_boardinitialize(void)
#endif
/* Configure SPI chip selects if 1) SP2 is not disabled, and 2) the weak function
- * stm32_spiinitialize() has been brought into the link.
+ * stm32l4_spiinitialize() has been brought into the link.
*/
-#if defined(CONFIG_STM32_SPI1) || defined(CONFIG_STM32_SPI2) || defined(CONFIG_STM32_SPI3)
+#if defined(CONFIG_STM32L4_SPI1) || defined(CONFIG_STM32L4_SPI2) || defined(CONFIG_STM32L4_SPI3)
stm32l4_spiinitialize();
#endif
/* Initialize USB is 1) USBDEV is selected, 2) the USB controller is not
- * disabled, and 3) the weak function stm32_usbinitialize() has been brought
+ * disabled, and 3) the weak function stm32l4_usbinitialize() has been brought
* into the build.
*/
-#if defined(CONFIG_USBDEV) && defined(CONFIG_STM32_USB)
+#if defined(CONFIG_USBDEV) && defined(CONFIG_STM32L4_USB)
stm32l4_usbinitialize();
#endif
}
diff --git a/configs/nucleo-l476rg/src/stm32_spi.c b/configs/nucleo-l476rg/src/stm32_spi.c
index a400cd52677..71d65d8a10d 100644
--- a/configs/nucleo-l476rg/src/stm32_spi.c
+++ b/configs/nucleo-l476rg/src/stm32_spi.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * configs/nucleo-l476rg/src/stm32_spi.c
+ * configs/nucleo-l476rg/src/stm32l4_spi.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
@@ -53,17 +53,17 @@
#include "nucleo-l476rg.h"
-#if defined(CONFIG_STM32_SPI1) || defined(CONFIG_STM32_SPI2) || defined(CONFIG_STM32_SPI3)
+#if defined(CONFIG_STM32L4_SPI1) || defined(CONFIG_STM32L4_SPI2) || defined(CONFIG_STM32L4_SPI3)
/************************************************************************************
* Public Data
************************************************************************************/
/* Global driver instances */
-#ifdef CONFIG_STM32_SPI1
+#ifdef CONFIG_STM32L4_SPI1
struct spi_dev_s *g_spi1;
#endif
-#ifdef CONFIG_STM32_SPI2
+#ifdef CONFIG_STM32L4_SPI2
struct spi_dev_s *g_spi2;
#endif
@@ -72,7 +72,7 @@ struct spi_dev_s *g_spi2;
************************************************************************************/
/************************************************************************************
- * Name: stm32_spiinitialize
+ * Name: stm32l4_spiinitialize
*
* Description:
* Called to configure SPI chip select GPIO pins for the Nucleo-F401RE and
@@ -80,55 +80,55 @@ struct spi_dev_s *g_spi2;
*
************************************************************************************/
-void weak_function stm32_spiinitialize(void)
+void weak_function stm32l4_spiinitialize(void)
{
-#ifdef CONFIG_STM32_SPI1
+#ifdef CONFIG_STM32L4_SPI1
/* Configure SPI-based devices */
- g_spi1 = up_spiinitialize(1);
+ g_spi1 = stm32l4_spibus_initialize(1);
if (!g_spi1)
{
spierr("ERROR: FAILED to initialize SPI port 1\n");
}
#ifdef CONFIG_WL_CC3000
- stm32_configgpio(GPIO_SPI_CS_WIFI);
+ stm32l4_configgpio(GPIO_SPI_CS_WIFI);
#endif
#ifdef HAVE_MMCSD
- stm32_configgpio(GPIO_SPI_CS_SD_CARD);
+ stm32l4_configgpio(GPIO_SPI_CS_SD_CARD);
#endif
#endif
-#ifdef CONFIG_STM32_SPI2
+#ifdef CONFIG_STM32L4_SPI2
/* Configure SPI-based devices */
- g_spi2 = up_spiinitialize(2);
+ g_spi2 = stm32l4_spibus_initialize(2);
/* Setup CS, EN & IRQ line IOs */
#ifdef CONFIG_WL_CC3000
- stm32_configgpio(GPIO_WIFI_CS);
- stm32_configgpio(GPIO_WIFI_EN);
- stm32_configgpio(GPIO_WIFI_INT);
+ stm32l4_configgpio(GPIO_WIFI_CS);
+ stm32l4_configgpio(GPIO_WIFI_EN);
+ stm32l4_configgpio(GPIO_WIFI_INT);
#endif
#endif
}
/****************************************************************************
- * Name: stm32_spi1/2/3select and stm32_spi1/2/3status
+ * Name: stm32l4_spi1/2/3select and stm32l4_spi1/2/3status
*
* Description:
- * The external functions, stm32_spi1/2/3select and stm32_spi1/2/3status must be
+ * The external functions, stm32l4_spi1/2/3select and stm32l4_spi1/2/3status must be
* provided by board-specific logic. They are implementations of the select
* and status methods of the SPI interface defined by struct spi_ops_s (see
* include/nuttx/spi/spi.h). All other methods (including up_spiinitialize())
* are provided by common STM32 logic. To use this common SPI logic on your
* board:
*
- * 1. Provide logic in stm32_boardinitialize() to configure SPI chip select
+ * 1. Provide logic in stm32l4_boardinitialize() to configure SPI chip select
* pins.
- * 2. Provide stm32_spi1/2/3select() and stm32_spi1/2/3status() functions in your
+ * 2. Provide stm32l4_spi1/2/3select() and stm32l4_spi1/2/3status() functions in your
* board-specific logic. These functions will perform chip selection and
* status operations using GPIOs in the way your board is configured.
* 3. Add a calls to up_spiinitialize() in your low level application
@@ -140,65 +140,65 @@ void weak_function stm32_spiinitialize(void)
*
****************************************************************************/
-#ifdef CONFIG_STM32_SPI1
-void stm32_spi1select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
+#ifdef CONFIG_STM32L4_SPI1
+void stm32l4_spi1select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
{
spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
#ifdef CONFIG_WL_CC3000
if (devid == SPIDEV_WIRELESS)
{
- stm32_gpiowrite(GPIO_SPI_CS_WIFI, !selected);
+ stm32l4_gpiowrite(GPIO_SPI_CS_WIFI, !selected);
}
else
#endif
#ifdef HAVE_MMCSD
if (devid == SPIDEV_MMCSD)
{
- stm32_gpiowrite(GPIO_SPI_CS_SD_CARD, !selected);
+ stm32l4_gpiowrite(GPIO_SPI_CS_SD_CARD, !selected);
}
#endif
}
-uint8_t stm32_spi1status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
+uint8_t stm32l4_spi1status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
{
return 0;
}
#endif
-#ifdef CONFIG_STM32_SPI2
-void stm32_spi2select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
+#ifdef CONFIG_STM32L4_SPI2
+void stm32l4_spi2select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
{
spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
#ifdef CONFIG_WL_CC3000
if (devid == SPIDEV_WIRELESS)
{
- stm32_gpiowrite(GPIO_WIFI_CS, !selected);
+ stm32l4_gpiowrite(GPIO_WIFI_CS, !selected);
}
#endif
}
-uint8_t stm32_spi2status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
+uint8_t stm32l4_spi2status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
{
return 0;
}
#endif
-#ifdef CONFIG_STM32_SPI3
-void stm32_spi3select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
+#ifdef CONFIG_STM32L4_SPI3
+void stm32l4_spi3select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
}
-uint8_t stm32_spi3status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
+uint8_t stm32l4_spi3status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
{
return 0;
}
#endif
/****************************************************************************
- * Name: stm32_spi1cmddata
+ * Name: stm32l4_spi1cmddata
*
* Description:
* Set or clear the SH1101A A0 or SD1306 D/C n bit to select data (true)
@@ -221,26 +221,26 @@ uint8_t stm32_spi3status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
****************************************************************************/
#ifdef CONFIG_SPI_CMDDATA
-#ifdef CONFIG_STM32_SPI1
-int stm32_spi1cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd)
+#ifdef CONFIG_STM32L4_SPI1
+int stm32l4_spi1cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd)
{
return OK;
}
#endif
-#ifdef CONFIG_STM32_SPI2
-int stm32_spi2cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd)
+#ifdef CONFIG_STM32L4_SPI2
+int stm32l4_spi2cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd)
{
return OK;
}
#endif
-#ifdef CONFIG_STM32_SPI3
-int stm32_spi3cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd)
+#ifdef CONFIG_STM32L4_SPI3
+int stm32l4_spi3cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd)
{
return OK;
}
#endif
#endif /* CONFIG_SPI_CMDDATA */
-#endif /* CONFIG_STM32_SPI1 || CONFIG_STM32_SPI2 || CONFIG_STM32_SPI3 */
+#endif /* CONFIG_STM32L4_SPI1 || CONFIG_STM32L4_SPI2 || CONFIG_STM32L4_SPI3 */
diff --git a/configs/nutiny-nuc120/nsh/defconfig b/configs/nutiny-nuc120/nsh/defconfig
index bf3c57c9f7c..a2966eee963 100644
--- a/configs/nutiny-nuc120/nsh/defconfig
+++ b/configs/nutiny-nuc120/nsh/defconfig
@@ -343,7 +343,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-efm32g880f128-stk/nsh/defconfig b/configs/olimex-efm32g880f128-stk/nsh/defconfig
index f9fab939a72..75527d42c7d 100644
--- a/configs/olimex-efm32g880f128-stk/nsh/defconfig
+++ b/configs/olimex-efm32g880f128-stk/nsh/defconfig
@@ -336,7 +336,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-lpc-h3131/nsh/defconfig b/configs/olimex-lpc-h3131/nsh/defconfig
index cb4e8d93053..26a8a77162d 100644
--- a/configs/olimex-lpc-h3131/nsh/defconfig
+++ b/configs/olimex-lpc-h3131/nsh/defconfig
@@ -309,7 +309,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-lpc1766stk/ftpc/defconfig b/configs/olimex-lpc1766stk/ftpc/defconfig
index 7a855b94ca5..63cec7f15e7 100644
--- a/configs/olimex-lpc1766stk/ftpc/defconfig
+++ b/configs/olimex-lpc1766stk/ftpc/defconfig
@@ -365,7 +365,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-lpc1766stk/hidmouse/defconfig b/configs/olimex-lpc1766stk/hidmouse/defconfig
index 13a89583382..f6cb6524a7d 100644
--- a/configs/olimex-lpc1766stk/hidmouse/defconfig
+++ b/configs/olimex-lpc1766stk/hidmouse/defconfig
@@ -379,7 +379,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-lpc1766stk/nsh/defconfig b/configs/olimex-lpc1766stk/nsh/defconfig
index 74c28f8946f..8d7473910d4 100644
--- a/configs/olimex-lpc1766stk/nsh/defconfig
+++ b/configs/olimex-lpc1766stk/nsh/defconfig
@@ -366,7 +366,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-lpc1766stk/nx/defconfig b/configs/olimex-lpc1766stk/nx/defconfig
index c2aa80529b2..5728b04b040 100644
--- a/configs/olimex-lpc1766stk/nx/defconfig
+++ b/configs/olimex-lpc1766stk/nx/defconfig
@@ -364,7 +364,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-lpc1766stk/usbmsc/defconfig b/configs/olimex-lpc1766stk/usbmsc/defconfig
index 75a87a08986..47fffba1f55 100644
--- a/configs/olimex-lpc1766stk/usbmsc/defconfig
+++ b/configs/olimex-lpc1766stk/usbmsc/defconfig
@@ -366,7 +366,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-lpc1766stk/usbserial/defconfig b/configs/olimex-lpc1766stk/usbserial/defconfig
index e84ff2871b5..14ddc45c0bf 100644
--- a/configs/olimex-lpc1766stk/usbserial/defconfig
+++ b/configs/olimex-lpc1766stk/usbserial/defconfig
@@ -366,7 +366,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-lpc1766stk/zmodem/defconfig b/configs/olimex-lpc1766stk/zmodem/defconfig
index f110982d336..b1faa163ca5 100644
--- a/configs/olimex-lpc1766stk/zmodem/defconfig
+++ b/configs/olimex-lpc1766stk/zmodem/defconfig
@@ -367,7 +367,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-lpc2378/nsh/defconfig b/configs/olimex-lpc2378/nsh/defconfig
index 6c82afc55af..7aa2abee469 100644
--- a/configs/olimex-lpc2378/nsh/defconfig
+++ b/configs/olimex-lpc2378/nsh/defconfig
@@ -279,7 +279,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-e407/discover/defconfig b/configs/olimex-stm32-e407/discover/defconfig
index b3a6708d1c0..6258b571f70 100644
--- a/configs/olimex-stm32-e407/discover/defconfig
+++ b/configs/olimex-stm32-e407/discover/defconfig
@@ -664,7 +664,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-e407/netnsh/defconfig b/configs/olimex-stm32-e407/netnsh/defconfig
index db9b5c84d92..5b545509a95 100644
--- a/configs/olimex-stm32-e407/netnsh/defconfig
+++ b/configs/olimex-stm32-e407/netnsh/defconfig
@@ -664,7 +664,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-e407/nsh/defconfig b/configs/olimex-stm32-e407/nsh/defconfig
index c5b7cc64589..b74992be34f 100644
--- a/configs/olimex-stm32-e407/nsh/defconfig
+++ b/configs/olimex-stm32-e407/nsh/defconfig
@@ -642,7 +642,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-e407/telnetd/defconfig b/configs/olimex-stm32-e407/telnetd/defconfig
index 003bbb29053..95cd79b0596 100644
--- a/configs/olimex-stm32-e407/telnetd/defconfig
+++ b/configs/olimex-stm32-e407/telnetd/defconfig
@@ -664,7 +664,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-e407/usbnsh/defconfig b/configs/olimex-stm32-e407/usbnsh/defconfig
index e2079db38b2..ca08e311f88 100644
--- a/configs/olimex-stm32-e407/usbnsh/defconfig
+++ b/configs/olimex-stm32-e407/usbnsh/defconfig
@@ -648,7 +648,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-e407/webserver/defconfig b/configs/olimex-stm32-e407/webserver/defconfig
index 4f369f8f8e2..9c68bf47a3a 100644
--- a/configs/olimex-stm32-e407/webserver/defconfig
+++ b/configs/olimex-stm32-e407/webserver/defconfig
@@ -664,7 +664,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-h405/usbnsh/defconfig b/configs/olimex-stm32-h405/usbnsh/defconfig
index 9037e4139f0..5d02b51b906 100644
--- a/configs/olimex-stm32-h405/usbnsh/defconfig
+++ b/configs/olimex-stm32-h405/usbnsh/defconfig
@@ -666,7 +666,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-h407/nsh/defconfig b/configs/olimex-stm32-h407/nsh/defconfig
index 33847bcca9a..8c44dd395b8 100644
--- a/configs/olimex-stm32-h407/nsh/defconfig
+++ b/configs/olimex-stm32-h407/nsh/defconfig
@@ -642,7 +642,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-p107/nsh/defconfig b/configs/olimex-stm32-p107/nsh/defconfig
index 430a2f84d79..65d116da375 100644
--- a/configs/olimex-stm32-p107/nsh/defconfig
+++ b/configs/olimex-stm32-p107/nsh/defconfig
@@ -631,7 +631,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-p207/nsh/defconfig b/configs/olimex-stm32-p207/nsh/defconfig
index b4454d37563..6f9a15d88f0 100644
--- a/configs/olimex-stm32-p207/nsh/defconfig
+++ b/configs/olimex-stm32-p207/nsh/defconfig
@@ -692,7 +692,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-p407/knsh/defconfig b/configs/olimex-stm32-p407/knsh/defconfig
index 51699bf7d8e..ec07cf7e059 100644
--- a/configs/olimex-stm32-p407/knsh/defconfig
+++ b/configs/olimex-stm32-p407/knsh/defconfig
@@ -654,7 +654,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-stm32-p407/nsh/defconfig b/configs/olimex-stm32-p407/nsh/defconfig
index f7fcfb08e28..ed41bffe55b 100644
--- a/configs/olimex-stm32-p407/nsh/defconfig
+++ b/configs/olimex-stm32-p407/nsh/defconfig
@@ -658,7 +658,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-strp711/nettest/defconfig b/configs/olimex-strp711/nettest/defconfig
index 45b867aaad0..80f439771a9 100644
--- a/configs/olimex-strp711/nettest/defconfig
+++ b/configs/olimex-strp711/nettest/defconfig
@@ -298,7 +298,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimex-strp711/nsh/defconfig b/configs/olimex-strp711/nsh/defconfig
index 60564945108..84f66ba8c29 100644
--- a/configs/olimex-strp711/nsh/defconfig
+++ b/configs/olimex-strp711/nsh/defconfig
@@ -302,7 +302,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimexino-stm32/can/defconfig b/configs/olimexino-stm32/can/defconfig
index 6a256641ce4..25eaf0aefcd 100644
--- a/configs/olimexino-stm32/can/defconfig
+++ b/configs/olimexino-stm32/can/defconfig
@@ -658,7 +658,7 @@ CONFIG_MAX_TASKS=12
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimexino-stm32/composite/defconfig b/configs/olimexino-stm32/composite/defconfig
index 05c32536eda..8eb861aff4a 100644
--- a/configs/olimexino-stm32/composite/defconfig
+++ b/configs/olimexino-stm32/composite/defconfig
@@ -658,7 +658,7 @@ CONFIG_MAX_TASKS=12
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimexino-stm32/nsh/defconfig b/configs/olimexino-stm32/nsh/defconfig
index ec8a8eccd87..7fb0682188d 100644
--- a/configs/olimexino-stm32/nsh/defconfig
+++ b/configs/olimexino-stm32/nsh/defconfig
@@ -657,7 +657,7 @@ CONFIG_MAX_TASKS=12
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimexino-stm32/smallnsh/defconfig b/configs/olimexino-stm32/smallnsh/defconfig
index fd151211691..fc5194b8ec1 100644
--- a/configs/olimexino-stm32/smallnsh/defconfig
+++ b/configs/olimexino-stm32/smallnsh/defconfig
@@ -639,7 +639,7 @@ CONFIG_MAX_TASKS=4
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/olimexino-stm32/tiny/defconfig b/configs/olimexino-stm32/tiny/defconfig
index 3623a1cdbac..9991232442c 100644
--- a/configs/olimexino-stm32/tiny/defconfig
+++ b/configs/olimexino-stm32/tiny/defconfig
@@ -639,7 +639,7 @@ CONFIG_MAX_TASKS=4
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/open1788/knsh/defconfig b/configs/open1788/knsh/defconfig
index d34c2b7ff83..a4be59b0628 100644
--- a/configs/open1788/knsh/defconfig
+++ b/configs/open1788/knsh/defconfig
@@ -366,7 +366,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/open1788/nsh/defconfig b/configs/open1788/nsh/defconfig
index aec38042579..bcfeb085dec 100644
--- a/configs/open1788/nsh/defconfig
+++ b/configs/open1788/nsh/defconfig
@@ -364,7 +364,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/open1788/nxlines/defconfig b/configs/open1788/nxlines/defconfig
index beda60dd82b..e419534665f 100644
--- a/configs/open1788/nxlines/defconfig
+++ b/configs/open1788/nxlines/defconfig
@@ -398,7 +398,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/p112/ostest/defconfig b/configs/p112/ostest/defconfig
index a7fc5e77483..247254f1c69 100644
--- a/configs/p112/ostest/defconfig
+++ b/configs/p112/ostest/defconfig
@@ -206,7 +206,7 @@ CONFIG_START_YEAR=2007
CONFIG_START_MONTH=2
CONFIG_START_DAY=21
# CONFIG_DEV_CONSOLE is not set
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
# CONFIG_PRIORITY_INHERITANCE is not set
# CONFIG_FDCLONE_DISABLE is not set
# CONFIG_FDCLONE_STDIO is not set
diff --git a/configs/pcblogic-pic32mx/nsh/defconfig b/configs/pcblogic-pic32mx/nsh/defconfig
index d8c64680a6e..a7c11b2d0d2 100644
--- a/configs/pcblogic-pic32mx/nsh/defconfig
+++ b/configs/pcblogic-pic32mx/nsh/defconfig
@@ -380,7 +380,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/pcduino-a10/nsh/defconfig b/configs/pcduino-a10/nsh/defconfig
index f181819f2db..c6402c0564e 100644
--- a/configs/pcduino-a10/nsh/defconfig
+++ b/configs/pcduino-a10/nsh/defconfig
@@ -367,7 +367,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/photon/nsh/defconfig b/configs/photon/nsh/defconfig
index 9e808a75f34..f11b644af39 100644
--- a/configs/photon/nsh/defconfig
+++ b/configs/photon/nsh/defconfig
@@ -636,7 +636,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/photon/usbnsh/defconfig b/configs/photon/usbnsh/defconfig
index c6326b54df0..8b0111b3262 100644
--- a/configs/photon/usbnsh/defconfig
+++ b/configs/photon/usbnsh/defconfig
@@ -637,7 +637,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/pic32mx-starterkit/nsh/defconfig b/configs/pic32mx-starterkit/nsh/defconfig
index 6046b8b420f..6f887072a32 100644
--- a/configs/pic32mx-starterkit/nsh/defconfig
+++ b/configs/pic32mx-starterkit/nsh/defconfig
@@ -386,7 +386,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/pic32mx-starterkit/nsh2/defconfig b/configs/pic32mx-starterkit/nsh2/defconfig
index c437b0d3140..97f66c82f13 100644
--- a/configs/pic32mx-starterkit/nsh2/defconfig
+++ b/configs/pic32mx-starterkit/nsh2/defconfig
@@ -397,7 +397,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/pic32mx7mmb/nsh/defconfig b/configs/pic32mx7mmb/nsh/defconfig
index 5b0c7bb0e43..929fecc497b 100644
--- a/configs/pic32mx7mmb/nsh/defconfig
+++ b/configs/pic32mx7mmb/nsh/defconfig
@@ -406,7 +406,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/pic32mz-starterkit/nsh/defconfig b/configs/pic32mz-starterkit/nsh/defconfig
index 6122f7b9e80..35589060bc0 100644
--- a/configs/pic32mz-starterkit/nsh/defconfig
+++ b/configs/pic32mz-starterkit/nsh/defconfig
@@ -313,7 +313,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/qemu-i486/nsh/defconfig b/configs/qemu-i486/nsh/defconfig
index 33163950fa5..b925e48dcc5 100644
--- a/configs/qemu-i486/nsh/defconfig
+++ b/configs/qemu-i486/nsh/defconfig
@@ -206,7 +206,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-CONFIG_MUTEX_TYPES=y
+CONFIG_PTHREAD_MUTEX_TYPES=y
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/qemu-i486/ostest/defconfig b/configs/qemu-i486/ostest/defconfig
index 2aa95a3aa8b..5176deaa7ed 100644
--- a/configs/qemu-i486/ostest/defconfig
+++ b/configs/qemu-i486/ostest/defconfig
@@ -206,7 +206,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-CONFIG_MUTEX_TYPES=y
+CONFIG_PTHREAD_MUTEX_TYPES=y
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sabre-6quad/nsh/defconfig b/configs/sabre-6quad/nsh/defconfig
index 015d44dc6db..0caeea21387 100644
--- a/configs/sabre-6quad/nsh/defconfig
+++ b/configs/sabre-6quad/nsh/defconfig
@@ -322,7 +322,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sabre-6quad/smp/defconfig b/configs/sabre-6quad/smp/defconfig
index a2544273b96..1aec2d84edd 100644
--- a/configs/sabre-6quad/smp/defconfig
+++ b/configs/sabre-6quad/smp/defconfig
@@ -327,7 +327,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam3u-ek/knsh/defconfig b/configs/sam3u-ek/knsh/defconfig
index 6af0730c6ce..1bac14a8602 100644
--- a/configs/sam3u-ek/knsh/defconfig
+++ b/configs/sam3u-ek/knsh/defconfig
@@ -389,7 +389,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam3u-ek/nsh/defconfig b/configs/sam3u-ek/nsh/defconfig
index 0925cb868dd..39d9271e1f7 100644
--- a/configs/sam3u-ek/nsh/defconfig
+++ b/configs/sam3u-ek/nsh/defconfig
@@ -388,7 +388,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam3u-ek/nx/defconfig b/configs/sam3u-ek/nx/defconfig
index 36987fc43bd..836d29844c6 100644
--- a/configs/sam3u-ek/nx/defconfig
+++ b/configs/sam3u-ek/nx/defconfig
@@ -383,7 +383,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam3u-ek/nxwm/defconfig b/configs/sam3u-ek/nxwm/defconfig
index 32a587d239e..f6ac263211f 100644
--- a/configs/sam3u-ek/nxwm/defconfig
+++ b/configs/sam3u-ek/nxwm/defconfig
@@ -395,7 +395,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam4cmp-db/nsh/defconfig b/configs/sam4cmp-db/nsh/defconfig
index 0fa5131213c..c7e96c2425a 100644
--- a/configs/sam4cmp-db/nsh/defconfig
+++ b/configs/sam4cmp-db/nsh/defconfig
@@ -400,7 +400,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam4e-ek/nsh/defconfig b/configs/sam4e-ek/nsh/defconfig
index e1c0a93e79d..7eff414e3dd 100644
--- a/configs/sam4e-ek/nsh/defconfig
+++ b/configs/sam4e-ek/nsh/defconfig
@@ -433,7 +433,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam4e-ek/nxwm/defconfig b/configs/sam4e-ek/nxwm/defconfig
index 1042d449961..27ee8c8d623 100644
--- a/configs/sam4e-ek/nxwm/defconfig
+++ b/configs/sam4e-ek/nxwm/defconfig
@@ -441,7 +441,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam4e-ek/usbnsh/defconfig b/configs/sam4e-ek/usbnsh/defconfig
index 5164a20c335..68f8fe5e1fb 100644
--- a/configs/sam4e-ek/usbnsh/defconfig
+++ b/configs/sam4e-ek/usbnsh/defconfig
@@ -439,7 +439,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam4l-xplained/nsh/defconfig b/configs/sam4l-xplained/nsh/defconfig
index 05a66746b60..34b6e440434 100644
--- a/configs/sam4l-xplained/nsh/defconfig
+++ b/configs/sam4l-xplained/nsh/defconfig
@@ -406,7 +406,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam4s-xplained-pro/nsh/defconfig b/configs/sam4s-xplained-pro/nsh/defconfig
index 4c976fd6034..1e32e6a8f61 100644
--- a/configs/sam4s-xplained-pro/nsh/defconfig
+++ b/configs/sam4s-xplained-pro/nsh/defconfig
@@ -427,7 +427,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sam4s-xplained/nsh/defconfig b/configs/sam4s-xplained/nsh/defconfig
index 842ca375097..2f62a8f4ba3 100644
--- a/configs/sam4s-xplained/nsh/defconfig
+++ b/configs/sam4s-xplained/nsh/defconfig
@@ -386,7 +386,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d2-xult/nsh/defconfig b/configs/sama5d2-xult/nsh/defconfig
index a8c89702f89..9ea5e61920b 100644
--- a/configs/sama5d2-xult/nsh/defconfig
+++ b/configs/sama5d2-xult/nsh/defconfig
@@ -462,7 +462,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3-xplained/bridge/defconfig b/configs/sama5d3-xplained/bridge/defconfig
index 7d9d6b72be0..832bcc3d953 100644
--- a/configs/sama5d3-xplained/bridge/defconfig
+++ b/configs/sama5d3-xplained/bridge/defconfig
@@ -460,7 +460,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3-xplained/nsh/defconfig b/configs/sama5d3-xplained/nsh/defconfig
index 16fae225842..6e7fed8017d 100644
--- a/configs/sama5d3-xplained/nsh/defconfig
+++ b/configs/sama5d3-xplained/nsh/defconfig
@@ -425,7 +425,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3x-ek/demo/defconfig b/configs/sama5d3x-ek/demo/defconfig
index e9bcf44a911..8f2c5d2cd38 100644
--- a/configs/sama5d3x-ek/demo/defconfig
+++ b/configs/sama5d3x-ek/demo/defconfig
@@ -488,7 +488,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3x-ek/hello/defconfig b/configs/sama5d3x-ek/hello/defconfig
index 87c1c7fdcea..db156cbd32c 100644
--- a/configs/sama5d3x-ek/hello/defconfig
+++ b/configs/sama5d3x-ek/hello/defconfig
@@ -407,7 +407,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3x-ek/norboot/defconfig b/configs/sama5d3x-ek/norboot/defconfig
index 9d3b19e90df..56ffd88c53f 100644
--- a/configs/sama5d3x-ek/norboot/defconfig
+++ b/configs/sama5d3x-ek/norboot/defconfig
@@ -421,7 +421,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3x-ek/nsh/defconfig b/configs/sama5d3x-ek/nsh/defconfig
index a0aef06837d..9854da03469 100644
--- a/configs/sama5d3x-ek/nsh/defconfig
+++ b/configs/sama5d3x-ek/nsh/defconfig
@@ -424,7 +424,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3x-ek/nx/defconfig b/configs/sama5d3x-ek/nx/defconfig
index 84a38dafe22..9d50e995e5b 100644
--- a/configs/sama5d3x-ek/nx/defconfig
+++ b/configs/sama5d3x-ek/nx/defconfig
@@ -466,7 +466,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3x-ek/nxplayer/defconfig b/configs/sama5d3x-ek/nxplayer/defconfig
index 206402ce0bf..f5f62d6b779 100644
--- a/configs/sama5d3x-ek/nxplayer/defconfig
+++ b/configs/sama5d3x-ek/nxplayer/defconfig
@@ -485,7 +485,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3x-ek/nxwm/defconfig b/configs/sama5d3x-ek/nxwm/defconfig
index 3441a0c134c..e8ae80a84a6 100644
--- a/configs/sama5d3x-ek/nxwm/defconfig
+++ b/configs/sama5d3x-ek/nxwm/defconfig
@@ -500,7 +500,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d3x-ek/ov2640/defconfig b/configs/sama5d3x-ek/ov2640/defconfig
index fb54648635c..76c5dcf66db 100644
--- a/configs/sama5d3x-ek/ov2640/defconfig
+++ b/configs/sama5d3x-ek/ov2640/defconfig
@@ -472,7 +472,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d4-ek/at25boot/defconfig b/configs/sama5d4-ek/at25boot/defconfig
index fbd3b3db804..7eb4be0921f 100644
--- a/configs/sama5d4-ek/at25boot/defconfig
+++ b/configs/sama5d4-ek/at25boot/defconfig
@@ -450,7 +450,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d4-ek/bridge/defconfig b/configs/sama5d4-ek/bridge/defconfig
index 41e9f161085..231ddb7907d 100644
--- a/configs/sama5d4-ek/bridge/defconfig
+++ b/configs/sama5d4-ek/bridge/defconfig
@@ -478,7 +478,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d4-ek/dramboot/defconfig b/configs/sama5d4-ek/dramboot/defconfig
index dca1c2fd9bd..99a516b291f 100644
--- a/configs/sama5d4-ek/dramboot/defconfig
+++ b/configs/sama5d4-ek/dramboot/defconfig
@@ -443,7 +443,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d4-ek/elf/defconfig b/configs/sama5d4-ek/elf/defconfig
index d6e280da0db..fcbad459928 100644
--- a/configs/sama5d4-ek/elf/defconfig
+++ b/configs/sama5d4-ek/elf/defconfig
@@ -453,7 +453,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d4-ek/ipv6/defconfig b/configs/sama5d4-ek/ipv6/defconfig
index 71cfd5ca4bf..d83898fe048 100644
--- a/configs/sama5d4-ek/ipv6/defconfig
+++ b/configs/sama5d4-ek/ipv6/defconfig
@@ -577,7 +577,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d4-ek/knsh/defconfig b/configs/sama5d4-ek/knsh/defconfig
index f05ae86fbcf..e617e8e206a 100644
--- a/configs/sama5d4-ek/knsh/defconfig
+++ b/configs/sama5d4-ek/knsh/defconfig
@@ -470,7 +470,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d4-ek/knsh/defconfig.ROMFS b/configs/sama5d4-ek/knsh/defconfig.ROMFS
index a7fd05ca588..191c970fff5 100644
--- a/configs/sama5d4-ek/knsh/defconfig.ROMFS
+++ b/configs/sama5d4-ek/knsh/defconfig.ROMFS
@@ -381,7 +381,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
#
diff --git a/configs/sama5d4-ek/nsh/defconfig b/configs/sama5d4-ek/nsh/defconfig
index 37571f3a5a1..67627b55674 100644
--- a/configs/sama5d4-ek/nsh/defconfig
+++ b/configs/sama5d4-ek/nsh/defconfig
@@ -577,7 +577,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d4-ek/nxwm/defconfig b/configs/sama5d4-ek/nxwm/defconfig
index a3086ea7d67..f2dbc256a60 100644
--- a/configs/sama5d4-ek/nxwm/defconfig
+++ b/configs/sama5d4-ek/nxwm/defconfig
@@ -549,7 +549,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sama5d4-ek/ramtest/defconfig b/configs/sama5d4-ek/ramtest/defconfig
index c2d98e526f3..b5466c4c026 100644
--- a/configs/sama5d4-ek/ramtest/defconfig
+++ b/configs/sama5d4-ek/ramtest/defconfig
@@ -442,7 +442,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/samd20-xplained/nsh/defconfig b/configs/samd20-xplained/nsh/defconfig
index 307e424afd6..9985c9cc063 100644
--- a/configs/samd20-xplained/nsh/defconfig
+++ b/configs/samd20-xplained/nsh/defconfig
@@ -369,7 +369,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/samd21-xplained/nsh/defconfig b/configs/samd21-xplained/nsh/defconfig
index 03026a8376c..1f42da0c984 100644
--- a/configs/samd21-xplained/nsh/defconfig
+++ b/configs/samd21-xplained/nsh/defconfig
@@ -367,7 +367,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/same70-xplained/netnsh/defconfig b/configs/same70-xplained/netnsh/defconfig
index d472559ad8c..804f41e4fcc 100644
--- a/configs/same70-xplained/netnsh/defconfig
+++ b/configs/same70-xplained/netnsh/defconfig
@@ -452,7 +452,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/same70-xplained/nsh/defconfig b/configs/same70-xplained/nsh/defconfig
index 80f1fbf9d2f..106f2498140 100644
--- a/configs/same70-xplained/nsh/defconfig
+++ b/configs/same70-xplained/nsh/defconfig
@@ -437,7 +437,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/saml21-xplained/nsh/defconfig b/configs/saml21-xplained/nsh/defconfig
index feb9aa82d4f..aab99883996 100644
--- a/configs/saml21-xplained/nsh/defconfig
+++ b/configs/saml21-xplained/nsh/defconfig
@@ -355,7 +355,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/samv71-xult/README.txt b/configs/samv71-xult/README.txt
index 5821d14b4f6..c9638512594 100644
--- a/configs/samv71-xult/README.txt
+++ b/configs/samv71-xult/README.txt
@@ -749,6 +749,19 @@ Selecting the GMAC peripheral
CONFIG_NSH_NOMAC=n : We will get the IP address from EEPROM
: Defaults should be okay for other options
+SAMV71 Versions
+---------------
+
+WARNING: The newer SAMV71 have 6 GMAC queues, not 3. All queues must be
+configured for the GMAC to work correctly, even the queues that you are not
+using (you can just configure these queues with a very small ring buffer.)
+
+The older uses the Cortex-M7 core r0p1 and the newer r1p1 revisions. The
+SAMV71 revisions are called "rev A" (or sometimes "MRLA") and "rev B"
+("MRLB"). There should be a small "A" or "B" on the chip package just below
+the reference and you can also differentiate them at runtime with the
+VERSION field in the CHIPID CIDR register.
+
Cache-Related Issues
--------------------
diff --git a/configs/samv71-xult/knsh/defconfig b/configs/samv71-xult/knsh/defconfig
index ebbb97e10d1..c23bda38ee5 100644
--- a/configs/samv71-xult/knsh/defconfig
+++ b/configs/samv71-xult/knsh/defconfig
@@ -445,7 +445,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/samv71-xult/module/defconfig b/configs/samv71-xult/module/defconfig
index 414a1893b4a..e4172937e3b 100644
--- a/configs/samv71-xult/module/defconfig
+++ b/configs/samv71-xult/module/defconfig
@@ -420,7 +420,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/samv71-xult/mxtxplnd/defconfig b/configs/samv71-xult/mxtxplnd/defconfig
index be79a3cec8f..d34d7ffdac5 100644
--- a/configs/samv71-xult/mxtxplnd/defconfig
+++ b/configs/samv71-xult/mxtxplnd/defconfig
@@ -438,7 +438,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/samv71-xult/netnsh/defconfig b/configs/samv71-xult/netnsh/defconfig
index a38656d9c1a..395fe4df825 100644
--- a/configs/samv71-xult/netnsh/defconfig
+++ b/configs/samv71-xult/netnsh/defconfig
@@ -96,6 +96,7 @@ CONFIG_ARCH="arm"
# CONFIG_ARCH_CHIP_LPC2378 is not set
# CONFIG_ARCH_CHIP_LPC31XX is not set
# CONFIG_ARCH_CHIP_LPC43XX is not set
+# CONFIG_ARCH_CHIP_MOXART is not set
# CONFIG_ARCH_CHIP_NUC1XX is not set
# CONFIG_ARCH_CHIP_SAMA5 is not set
# CONFIG_ARCH_CHIP_SAMD is not set
@@ -107,7 +108,7 @@ CONFIG_ARCH_CHIP_SAMV7=y
# CONFIG_ARCH_CHIP_STM32L4 is not set
# CONFIG_ARCH_CHIP_STR71X is not set
# CONFIG_ARCH_CHIP_TMS570 is not set
-# CONFIG_ARCH_CHIP_MOXART is not set
+# CONFIG_ARCH_CHIP_XMC4 is not set
# CONFIG_ARCH_ARM7TDMI is not set
# CONFIG_ARCH_ARM926EJS is not set
# CONFIG_ARCH_ARM920T is not set
@@ -455,7 +456,10 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
+# CONFIG_PTHREAD_MUTEX_UNSAFE is not set
+# CONFIG_PTHREAD_MUTEX_BOTH is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
@@ -1159,6 +1163,7 @@ CONFIG_EXAMPLES_NSH=y
# CONFIG_EXAMPLES_USBSERIAL is not set
# CONFIG_EXAMPLES_WATCHDOG is not set
# CONFIG_EXAMPLES_WEBSERVER is not set
+# CONFIG_EXAMPLES_XBC_TEST is not set
#
# File System Utilities
diff --git a/configs/samv71-xult/nsh/defconfig b/configs/samv71-xult/nsh/defconfig
index ce85bb673ba..99e63b5e889 100644
--- a/configs/samv71-xult/nsh/defconfig
+++ b/configs/samv71-xult/nsh/defconfig
@@ -440,7 +440,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/samv71-xult/nxwm/defconfig b/configs/samv71-xult/nxwm/defconfig
index e5246ecafad..19da1735acc 100644
--- a/configs/samv71-xult/nxwm/defconfig
+++ b/configs/samv71-xult/nxwm/defconfig
@@ -439,7 +439,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/samv71-xult/vnc/defconfig b/configs/samv71-xult/vnc/defconfig
index 00e4ca6bcac..b547b6f685b 100644
--- a/configs/samv71-xult/vnc/defconfig
+++ b/configs/samv71-xult/vnc/defconfig
@@ -454,7 +454,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/samv71-xult/vnxwm/defconfig b/configs/samv71-xult/vnxwm/defconfig
index 2606fbbcabb..d8c8863cb62 100644
--- a/configs/samv71-xult/vnxwm/defconfig
+++ b/configs/samv71-xult/vnxwm/defconfig
@@ -455,7 +455,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/shenzhou/nsh/defconfig b/configs/shenzhou/nsh/defconfig
index 60caa4bafc1..1f26e5a9cac 100644
--- a/configs/shenzhou/nsh/defconfig
+++ b/configs/shenzhou/nsh/defconfig
@@ -651,7 +651,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/shenzhou/nxwm/defconfig b/configs/shenzhou/nxwm/defconfig
index e82a839ed32..3fb83b792ad 100644
--- a/configs/shenzhou/nxwm/defconfig
+++ b/configs/shenzhou/nxwm/defconfig
@@ -674,7 +674,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/shenzhou/thttpd/defconfig b/configs/shenzhou/thttpd/defconfig
index b8feba27ea9..e005e95bdac 100644
--- a/configs/shenzhou/thttpd/defconfig
+++ b/configs/shenzhou/thttpd/defconfig
@@ -652,7 +652,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/bas/defconfig b/configs/sim/bas/defconfig
index a5aece53f17..0c0dee9bf7d 100644
--- a/configs/sim/bas/defconfig
+++ b/configs/sim/bas/defconfig
@@ -208,7 +208,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/cxxtest/defconfig b/configs/sim/cxxtest/defconfig
index 596267b5793..ba004c13cf6 100644
--- a/configs/sim/cxxtest/defconfig
+++ b/configs/sim/cxxtest/defconfig
@@ -201,7 +201,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-CONFIG_MUTEX_TYPES=y
+CONFIG_PTHREAD_MUTEX_TYPES=y
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/minibasic/defconfig b/configs/sim/minibasic/defconfig
index 84aa2c94b98..b676b55e19c 100644
--- a/configs/sim/minibasic/defconfig
+++ b/configs/sim/minibasic/defconfig
@@ -235,7 +235,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/mount/defconfig b/configs/sim/mount/defconfig
index 5bae00f40b4..e36e9cd8fb5 100644
--- a/configs/sim/mount/defconfig
+++ b/configs/sim/mount/defconfig
@@ -201,7 +201,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/mtdrwb/defconfig b/configs/sim/mtdrwb/defconfig
index c7ea3c48252..24bd24353c5 100644
--- a/configs/sim/mtdrwb/defconfig
+++ b/configs/sim/mtdrwb/defconfig
@@ -201,7 +201,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/nettest/defconfig b/configs/sim/nettest/defconfig
index 3209c63ae49..14b60be76ef 100644
--- a/configs/sim/nettest/defconfig
+++ b/configs/sim/nettest/defconfig
@@ -201,7 +201,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/nsh/defconfig b/configs/sim/nsh/defconfig
index 683dc18657f..3479b545db1 100644
--- a/configs/sim/nsh/defconfig
+++ b/configs/sim/nsh/defconfig
@@ -208,7 +208,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/nsh2/defconfig b/configs/sim/nsh2/defconfig
index c9798d1df2e..52984d9d7ad 100644
--- a/configs/sim/nsh2/defconfig
+++ b/configs/sim/nsh2/defconfig
@@ -216,7 +216,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/nx/defconfig b/configs/sim/nx/defconfig
index 8450147a06e..22c51e7e581 100644
--- a/configs/sim/nx/defconfig
+++ b/configs/sim/nx/defconfig
@@ -205,7 +205,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/nx11/defconfig b/configs/sim/nx11/defconfig
index 54d0ba8c5d1..96a4d289905 100644
--- a/configs/sim/nx11/defconfig
+++ b/configs/sim/nx11/defconfig
@@ -206,7 +206,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/nxlines/defconfig b/configs/sim/nxlines/defconfig
index a63927a3e31..c162a7afcff 100644
--- a/configs/sim/nxlines/defconfig
+++ b/configs/sim/nxlines/defconfig
@@ -216,7 +216,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/nxwm/defconfig b/configs/sim/nxwm/defconfig
index 254409eab35..18d7c70572f 100644
--- a/configs/sim/nxwm/defconfig
+++ b/configs/sim/nxwm/defconfig
@@ -211,7 +211,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/ostest/defconfig b/configs/sim/ostest/defconfig
index be0f68fdce4..d13dc5b9911 100644
--- a/configs/sim/ostest/defconfig
+++ b/configs/sim/ostest/defconfig
@@ -202,7 +202,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-CONFIG_MUTEX_TYPES=y
+CONFIG_PTHREAD_MUTEX_TYPES=y
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/pashello/defconfig b/configs/sim/pashello/defconfig
index 2f30e200bb6..60484d09927 100644
--- a/configs/sim/pashello/defconfig
+++ b/configs/sim/pashello/defconfig
@@ -201,7 +201,8 @@ CONFIG_MAX_TASKS=64
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/touchscreen/defconfig b/configs/sim/touchscreen/defconfig
index 5b1f3360d67..c4a3c418379 100644
--- a/configs/sim/touchscreen/defconfig
+++ b/configs/sim/touchscreen/defconfig
@@ -216,7 +216,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/traveler/defconfig b/configs/sim/traveler/defconfig
index 9711d234311..833646bb93a 100644
--- a/configs/sim/traveler/defconfig
+++ b/configs/sim/traveler/defconfig
@@ -209,7 +209,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/udgram/defconfig b/configs/sim/udgram/defconfig
index c92e6efaa9a..87e97419c1b 100644
--- a/configs/sim/udgram/defconfig
+++ b/configs/sim/udgram/defconfig
@@ -208,7 +208,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/unionfs/defconfig b/configs/sim/unionfs/defconfig
index 513b70747bc..fbf56e5a9d3 100644
--- a/configs/sim/unionfs/defconfig
+++ b/configs/sim/unionfs/defconfig
@@ -208,7 +208,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sim/ustream/defconfig b/configs/sim/ustream/defconfig
index df0ab89e15b..3b4cf6bdd29 100644
--- a/configs/sim/ustream/defconfig
+++ b/configs/sim/ustream/defconfig
@@ -208,7 +208,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/skp16c26/ostest/defconfig b/configs/skp16c26/ostest/defconfig
index 0edccdc2b4c..226e13967be 100644
--- a/configs/skp16c26/ostest/defconfig
+++ b/configs/skp16c26/ostest/defconfig
@@ -196,7 +196,8 @@ CONFIG_MAX_TASKS=8
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/spark/composite/defconfig b/configs/spark/composite/defconfig
index 2fc6bc1b434..4c53bfb69fd 100644
--- a/configs/spark/composite/defconfig
+++ b/configs/spark/composite/defconfig
@@ -627,7 +627,7 @@ CONFIG_MAX_TASKS=12
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/spark/nsh/defconfig b/configs/spark/nsh/defconfig
index 9a4ef0b4d4c..2768858395d 100644
--- a/configs/spark/nsh/defconfig
+++ b/configs/spark/nsh/defconfig
@@ -627,7 +627,7 @@ CONFIG_MAX_TASKS=12
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/spark/usbmsc/defconfig b/configs/spark/usbmsc/defconfig
index 243b2b1d60e..bf8b9101fce 100644
--- a/configs/spark/usbmsc/defconfig
+++ b/configs/spark/usbmsc/defconfig
@@ -627,7 +627,7 @@ CONFIG_MAX_TASKS=12
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/spark/usbnsh/defconfig b/configs/spark/usbnsh/defconfig
index a64a14e621d..cb810ac38a1 100644
--- a/configs/spark/usbnsh/defconfig
+++ b/configs/spark/usbnsh/defconfig
@@ -626,7 +626,7 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/spark/usbserial/defconfig b/configs/spark/usbserial/defconfig
index c2014af2134..c50bae0087b 100644
--- a/configs/spark/usbserial/defconfig
+++ b/configs/spark/usbserial/defconfig
@@ -632,7 +632,8 @@ CONFIG_MAX_TASKS=12
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3210e-eval/composite/defconfig b/configs/stm3210e-eval/composite/defconfig
index 6cf922622e4..7293f13d642 100644
--- a/configs/stm3210e-eval/composite/defconfig
+++ b/configs/stm3210e-eval/composite/defconfig
@@ -647,7 +647,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3210e-eval/nsh/defconfig b/configs/stm3210e-eval/nsh/defconfig
index ddcf4b9d73e..de6c8fbadad 100644
--- a/configs/stm3210e-eval/nsh/defconfig
+++ b/configs/stm3210e-eval/nsh/defconfig
@@ -648,7 +648,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3210e-eval/nsh2/defconfig b/configs/stm3210e-eval/nsh2/defconfig
index 5b690bc2a62..846aceb4f81 100644
--- a/configs/stm3210e-eval/nsh2/defconfig
+++ b/configs/stm3210e-eval/nsh2/defconfig
@@ -664,7 +664,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3210e-eval/nx/defconfig b/configs/stm3210e-eval/nx/defconfig
index bbb17b0c789..72cffd064c8 100644
--- a/configs/stm3210e-eval/nx/defconfig
+++ b/configs/stm3210e-eval/nx/defconfig
@@ -651,7 +651,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3210e-eval/nxterm/defconfig b/configs/stm3210e-eval/nxterm/defconfig
index d749e44f360..2b7d5531d08 100644
--- a/configs/stm3210e-eval/nxterm/defconfig
+++ b/configs/stm3210e-eval/nxterm/defconfig
@@ -644,7 +644,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3210e-eval/pm/defconfig b/configs/stm3210e-eval/pm/defconfig
index b1156be57c0..301b8afa073 100644
--- a/configs/stm3210e-eval/pm/defconfig
+++ b/configs/stm3210e-eval/pm/defconfig
@@ -664,7 +664,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3210e-eval/usbmsc/defconfig b/configs/stm3210e-eval/usbmsc/defconfig
index 925f75940bc..62b5513ad48 100644
--- a/configs/stm3210e-eval/usbmsc/defconfig
+++ b/configs/stm3210e-eval/usbmsc/defconfig
@@ -638,7 +638,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3210e-eval/usbserial/defconfig b/configs/stm3210e-eval/usbserial/defconfig
index fc7bc986785..6506425af5b 100644
--- a/configs/stm3210e-eval/usbserial/defconfig
+++ b/configs/stm3210e-eval/usbserial/defconfig
@@ -630,7 +630,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3220g-eval/nsh/defconfig b/configs/stm3220g-eval/nsh/defconfig
index a9fbdf2f6d5..bf701594419 100644
--- a/configs/stm3220g-eval/nsh/defconfig
+++ b/configs/stm3220g-eval/nsh/defconfig
@@ -670,7 +670,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3220g-eval/nsh2/defconfig b/configs/stm3220g-eval/nsh2/defconfig
index 0d0ae9af74c..a443c30f5ce 100644
--- a/configs/stm3220g-eval/nsh2/defconfig
+++ b/configs/stm3220g-eval/nsh2/defconfig
@@ -671,7 +671,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3220g-eval/nxwm/defconfig b/configs/stm3220g-eval/nxwm/defconfig
index 66c4046191a..50cf143791e 100644
--- a/configs/stm3220g-eval/nxwm/defconfig
+++ b/configs/stm3220g-eval/nxwm/defconfig
@@ -690,7 +690,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3240g-eval/discover/defconfig b/configs/stm3240g-eval/discover/defconfig
index 59971c43a9d..ce7c4a8083f 100644
--- a/configs/stm3240g-eval/discover/defconfig
+++ b/configs/stm3240g-eval/discover/defconfig
@@ -669,7 +669,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3240g-eval/knxwm/defconfig b/configs/stm3240g-eval/knxwm/defconfig
index d7ed1665f3e..f1925469d88 100644
--- a/configs/stm3240g-eval/knxwm/defconfig
+++ b/configs/stm3240g-eval/knxwm/defconfig
@@ -684,7 +684,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3240g-eval/nsh/defconfig b/configs/stm3240g-eval/nsh/defconfig
index 6d23dd4164f..9b5c354ee79 100644
--- a/configs/stm3240g-eval/nsh/defconfig
+++ b/configs/stm3240g-eval/nsh/defconfig
@@ -684,7 +684,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3240g-eval/nsh2/defconfig b/configs/stm3240g-eval/nsh2/defconfig
index 39db64c7ef7..18727a8f64d 100644
--- a/configs/stm3240g-eval/nsh2/defconfig
+++ b/configs/stm3240g-eval/nsh2/defconfig
@@ -675,7 +675,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3240g-eval/nxterm/defconfig b/configs/stm3240g-eval/nxterm/defconfig
index 1ed096c2a7f..6e37ea5759b 100644
--- a/configs/stm3240g-eval/nxterm/defconfig
+++ b/configs/stm3240g-eval/nxterm/defconfig
@@ -694,7 +694,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3240g-eval/nxwm/defconfig b/configs/stm3240g-eval/nxwm/defconfig
index 52b8e8f8662..26bca3feb34 100644
--- a/configs/stm3240g-eval/nxwm/defconfig
+++ b/configs/stm3240g-eval/nxwm/defconfig
@@ -694,7 +694,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3240g-eval/webserver/defconfig b/configs/stm3240g-eval/webserver/defconfig
index 3f70a1200ad..ee8d9cded9f 100644
--- a/configs/stm3240g-eval/webserver/defconfig
+++ b/configs/stm3240g-eval/webserver/defconfig
@@ -674,7 +674,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm3240g-eval/xmlrpc/defconfig b/configs/stm3240g-eval/xmlrpc/defconfig
index 9ccfb0bce11..cd3838b5c71 100644
--- a/configs/stm3240g-eval/xmlrpc/defconfig
+++ b/configs/stm3240g-eval/xmlrpc/defconfig
@@ -664,7 +664,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32_tiny/nsh/defconfig b/configs/stm32_tiny/nsh/defconfig
index 86867909cb7..cb39c3b3266 100644
--- a/configs/stm32_tiny/nsh/defconfig
+++ b/configs/stm32_tiny/nsh/defconfig
@@ -616,7 +616,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32_tiny/usbnsh/defconfig b/configs/stm32_tiny/usbnsh/defconfig
index 91f0ec630c3..82b6a3f2fbe 100644
--- a/configs/stm32_tiny/usbnsh/defconfig
+++ b/configs/stm32_tiny/usbnsh/defconfig
@@ -610,7 +610,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32butterfly2/nsh/defconfig b/configs/stm32butterfly2/nsh/defconfig
index 4d265c86d51..cc58d6dc2f2 100644
--- a/configs/stm32butterfly2/nsh/defconfig
+++ b/configs/stm32butterfly2/nsh/defconfig
@@ -636,7 +636,7 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32butterfly2/nshnet/defconfig b/configs/stm32butterfly2/nshnet/defconfig
index fdd07367b5c..018450beca2 100644
--- a/configs/stm32butterfly2/nshnet/defconfig
+++ b/configs/stm32butterfly2/nshnet/defconfig
@@ -644,7 +644,7 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32butterfly2/nshusbdev/defconfig b/configs/stm32butterfly2/nshusbdev/defconfig
index f91b4a43a6c..cef7a6a75b9 100644
--- a/configs/stm32butterfly2/nshusbdev/defconfig
+++ b/configs/stm32butterfly2/nshusbdev/defconfig
@@ -629,7 +629,7 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32butterfly2/nshusbhost/defconfig b/configs/stm32butterfly2/nshusbhost/defconfig
index 4d265c86d51..cc58d6dc2f2 100644
--- a/configs/stm32butterfly2/nshusbhost/defconfig
+++ b/configs/stm32butterfly2/nshusbhost/defconfig
@@ -636,7 +636,7 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/audio_tone/defconfig b/configs/stm32f103-minimum/audio_tone/defconfig
index 3f25c9d311a..18a2d09978a 100644
--- a/configs/stm32f103-minimum/audio_tone/defconfig
+++ b/configs/stm32f103-minimum/audio_tone/defconfig
@@ -625,7 +625,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/buttons/defconfig b/configs/stm32f103-minimum/buttons/defconfig
index 5b19cd63bca..0312f7554be 100644
--- a/configs/stm32f103-minimum/buttons/defconfig
+++ b/configs/stm32f103-minimum/buttons/defconfig
@@ -612,7 +612,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/jlx12864g/defconfig b/configs/stm32f103-minimum/jlx12864g/defconfig
index 1dbd7601e9e..4a8569c3289 100644
--- a/configs/stm32f103-minimum/jlx12864g/defconfig
+++ b/configs/stm32f103-minimum/jlx12864g/defconfig
@@ -655,7 +655,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/nrf24/defconfig b/configs/stm32f103-minimum/nrf24/defconfig
index 23927f4d88f..a13598ba74a 100644
--- a/configs/stm32f103-minimum/nrf24/defconfig
+++ b/configs/stm32f103-minimum/nrf24/defconfig
@@ -651,7 +651,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/nsh/defconfig b/configs/stm32f103-minimum/nsh/defconfig
index 6c556483111..7664d88825d 100644
--- a/configs/stm32f103-minimum/nsh/defconfig
+++ b/configs/stm32f103-minimum/nsh/defconfig
@@ -611,7 +611,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/pwm/defconfig b/configs/stm32f103-minimum/pwm/defconfig
index 551c34e3e7e..d8b9bc38daa 100644
--- a/configs/stm32f103-minimum/pwm/defconfig
+++ b/configs/stm32f103-minimum/pwm/defconfig
@@ -619,7 +619,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/rfid-rc522/defconfig b/configs/stm32f103-minimum/rfid-rc522/defconfig
index 475d5f39854..a8daaf44f6b 100644
--- a/configs/stm32f103-minimum/rfid-rc522/defconfig
+++ b/configs/stm32f103-minimum/rfid-rc522/defconfig
@@ -619,7 +619,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/rgbled/defconfig b/configs/stm32f103-minimum/rgbled/defconfig
index b0adc1cbb35..bae4f13a9f0 100644
--- a/configs/stm32f103-minimum/rgbled/defconfig
+++ b/configs/stm32f103-minimum/rgbled/defconfig
@@ -639,7 +639,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/usbnsh/defconfig b/configs/stm32f103-minimum/usbnsh/defconfig
index decc71aa16e..e5319a27eb3 100644
--- a/configs/stm32f103-minimum/usbnsh/defconfig
+++ b/configs/stm32f103-minimum/usbnsh/defconfig
@@ -613,7 +613,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/userled/defconfig b/configs/stm32f103-minimum/userled/defconfig
index 5c93140792b..d49398b75d9 100644
--- a/configs/stm32f103-minimum/userled/defconfig
+++ b/configs/stm32f103-minimum/userled/defconfig
@@ -611,7 +611,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f103-minimum/veml6070/defconfig b/configs/stm32f103-minimum/veml6070/defconfig
index f9b79252f78..3d2065e1fad 100644
--- a/configs/stm32f103-minimum/veml6070/defconfig
+++ b/configs/stm32f103-minimum/veml6070/defconfig
@@ -623,7 +623,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f3discovery/nsh/defconfig b/configs/stm32f3discovery/nsh/defconfig
index 986acf8aa7f..2234c65bea3 100644
--- a/configs/stm32f3discovery/nsh/defconfig
+++ b/configs/stm32f3discovery/nsh/defconfig
@@ -634,7 +634,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f3discovery/usbnsh/defconfig b/configs/stm32f3discovery/usbnsh/defconfig
index d53ceee3f3d..c0686360857 100644
--- a/configs/stm32f3discovery/usbnsh/defconfig
+++ b/configs/stm32f3discovery/usbnsh/defconfig
@@ -641,7 +641,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f411e-disco/nsh/defconfig b/configs/stm32f411e-disco/nsh/defconfig
index 00551e986a0..da44560a907 100644
--- a/configs/stm32f411e-disco/nsh/defconfig
+++ b/configs/stm32f411e-disco/nsh/defconfig
@@ -612,7 +612,7 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f429i-disco/extflash/defconfig b/configs/stm32f429i-disco/extflash/defconfig
index 9fc151029cd..763981c2b85 100644
--- a/configs/stm32f429i-disco/extflash/defconfig
+++ b/configs/stm32f429i-disco/extflash/defconfig
@@ -668,7 +668,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f429i-disco/lcd/defconfig b/configs/stm32f429i-disco/lcd/defconfig
index ac6a69bf53b..f4510f5f180 100644
--- a/configs/stm32f429i-disco/lcd/defconfig
+++ b/configs/stm32f429i-disco/lcd/defconfig
@@ -659,7 +659,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f429i-disco/ltdc/defconfig b/configs/stm32f429i-disco/ltdc/defconfig
index 39417fd8253..d65a0739812 100644
--- a/configs/stm32f429i-disco/ltdc/defconfig
+++ b/configs/stm32f429i-disco/ltdc/defconfig
@@ -705,7 +705,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f429i-disco/nsh/defconfig b/configs/stm32f429i-disco/nsh/defconfig
index 5f5b994e944..c1c3bbce8d0 100644
--- a/configs/stm32f429i-disco/nsh/defconfig
+++ b/configs/stm32f429i-disco/nsh/defconfig
@@ -648,7 +648,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f429i-disco/nxwm/defconfig b/configs/stm32f429i-disco/nxwm/defconfig
index e7d1c8279a7..709795e9a01 100644
--- a/configs/stm32f429i-disco/nxwm/defconfig
+++ b/configs/stm32f429i-disco/nxwm/defconfig
@@ -670,7 +670,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f429i-disco/usbmsc/defconfig b/configs/stm32f429i-disco/usbmsc/defconfig
index 4a60f8b641e..28f46a636ec 100644
--- a/configs/stm32f429i-disco/usbmsc/defconfig
+++ b/configs/stm32f429i-disco/usbmsc/defconfig
@@ -663,7 +663,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f429i-disco/usbnsh/defconfig b/configs/stm32f429i-disco/usbnsh/defconfig
index 39445ee4d86..fce584c68ca 100644
--- a/configs/stm32f429i-disco/usbnsh/defconfig
+++ b/configs/stm32f429i-disco/usbnsh/defconfig
@@ -654,7 +654,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/canard/defconfig b/configs/stm32f4discovery/canard/defconfig
index 58b871fc8f9..f10465c2c01 100644
--- a/configs/stm32f4discovery/canard/defconfig
+++ b/configs/stm32f4discovery/canard/defconfig
@@ -664,7 +664,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/cxxtest/defconfig b/configs/stm32f4discovery/cxxtest/defconfig
index 875b00c1be9..9986935fc02 100644
--- a/configs/stm32f4discovery/cxxtest/defconfig
+++ b/configs/stm32f4discovery/cxxtest/defconfig
@@ -651,7 +651,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/elf/defconfig b/configs/stm32f4discovery/elf/defconfig
index 7d9209143d2..332126c7c79 100644
--- a/configs/stm32f4discovery/elf/defconfig
+++ b/configs/stm32f4discovery/elf/defconfig
@@ -652,7 +652,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/ipv6/defconfig b/configs/stm32f4discovery/ipv6/defconfig
index 83ea38b94c5..07aec89561d 100644
--- a/configs/stm32f4discovery/ipv6/defconfig
+++ b/configs/stm32f4discovery/ipv6/defconfig
@@ -694,7 +694,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/kostest/defconfig b/configs/stm32f4discovery/kostest/defconfig
index 6f2535b869b..0f4e7f28823 100644
--- a/configs/stm32f4discovery/kostest/defconfig
+++ b/configs/stm32f4discovery/kostest/defconfig
@@ -657,7 +657,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/netnsh/defconfig b/configs/stm32f4discovery/netnsh/defconfig
index f564769ca08..b07e47493d4 100644
--- a/configs/stm32f4discovery/netnsh/defconfig
+++ b/configs/stm32f4discovery/netnsh/defconfig
@@ -694,7 +694,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/nsh/defconfig b/configs/stm32f4discovery/nsh/defconfig
index 389c07a67dd..dcf72ec51b6 100644
--- a/configs/stm32f4discovery/nsh/defconfig
+++ b/configs/stm32f4discovery/nsh/defconfig
@@ -659,7 +659,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/nxlines/defconfig b/configs/stm32f4discovery/nxlines/defconfig
index 36523d0d385..ec02af8c748 100644
--- a/configs/stm32f4discovery/nxlines/defconfig
+++ b/configs/stm32f4discovery/nxlines/defconfig
@@ -660,7 +660,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/pm/defconfig b/configs/stm32f4discovery/pm/defconfig
index 3d080ba1d1b..96432718e45 100644
--- a/configs/stm32f4discovery/pm/defconfig
+++ b/configs/stm32f4discovery/pm/defconfig
@@ -666,7 +666,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/posix_spawn/defconfig b/configs/stm32f4discovery/posix_spawn/defconfig
index fa13076f968..1c8d37ccdd8 100644
--- a/configs/stm32f4discovery/posix_spawn/defconfig
+++ b/configs/stm32f4discovery/posix_spawn/defconfig
@@ -652,7 +652,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/pseudoterm/defconfig b/configs/stm32f4discovery/pseudoterm/defconfig
index 761a2b013c9..f894b7ace22 100644
--- a/configs/stm32f4discovery/pseudoterm/defconfig
+++ b/configs/stm32f4discovery/pseudoterm/defconfig
@@ -653,7 +653,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/rgbled/defconfig b/configs/stm32f4discovery/rgbled/defconfig
index 091fb6ff788..bd94652e9df 100644
--- a/configs/stm32f4discovery/rgbled/defconfig
+++ b/configs/stm32f4discovery/rgbled/defconfig
@@ -662,7 +662,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/uavcan/defconfig b/configs/stm32f4discovery/uavcan/defconfig
index 226fe4cb0e5..72cdd50da02 100644
--- a/configs/stm32f4discovery/uavcan/defconfig
+++ b/configs/stm32f4discovery/uavcan/defconfig
@@ -620,7 +620,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/usbnsh/defconfig b/configs/stm32f4discovery/usbnsh/defconfig
index 06dc85dfded..c76b16a4e94 100644
--- a/configs/stm32f4discovery/usbnsh/defconfig
+++ b/configs/stm32f4discovery/usbnsh/defconfig
@@ -665,7 +665,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f4discovery/winbuild/defconfig b/configs/stm32f4discovery/winbuild/defconfig
index 88058e6cfcb..db8d26e2ff9 100644
--- a/configs/stm32f4discovery/winbuild/defconfig
+++ b/configs/stm32f4discovery/winbuild/defconfig
@@ -551,7 +551,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
#
diff --git a/configs/stm32f4discovery/xen1210/defconfig b/configs/stm32f4discovery/xen1210/defconfig
index 5e76fbf79e1..b1c87f136ef 100644
--- a/configs/stm32f4discovery/xen1210/defconfig
+++ b/configs/stm32f4discovery/xen1210/defconfig
@@ -654,7 +654,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f746-ws/nsh/defconfig b/configs/stm32f746-ws/nsh/defconfig
index 8edcdb6f874..cf198fc2f6b 100644
--- a/configs/stm32f746-ws/nsh/defconfig
+++ b/configs/stm32f746-ws/nsh/defconfig
@@ -516,7 +516,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32f746g-disco/nsh/defconfig b/configs/stm32f746g-disco/nsh/defconfig
index 4d1625b4b11..f956e3bc169 100644
--- a/configs/stm32f746g-disco/nsh/defconfig
+++ b/configs/stm32f746g-disco/nsh/defconfig
@@ -493,7 +493,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32l476-mdk/nsh/defconfig b/configs/stm32l476-mdk/nsh/defconfig
index 3f2ce702a51..a529cb5fbf3 100644
--- a/configs/stm32l476-mdk/nsh/defconfig
+++ b/configs/stm32l476-mdk/nsh/defconfig
@@ -443,7 +443,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32l476vg-disco/nsh/defconfig b/configs/stm32l476vg-disco/nsh/defconfig
index 2e443d717af..76859b3105b 100644
--- a/configs/stm32l476vg-disco/nsh/defconfig
+++ b/configs/stm32l476vg-disco/nsh/defconfig
@@ -456,7 +456,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32ldiscovery/nsh/defconfig b/configs/stm32ldiscovery/nsh/defconfig
index 4c3ba206d6f..9c226c4dd4b 100644
--- a/configs/stm32ldiscovery/nsh/defconfig
+++ b/configs/stm32ldiscovery/nsh/defconfig
@@ -618,7 +618,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/stm32vldiscovery/nsh/defconfig b/configs/stm32vldiscovery/nsh/defconfig
index 7de8efbc971..d8387555228 100644
--- a/configs/stm32vldiscovery/nsh/defconfig
+++ b/configs/stm32vldiscovery/nsh/defconfig
@@ -628,7 +628,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sure-pic32mx/nsh/defconfig b/configs/sure-pic32mx/nsh/defconfig
index 25a6a219668..1205b4587ac 100644
--- a/configs/sure-pic32mx/nsh/defconfig
+++ b/configs/sure-pic32mx/nsh/defconfig
@@ -390,7 +390,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/sure-pic32mx/usbnsh/defconfig b/configs/sure-pic32mx/usbnsh/defconfig
index 87b387e3a10..2f230bb6c91 100644
--- a/configs/sure-pic32mx/usbnsh/defconfig
+++ b/configs/sure-pic32mx/usbnsh/defconfig
@@ -392,7 +392,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/teensy-2.0/usbmsc/defconfig b/configs/teensy-2.0/usbmsc/defconfig
index 5854699d35b..bb0ac4127e1 100644
--- a/configs/teensy-2.0/usbmsc/defconfig
+++ b/configs/teensy-2.0/usbmsc/defconfig
@@ -231,7 +231,8 @@ CONFIG_MAX_TASKS=8
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/teensy-3.x/nsh/defconfig b/configs/teensy-3.x/nsh/defconfig
index baafedd8201..ce5428eb7e5 100644
--- a/configs/teensy-3.x/nsh/defconfig
+++ b/configs/teensy-3.x/nsh/defconfig
@@ -387,7 +387,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/teensy-3.x/usbnsh/defconfig b/configs/teensy-3.x/usbnsh/defconfig
index e59d5d45ddc..b8d5a1086b8 100644
--- a/configs/teensy-3.x/usbnsh/defconfig
+++ b/configs/teensy-3.x/usbnsh/defconfig
@@ -384,7 +384,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/teensy-lc/nsh/defconfig b/configs/teensy-lc/nsh/defconfig
index f121ca5247b..a863cbaff9d 100644
--- a/configs/teensy-lc/nsh/defconfig
+++ b/configs/teensy-lc/nsh/defconfig
@@ -324,7 +324,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=0
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/tm4c123g-launchpad/nsh/defconfig b/configs/tm4c123g-launchpad/nsh/defconfig
index 71362ab743b..b617f84f4a1 100644
--- a/configs/tm4c123g-launchpad/nsh/defconfig
+++ b/configs/tm4c123g-launchpad/nsh/defconfig
@@ -390,7 +390,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/tm4c1294-launchpad/ipv6/defconfig b/configs/tm4c1294-launchpad/ipv6/defconfig
index df9138c1115..04a6b925479 100644
--- a/configs/tm4c1294-launchpad/ipv6/defconfig
+++ b/configs/tm4c1294-launchpad/ipv6/defconfig
@@ -406,7 +406,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/tm4c1294-launchpad/nsh/defconfig b/configs/tm4c1294-launchpad/nsh/defconfig
index 5690209be44..326bd964233 100644
--- a/configs/tm4c1294-launchpad/nsh/defconfig
+++ b/configs/tm4c1294-launchpad/nsh/defconfig
@@ -406,7 +406,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/twr-k60n512/nsh/defconfig b/configs/twr-k60n512/nsh/defconfig
index 2768335ce9f..f4b6bf7f5ed 100644
--- a/configs/twr-k60n512/nsh/defconfig
+++ b/configs/twr-k60n512/nsh/defconfig
@@ -382,7 +382,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/twr-k64f120m/netnsh/defconfig b/configs/twr-k64f120m/netnsh/defconfig
index 5f2d0910c32..22ef478b179 100644
--- a/configs/twr-k64f120m/netnsh/defconfig
+++ b/configs/twr-k64f120m/netnsh/defconfig
@@ -421,7 +421,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/twr-k64f120m/nsh/defconfig b/configs/twr-k64f120m/nsh/defconfig
index eccbd571644..911905fe7c5 100644
--- a/configs/twr-k64f120m/nsh/defconfig
+++ b/configs/twr-k64f120m/nsh/defconfig
@@ -407,7 +407,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/u-blox-c027/nsh/defconfig b/configs/u-blox-c027/nsh/defconfig
index 8fe80a00a66..87cb2090180 100644
--- a/configs/u-blox-c027/nsh/defconfig
+++ b/configs/u-blox-c027/nsh/defconfig
@@ -372,7 +372,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/ubw32/nsh/defconfig b/configs/ubw32/nsh/defconfig
index 2fe63ce0511..5aa5e4a8416 100644
--- a/configs/ubw32/nsh/defconfig
+++ b/configs/ubw32/nsh/defconfig
@@ -389,7 +389,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/viewtool-stm32f107/highpri/defconfig b/configs/viewtool-stm32f107/highpri/defconfig
index 15f574f6c3e..a77a31403df 100644
--- a/configs/viewtool-stm32f107/highpri/defconfig
+++ b/configs/viewtool-stm32f107/highpri/defconfig
@@ -626,7 +626,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/viewtool-stm32f107/netnsh/defconfig b/configs/viewtool-stm32f107/netnsh/defconfig
index 7362467a7f9..64dfa3c7c52 100644
--- a/configs/viewtool-stm32f107/netnsh/defconfig
+++ b/configs/viewtool-stm32f107/netnsh/defconfig
@@ -643,7 +643,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/viewtool-stm32f107/nsh/defconfig b/configs/viewtool-stm32f107/nsh/defconfig
index 02c4e16ac05..d1231a7b2b8 100644
--- a/configs/viewtool-stm32f107/nsh/defconfig
+++ b/configs/viewtool-stm32f107/nsh/defconfig
@@ -623,7 +623,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/xmc4500-relax/nsh/defconfig b/configs/xmc4500-relax/nsh/defconfig
index 14643afe8f9..c6b5a1761bc 100644
--- a/configs/xmc4500-relax/nsh/defconfig
+++ b/configs/xmc4500-relax/nsh/defconfig
@@ -326,7 +326,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/xtrs/nsh/defconfig b/configs/xtrs/nsh/defconfig
index f00bed1e28e..f757520a049 100644
--- a/configs/xtrs/nsh/defconfig
+++ b/configs/xtrs/nsh/defconfig
@@ -127,7 +127,7 @@ CONFIG_START_YEAR=2012
CONFIG_START_MONTH=12
CONFIG_START_DAY=9
CONFIG_DEV_CONSOLE=y
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
# CONFIG_PRIORITY_INHERITANCE is not set
# CONFIG_FDCLONE_DISABLE is not set
# CONFIG_FDCLONE_STDIO is not set
diff --git a/configs/xtrs/ostest/defconfig b/configs/xtrs/ostest/defconfig
index 709e3dc7a1c..e74b06c9926 100644
--- a/configs/xtrs/ostest/defconfig
+++ b/configs/xtrs/ostest/defconfig
@@ -126,7 +126,7 @@ CONFIG_START_YEAR=2008
CONFIG_START_MONTH=2
CONFIG_START_DAY=21
# CONFIG_DEV_CONSOLE is not set
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
# CONFIG_PRIORITY_INHERITANCE is not set
# CONFIG_FDCLONE_DISABLE is not set
# CONFIG_FDCLONE_STDIO is not set
diff --git a/configs/xtrs/pashello/defconfig b/configs/xtrs/pashello/defconfig
index 8e4c51c211a..c720f725f32 100644
--- a/configs/xtrs/pashello/defconfig
+++ b/configs/xtrs/pashello/defconfig
@@ -127,7 +127,7 @@ CONFIG_START_YEAR=2012
CONFIG_START_MONTH=12
CONFIG_START_DAY=9
CONFIG_DEV_CONSOLE=y
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
# CONFIG_PRIORITY_INHERITANCE is not set
# CONFIG_FDCLONE_DISABLE is not set
# CONFIG_FDCLONE_STDIO is not set
diff --git a/configs/z16f2800100zcog/nsh/defconfig b/configs/z16f2800100zcog/nsh/defconfig
index 7114acee804..eff209f2be2 100644
--- a/configs/z16f2800100zcog/nsh/defconfig
+++ b/configs/z16f2800100zcog/nsh/defconfig
@@ -217,7 +217,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/z16f2800100zcog/ostest/defconfig b/configs/z16f2800100zcog/ostest/defconfig
index 5fc5aa95b0a..0aa5129f8e4 100644
--- a/configs/z16f2800100zcog/ostest/defconfig
+++ b/configs/z16f2800100zcog/ostest/defconfig
@@ -217,7 +217,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/z16f2800100zcog/pashello/defconfig b/configs/z16f2800100zcog/pashello/defconfig
index 73cbcca1cdb..5b5a904ad06 100644
--- a/configs/z16f2800100zcog/pashello/defconfig
+++ b/configs/z16f2800100zcog/pashello/defconfig
@@ -217,7 +217,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/z80sim/nsh/defconfig b/configs/z80sim/nsh/defconfig
index 9d25de2742d..a018632f27e 100644
--- a/configs/z80sim/nsh/defconfig
+++ b/configs/z80sim/nsh/defconfig
@@ -127,7 +127,7 @@ CONFIG_START_YEAR=2012
CONFIG_START_MONTH=12
CONFIG_START_DAY=7
CONFIG_DEV_CONSOLE=y
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
# CONFIG_PRIORITY_INHERITANCE is not set
# CONFIG_FDCLONE_DISABLE is not set
# CONFIG_FDCLONE_STDIO is not set
diff --git a/configs/z80sim/ostest/defconfig b/configs/z80sim/ostest/defconfig
index 04cb098016f..3ed03920a7c 100644
--- a/configs/z80sim/ostest/defconfig
+++ b/configs/z80sim/ostest/defconfig
@@ -126,7 +126,7 @@ CONFIG_START_YEAR=2007
CONFIG_START_MONTH=2
CONFIG_START_DAY=21
# CONFIG_DEV_CONSOLE is not set
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
# CONFIG_PRIORITY_INHERITANCE is not set
# CONFIG_FDCLONE_DISABLE is not set
# CONFIG_FDCLONE_STDIO is not set
diff --git a/configs/z80sim/pashello/defconfig b/configs/z80sim/pashello/defconfig
index 8ffd9fda397..8bd794e872a 100644
--- a/configs/z80sim/pashello/defconfig
+++ b/configs/z80sim/pashello/defconfig
@@ -126,7 +126,7 @@ CONFIG_START_YEAR=2012
CONFIG_START_MONTH=12
CONFIG_START_DAY=7
CONFIG_DEV_CONSOLE=y
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
# CONFIG_PRIORITY_INHERITANCE is not set
# CONFIG_FDCLONE_DISABLE is not set
# CONFIG_FDCLONE_STDIO is not set
diff --git a/configs/zkit-arm-1769/nsh/defconfig b/configs/zkit-arm-1769/nsh/defconfig
index df35f44bfc8..bad84679307 100644
--- a/configs/zkit-arm-1769/nsh/defconfig
+++ b/configs/zkit-arm-1769/nsh/defconfig
@@ -366,7 +366,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/zkit-arm-1769/nxhello/defconfig b/configs/zkit-arm-1769/nxhello/defconfig
index 464caa8316e..48b909ab668 100644
--- a/configs/zkit-arm-1769/nxhello/defconfig
+++ b/configs/zkit-arm-1769/nxhello/defconfig
@@ -366,7 +366,8 @@ CONFIG_SCHED_WAITPID=y
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/zp214xpa/nsh/defconfig b/configs/zp214xpa/nsh/defconfig
index 27801bfb267..10176fb0541 100644
--- a/configs/zp214xpa/nsh/defconfig
+++ b/configs/zp214xpa/nsh/defconfig
@@ -285,7 +285,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/configs/zp214xpa/nxlines/defconfig b/configs/zp214xpa/nxlines/defconfig
index 0ff83a6c96b..49360faa84e 100644
--- a/configs/zp214xpa/nxlines/defconfig
+++ b/configs/zp214xpa/nxlines/defconfig
@@ -289,7 +289,8 @@ CONFIG_MAX_TASKS=16
#
# Pthread Options
#
-# CONFIG_MUTEX_TYPES is not set
+# CONFIG_PTHREAD_MUTEX_TYPES is not set
+CONFIG_PTHREAD_MUTEX_ROBUST=y
CONFIG_NPTHREAD_KEYS=4
# CONFIG_PTHREAD_CLEANUP is not set
# CONFIG_CANCELLATION_POINTS is not set
diff --git a/crypto/Kconfig b/crypto/Kconfig
index 022fce7a051..0c93eaaa990 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -50,4 +50,35 @@ config CRYPTO_SW_AES
implemenations. This needs to support up_aesinitialize() and
aes_cypher() per include/nuttx/crypto/crypto.h.
+config CRYPTO_BLAKE2S
+ bool "BLAKE2s hash algorithm"
+ default n
+ ---help---
+ Enable the BLAKE2s hash algorithm
+
+config CRYPTO_RANDOM_POOL
+ bool "Entropy pool and strong randon number generator"
+ default n
+ select CRYPTO_BLAKE2S
+ ---help---
+ Entropy pool gathers environmental noise from device drivers,
+ user-space, etc., and returns good random numbers, suitable
+ for cryptographic use. Based on entropy pool design from
+ *BSDs and uses BLAKE2Xs algorithm for CSPRNG output.
+
+ NOTE: May not actually be cyptographically secure, if
+ not enough entropy is made available to the entropy pool.
+
+if CRYPTO_RANDOM_POOL
+
+config CRYPTO_RANDOM_POOL_COLLECT_IRQ_RANDOMNESS
+ bool "Use interrupts to feed timing randomness to entropy pool"
+ default y
+ ---help---
+ Feed entropy pool with interrupt randomness from interrupt
+ dispatch function 'irq_dispatch'. This adds some overhead
+ for every interrupt handled.
+
+endif # CRYPTO_RANDOM_POOL
+
endif # CRYPTO
diff --git a/crypto/Makefile b/crypto/Makefile
index 23b4cf137e9..56b75b65170 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -56,6 +56,18 @@ ifeq ($(CONFIG_CRYPTO_SW_AES),y)
CRYPTO_CSRCS += aes.c
endif
+# BLAKE2s hash algorithm
+
+ifeq ($(CONFIG_CRYPTO_BLAKE2S),y)
+ CRYPTO_CSRCS += blake2s.c
+endif
+
+# Entropy pool random number generator
+
+ifeq ($(CONFIG_CRYPTO_RANDOM_POOL),y)
+ CRYPTO_CSRCS += random_pool.c
+endif
+
endif # CONFIG_CRYPTO
ASRCS = $(CRYPTO_ASRCS)
@@ -97,4 +109,4 @@ distclean: clean
$(call DELFILE, Make.dep)
$(call DELFILE, .depend)
--include Make.dep
\ No newline at end of file
+-include Make.dep
diff --git a/crypto/blake2s.c b/crypto/blake2s.c
new file mode 100644
index 00000000000..a88ed045c5e
--- /dev/null
+++ b/crypto/blake2s.c
@@ -0,0 +1,606 @@
+/****************************************************************************
+ * crypto/blake2s.c
+ *
+ * This code is based on public-domain/CC0 BLAKE2 reference implementation
+ * by Samual Neves, at https://github.com/BLAKE2/BLAKE2/tree/master/ref
+ * Copyright 2012, Samuel Neves
+ *
+ * Copyright (C) 2017 Haltian Ltd. All rights reserved.
+ * Authors: Jussi Kivilinna
+ *
+ * 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
+
+#include
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const uint32_t blake2s_IV[8] =
+{
+ 0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, 0x510e527ful,
+ 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul
+};
+
+static const uint8_t blake2s_sigma[10][16] =
+{
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
+ { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 },
+ { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 },
+ { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 },
+ { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 },
+ { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 },
+ { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 },
+ { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 },
+ { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 },
+ { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 }
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static inline uint32_t rotr32(const uint32_t w, const unsigned int c)
+{
+ return (w >> (c & 31)) | (w << ((32 - c) & 31));
+}
+
+static void blake2_memcpy(FAR void *dst, FAR const void *src, size_t len)
+{
+#ifdef BLAKE2_UNALIGNED
+ FAR uint32_alias_t *idst = dst;
+ FAR const uint32_alias_t *isrc = src;
+ FAR uint8_t *bdst;
+ FAR const uint8_t *bsrc;
+
+ while (len >= sizeof(uint32_alias_t))
+ {
+ *idst = *isrc;
+ idst++;
+ isrc++;
+ len -= sizeof(uint32_alias_t);
+ }
+
+ bdst = (FAR uint8_t *)idst;
+ bsrc = (FAR const uint8_t *)isrc;
+ while (len)
+ {
+ *bdst = *bsrc;
+ bdst++;
+ bsrc++;
+ len--;
+ }
+#else
+ memcpy(dst, set, len);
+#endif
+}
+
+static void blake2_memset(FAR void *dst, int set, size_t len)
+{
+#ifdef BLAKE2_UNALIGNED
+ FAR uint32_alias_t *idst = dst;
+ FAR uint8_t *bdst;
+ uint32_t mset;
+
+ set &= 0xff;
+ mset = (uint32_t)set * 0x01010101UL;
+
+ while (len >= sizeof(uint32_alias_t))
+ {
+ *idst = mset;
+ idst++;
+ len -= sizeof(uint32_alias_t);
+ }
+
+ bdst = (FAR uint8_t *)idst;
+ set &= 0xff;
+ while (len)
+ {
+ *bdst = set;
+ bdst++;
+ len--;
+ }
+#else
+ memset(dst, set, len);
+#endif
+}
+
+static inline void secure_zero_memory(FAR void *v, size_t n)
+{
+ explicit_bzero(v, n);
+}
+
+/* Some helper functions, not necessarily useful */
+
+static int blake2s_is_lastblock(FAR const blake2s_state *S)
+{
+ return S->f[0] != 0;
+}
+
+static void blake2s_set_lastblock(FAR blake2s_state *S)
+{
+ S->f[0] = (uint32_t)-1;
+}
+
+static void blake2s_increment_counter(FAR blake2s_state *S, const uint32_t inc)
+{
+ S->t[0] += inc;
+ S->t[1] += (S->t[0] < inc);
+}
+
+static void blake2s_init0(FAR blake2s_state *S)
+{
+ size_t i;
+
+ blake2_memset(S, 0, sizeof(*S) - sizeof(S->buf));
+
+ for (i = 0; i < 8; ++i)
+ S->h[i] = blake2s_IV[i];
+}
+
+static void blake2s_compress(FAR blake2s_state *S,
+ const uint8_t in[BLAKE2S_BLOCKBYTES])
+{
+ uint32_t m[16];
+ uint32_t v[16];
+ size_t i;
+ unsigned int round;
+
+ for (i = 0; i < 16; ++i)
+ {
+ m[i] = blake2_load32(in + i * sizeof(m[i]));
+ }
+
+ for (i = 0; i < 8; ++i)
+ {
+ v[i] = S->h[i];
+ }
+
+ v[8] = blake2s_IV[0];
+ v[9] = blake2s_IV[1];
+ v[10] = blake2s_IV[2];
+ v[11] = blake2s_IV[3];
+ v[12] = S->t[0] ^ blake2s_IV[4];
+ v[13] = S->t[1] ^ blake2s_IV[5];
+ v[14] = S->f[0] ^ blake2s_IV[6];
+ v[15] = S->f[1] ^ blake2s_IV[7];
+
+#define G(r,i,a,b,c,d) \
+ do { \
+ a = a + b + m[blake2s_sigma[r][2*i+0]]; \
+ d = rotr32(d ^ a, 16); \
+ c = c + d; \
+ b = rotr32(b ^ c, 12); \
+ a = a + b + m[blake2s_sigma[r][2*i+1]]; \
+ d = rotr32(d ^ a, 8); \
+ c = c + d; \
+ b = rotr32(b ^ c, 7); \
+ } while(0)
+
+#define ROUND(r) \
+ do { \
+ G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \
+ G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \
+ G(r,2,v[ 2],v[ 6],v[10],v[14]); \
+ G(r,3,v[ 3],v[ 7],v[11],v[15]); \
+ G(r,4,v[ 0],v[ 5],v[10],v[15]); \
+ G(r,5,v[ 1],v[ 6],v[11],v[12]); \
+ G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \
+ G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \
+ } while(0)
+
+ /* Size vs performance trade-off. With unrolling, on ARMv7-M function text
+ * is ~4 KiB and without ~1 KiB. Without unrolling we take ~25% performance
+ * hit. */
+
+#if 1
+ /* Smaller, slightly slower. */
+
+ for (round = 0; round < 10; round++)
+ {
+ ROUND(round);
+ }
+#else
+ /* Larger, slightly faster. */
+
+ (void)(round=0);
+ ROUND(0);
+ ROUND(1);
+ ROUND(2);
+ ROUND(3);
+ ROUND(4);
+ ROUND(5);
+ ROUND(6);
+ ROUND(7);
+ ROUND(8);
+ ROUND(9);
+#endif
+
+#undef G
+#undef ROUND
+
+ for (i = 0; i < 8; ++i)
+ {
+ S->h[i] = S->h[i] ^ v[i] ^ v[i + 8];
+ }
+}
+
+#ifdef CONFIG_BLAKE2_SELFTEST
+/* BLAKE2s self-test from RFC 7693 */
+
+static void selftest_seq(FAR uint8_t *out, size_t len, uint32_t seed)
+{
+ size_t i;
+ uint32_t t, a, b;
+
+ a = 0xDEAD4BAD * seed; /* prime */
+ b = 1;
+ /* fill the buf */
+ for (i = 0; i < len; i++)
+ {
+ t = a + b;
+ a = b;
+ b = t;
+ out[i] = (t >> 24) & 0xFF;
+ }
+}
+
+static int blake2s_selftest(void)
+{
+ /* Grand hash of hash results. */
+
+ static const uint8_t blake2s_res[32] =
+ {
+ 0x6a, 0x41, 0x1f, 0x08, 0xce, 0x25, 0xad, 0xcd, 0xfb, 0x02, 0xab, 0xa6,
+ 0x41, 0x45, 0x1c, 0xec, 0x53, 0xc5, 0x98, 0xb2, 0x4f, 0x4f, 0xc7, 0x87,
+ 0xfb, 0xdc, 0x88, 0x79, 0x7f, 0x4c, 0x1d, 0xfe
+ };
+
+ /* Parameter sets. */
+
+ static const size_t b2s_md_len[4] = { 16, 20, 28, 32 };
+ static const size_t b2s_in_len[6] = { 0, 3, 64, 65, 255, 1024 };
+ size_t i, j, outlen, inlen;
+ FAR uint8_t *in;
+ uint8_t md[32], key[32];
+ blake2s_state ctx;
+ int ret = -1;
+
+ in = malloc(1024);
+ if (!in)
+ {
+ goto out;
+ }
+
+ /* 256-bit hash for testing. */
+
+ if (blake2s_init(&ctx, 32))
+ {
+ goto out;
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ outlen = b2s_md_len[i];
+ for (j = 0; j < 6; j++)
+ {
+ inlen = b2s_in_len[j];
+
+ selftest_seq(in, inlen, inlen); /* unkeyed hash */
+ blake2s(md, outlen, in, inlen, NULL, 0);
+ blake2s_update(&ctx, md, outlen); /* hash the hash */
+
+ selftest_seq(key, outlen, outlen); /* keyed hash */
+ blake2s(md, outlen, in, inlen, key, outlen);
+ blake2s_update(&ctx, md, outlen); /* hash the hash */
+ }
+ }
+
+ /* Compute and compare the hash of hashes. */
+
+ blake2s_final(&ctx, md, 32);
+ for (i = 0; i < 32; i++)
+ {
+ if (md[i] != blake2s_res[i])
+ goto out;
+ }
+
+ ret = 0;
+
+out:
+ free(in);
+ return ret;
+}
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/* init2 xors IV with input parameter block */
+
+int blake2s_init_param(FAR blake2s_state *S, FAR const blake2s_param *P)
+{
+ FAR const unsigned char *p = (FAR const unsigned char *)(P);
+ size_t i;
+#ifdef CONFIG_BLAKE2_SELFTEST
+ static bool selftest_done = false;
+ int ret;
+
+ if (!selftest_done)
+ {
+ selftest_done = true;
+ ret = blake2s_selftest();
+ DEBUGASSERT(ret == 0);
+ if (ret)
+ return -1;
+ }
+#endif
+
+ blake2s_init0(S);
+
+ /* IV XOR ParamBlock */
+
+ for (i = 0; i < 8; ++i)
+ {
+ S->h[i] ^= blake2_load32(&p[i * 4]);
+ }
+
+ S->outlen = P->digest_length;
+ return 0;
+}
+
+/* Sequential blake2s initialization */
+
+int blake2s_init(FAR blake2s_state *S, size_t outlen)
+{
+ blake2s_param P[1];
+
+ /* Move interval verification here? */
+
+ if ((!outlen) || (outlen > BLAKE2S_OUTBYTES))
+ {
+ return -1;
+ }
+
+ P->digest_length = (uint8_t)outlen;
+ P->key_length = 0;
+ P->fanout = 1;
+ P->depth = 1;
+ blake2_store32(P->leaf_length, 0);
+ blake2_store32(P->node_offset, 0);
+ blake2_store16(P->xof_length, 0);
+ P->node_depth = 0;
+ P->inner_length = 0;
+ /* memset(P->reserved, 0, sizeof(P->reserved)); */
+ blake2_memset(P->salt, 0, sizeof(P->salt));
+ blake2_memset(P->personal, 0, sizeof(P->personal));
+ return blake2s_init_param(S, P);
+}
+
+int blake2s_init_key(FAR blake2s_state *S, size_t outlen, FAR const void *key,
+ size_t keylen)
+{
+ blake2s_param P[1];
+ uint8_t block[BLAKE2S_BLOCKBYTES];
+
+ if ((!outlen) || (outlen > BLAKE2S_OUTBYTES))
+ {
+ return -1;
+ }
+
+ if (!key || !keylen || keylen > BLAKE2S_KEYBYTES)
+ {
+ return -1;
+ }
+
+ P->digest_length = (uint8_t) outlen;
+ P->key_length = (uint8_t) keylen;
+ P->fanout = 1;
+ P->depth = 1;
+ blake2_store32(P->leaf_length, 0);
+ blake2_store32(P->node_offset, 0);
+ blake2_store16(P->xof_length, 0);
+ P->node_depth = 0;
+ P->inner_length = 0;
+ /* memset(P->reserved, 0, sizeof(P->reserved)); */
+ blake2_memset(P->salt, 0, sizeof(P->salt));
+ blake2_memset(P->personal, 0, sizeof(P->personal));
+
+ blake2s_init_param(S, P);
+
+ blake2_memset(block, 0, BLAKE2S_BLOCKBYTES);
+ blake2_memcpy(block, key, keylen);
+ blake2s_update(S, block, BLAKE2S_BLOCKBYTES);
+ secure_zero_memory(block, BLAKE2S_BLOCKBYTES); /* Burn the key from stack */
+
+ return 0;
+}
+
+int blake2s_update(FAR blake2s_state *S, FAR const void *pin, size_t inlen)
+{
+ FAR const unsigned char * in = FAR (const unsigned char *)pin;
+ size_t left, fill;
+
+ if (inlen <= 0)
+ {
+ return 0;
+ }
+
+ left = S->buflen;
+ fill = BLAKE2S_BLOCKBYTES - left;
+ if (inlen > fill)
+ {
+ S->buflen = 0;
+ if (fill)
+ {
+ blake2_memcpy(S->buf + left, in, fill); /* Fill buffer */
+ }
+
+ blake2s_increment_counter(S, BLAKE2S_BLOCKBYTES);
+ blake2s_compress(S, S->buf); /* Compress */
+ in += fill;
+ inlen -= fill;
+ while (inlen > BLAKE2S_BLOCKBYTES)
+ {
+ blake2s_increment_counter(S, BLAKE2S_BLOCKBYTES);
+ blake2s_compress(S, in);
+ in += BLAKE2S_BLOCKBYTES;
+ inlen -= BLAKE2S_BLOCKBYTES;
+ }
+ }
+
+ blake2_memcpy(S->buf + S->buflen, in, inlen);
+ S->buflen += inlen;
+
+ return 0;
+}
+
+int blake2s_final(FAR blake2s_state *S, FAR void *out, size_t outlen)
+{
+ FAR uint8_t *outbuf = out;
+ uint32_t tmp = 0;
+ size_t outwords;
+ size_t padding;
+ size_t i;
+
+ if (out == NULL || outlen < S->outlen)
+ {
+ return -1;
+ }
+
+ if (blake2s_is_lastblock(S))
+ {
+ return -1;
+ }
+
+ blake2s_increment_counter(S, (uint32_t)S->buflen);
+ blake2s_set_lastblock(S);
+ padding = BLAKE2S_BLOCKBYTES - S->buflen;
+ if (padding)
+ {
+ blake2_memset(S->buf + S->buflen, 0, padding);
+ }
+ blake2s_compress(S, S->buf);
+
+ /* Output hash to out buffer */
+
+ outwords = outlen / sizeof(uint32_t);
+ outwords = (outwords < 8) ? outwords : 8;
+ for (i = 0; i < outwords; ++i)
+ {
+ /* Store full words */
+
+ blake2_store32(outbuf, S->h[i]);
+ outlen -= sizeof(uint32_t);
+ outbuf += sizeof(uint32_t);
+ }
+
+ if (outwords < 8 && outlen > 0 && outlen < sizeof(uint32_t))
+ {
+ /* Store partial word */
+
+ blake2_store32(&tmp, S->h[i]);
+ blake2_memcpy(outbuf, &tmp, outlen);
+ }
+
+ return 0;
+}
+
+int blake2s(FAR void *out, size_t outlen, FAR const void *in, size_t inlen,
+ FAR const void *key, size_t keylen)
+{
+ blake2s_state S[1];
+
+ /* Verify parameters */
+
+ if (NULL == in && inlen > 0)
+ {
+ return -1;
+ }
+
+ if (NULL == out)
+ {
+ return -1;
+ }
+
+ if (NULL == key && keylen > 0)
+ {
+ return -1;
+ }
+
+ if (!outlen || outlen > BLAKE2S_OUTBYTES)
+ {
+ return -1;
+ }
+
+ if (keylen > BLAKE2S_KEYBYTES)
+ {
+ return -1;
+ }
+
+ if (keylen > 0)
+ {
+ if (blake2s_init_key(S, outlen, key, keylen) < 0)
+ {
+ return -1;
+ }
+ }
+ else
+ {
+ if (blake2s_init(S, outlen) < 0)
+ {
+ return -1;
+ }
+ }
+
+ blake2s_update(S, (const uint8_t *)in, inlen);
+ blake2s_final(S, out, outlen);
+ return 0;
+}
diff --git a/crypto/random_pool.c b/crypto/random_pool.c
new file mode 100644
index 00000000000..fed59bd727f
--- /dev/null
+++ b/crypto/random_pool.c
@@ -0,0 +1,561 @@
+/****************************************************************************
+ * crypto/random_pool.c
+ *
+ * Copyright (C) 2015-2017 Haltian Ltd. All rights reserved.
+ * Authors: Juha Niskanen
+ * Jussi Kivilinna
+ *
+ * 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
+#include
+#include
+
+#include
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#ifndef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#define ROTL_32(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
+#define ROTR_32(x,n) ( ((x) >> (n)) | ((x) << (32-(n))) )
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct blake2xs_rng_s
+{
+ uint32_t out_node_offset;
+ blake2s_param param;
+ blake2s_state ctx;
+ char out_root[BLAKE2S_OUTBYTES];
+};
+
+struct rng_s
+{
+ sem_t rd_sem; /* Threads can only exclusively access the RNG */
+ volatile uint32_t rd_addptr;
+ volatile uint32_t rd_newentr;
+ volatile uint8_t rd_rotate;
+ volatile uint8_t rd_prev_time;
+ volatile uint16_t rd_prev_irq;
+ bool output_initialized;
+ struct blake2xs_rng_s blake2xs;
+};
+
+enum
+{
+ POOL_SIZE = ENTROPY_POOL_SIZE,
+ POOL_MASK = (POOL_SIZE - 1),
+
+ MIN_SEED_NEW_ENTROPY_WORDS = 128,
+ MAX_SEED_NEW_ENTROPY_WORDS = 1024
+};
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static struct rng_s g_rng;
+
+#ifdef CONFIG_BOARD_ENTROPY_POOL
+/* Entropy pool structure can be provided by board source. Use for this is,
+ * for example, allocate entropy pool from special area of RAM which content
+ * is kept over system reset. */
+
+# define entropy_pool board_entropy_pool
+#else
+static struct entropy_pool_s entropy_pool;
+#endif
+
+/* Polynomial from paper "The Linux Pseudorandom Number Generator Revisited"
+ * x^POOL_SIZE + x^104 + x^76 + x^51 + x^25 + x + 1 */
+
+static const uint32_t pool_stir[] = { POOL_SIZE, 104, 76, 51, 25, 1 };
+
+/* Derived from IEEE 802.3 CRC-32 */
+
+static const uint32_t pool_twist[8] =
+{
+ 0x00000000, 0x3b6e20c8, 0x76dc4190, 0x4db26158,
+ 0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Function: addentropy
+ *
+ * Description:
+ *
+ * This function adds a number of integers into the entropy pool.
+ * The pool is stirred with a polynomial of degree POOL_SIZE over GF(2).
+ *
+ * Code is inspired by add_entropy_words() function of OpenBSD kernel.
+ *
+ * Parameters:
+ * buf - Buffer of integers to be added
+ * n - Number of elements in buf
+ * inc_new - Count element as new entry
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+static void addentropy(FAR const uint32_t *buf, size_t n, bool inc_new)
+{
+ /* Compile time check for that POOL_SIZE is power of two. */
+
+ static char pool_size_p2_check[1 - ((POOL_SIZE & (POOL_SIZE - 1)) * 2)];
+
+ UNUSED(pool_size_p2_check);
+
+ while (n-- > 0)
+ {
+ uint32_t rotate;
+ uint32_t w;
+ uint32_t i;
+
+ rotate = g_rng.rd_rotate;
+ w = ROTL_32(*buf, rotate);
+ i = g_rng.rd_addptr = (g_rng.rd_addptr - 1) & POOL_MASK;
+
+ /* Normal round, we add 7 bits of rotation to the pool.
+ * At the beginning of the pool, we add extra 7 bits
+ * rotation, in order for successive passes spread the
+ * input bits across the pool evenly.
+ */
+
+ g_rng.rd_rotate = (rotate + (i ? 7 : 14)) & 31;
+
+ /* XOR pool contents corresponding to polynomial terms */
+
+ w ^= entropy_pool.pool[(i + pool_stir[1]) & POOL_MASK];
+ w ^= entropy_pool.pool[(i + pool_stir[2]) & POOL_MASK];
+ w ^= entropy_pool.pool[(i + pool_stir[3]) & POOL_MASK];
+ w ^= entropy_pool.pool[(i + pool_stir[4]) & POOL_MASK];
+ w ^= entropy_pool.pool[(i + pool_stir[5]) & POOL_MASK];
+ w ^= entropy_pool.pool[i]; /* 2^POOL_SIZE */
+
+ entropy_pool.pool[i] = (w >> 3) ^ pool_twist[w & 7];
+ buf++;
+
+ if (inc_new)
+ {
+ g_rng.rd_newentr += 1;
+ }
+ }
+}
+
+/****************************************************************************
+ * Function: getentropy
+ *
+ * Description:
+ * Hash entropy pool to BLAKE2s context. This is an internal interface for
+ * seeding out-facing BLAKE2Xs random bit generator from entropy pool.
+ *
+ * Code is inspired by extract_entropy() function of OpenBSD kernel.
+ *
+ * Note that this function cannot fail, other than by asserting.
+ *
+ * Warning: In protected kernel builds, this interface MUST NOT be
+ * exported to userspace. This interface MUST NOT be used as a
+ * general-purpose random bit generator!
+ *
+ * Parameters:
+ * S - BLAKE2s instance that will absorb entropy pool
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+static void getentropy(FAR blake2s_state *S)
+{
+#ifdef CONFIG_SCHED_CPULOAD
+ struct cpuload_s load;
+#endif
+ uint32_t tmp;
+
+ add_sw_randomness(g_rng.rd_newentr);
+
+ /* Absorb the entropy pool */
+
+ blake2s_update(S, (FAR const uint32_t *)entropy_pool.pool,
+ sizeof(entropy_pool.pool));
+
+ /* Add something back so repeated calls to this function
+ * return different values.
+ */
+
+ tmp = sizeof(entropy_pool.pool);
+ tmp <<= 27;
+#ifdef CONFIG_SCHED_CPULOAD
+ clock_cpuload(0, &load);
+ tmp += load.total ^ ROTL_32(load.active, 23);
+#endif
+ add_sw_randomness(tmp);
+
+ g_rng.rd_newentr = 0;
+}
+
+/* The BLAKE2Xs based random number generator algorithm.
+ *
+ * BLAKE2X is a extensible-output function (XOF) variant of BLAKE2 hash
+ * function. One application of XOFs is use as deterministic random bit
+ * number generator (DRBG) as used here. BLAKE2 specification is available
+ * at https://blake2.net/
+ *
+ * BLAKE2Xs here implementation is based on public-domain/CC0 BLAKE2 reference
+ * implementation by Samual Neves, at
+ * https://github.com/BLAKE2/BLAKE2/tree/master/ref
+ * Copyright 2012, Samuel Neves
+ */
+
+static void rng_reseed(void)
+{
+ blake2s_param P = {};
+
+ /* Reset output node counter. */
+
+ g_rng.blake2xs.out_node_offset = 0;
+
+ /* Initialize parameter block */
+
+ P.digest_length = BLAKE2S_OUTBYTES;
+ P.key_length = 0;
+ P.fanout = 1;
+ P.depth = 1;
+ blake2_store32(P.leaf_length, 0);
+ blake2_store32(P.node_offset, 0);
+ blake2_store16(P.xof_length, 0xffff);
+ P.node_depth = 0;
+ P.inner_length = 0;
+ g_rng.blake2xs.param = P;
+
+ blake2s_init_param(&g_rng.blake2xs.ctx, &g_rng.blake2xs.param);
+
+ /* Initialize with randomness from entropy pool */
+
+ getentropy(&g_rng.blake2xs.ctx);
+
+ /* Absorb also the previous root */
+
+ blake2s_update(&g_rng.blake2xs.ctx, g_rng.blake2xs.out_root,
+ sizeof(g_rng.blake2xs.out_root));
+
+ /* Finalize the new root hash */
+
+ blake2s_final(&g_rng.blake2xs.ctx, g_rng.blake2xs.out_root,
+ BLAKE2S_OUTBYTES);
+
+ explicit_bzero(&g_rng.blake2xs.ctx, sizeof(g_rng.blake2xs.ctx));
+
+ /* Setup parameters for output phase. */
+
+ g_rng.blake2xs.param.key_length = 0;
+ g_rng.blake2xs.param.fanout = 0;
+ blake2_store32(g_rng.blake2xs.param.leaf_length, BLAKE2S_OUTBYTES);
+ g_rng.blake2xs.param.inner_length = BLAKE2S_OUTBYTES;
+ g_rng.blake2xs.param.node_depth = 0;
+
+ g_rng.output_initialized = true;
+}
+
+static void rng_buf_internal(FAR void *bytes, size_t nbytes)
+{
+ if (!g_rng.output_initialized)
+ {
+ if (g_rng.rd_newentr < MIN_SEED_NEW_ENTROPY_WORDS)
+ {
+ cryptwarn("Entropy pool RNG initialized with very low entropy. "
+ " Consider implementing CONFIG_BOARD_INITRNGSEED!\n");
+ }
+
+ rng_reseed();
+ }
+ else if (g_rng.rd_newentr >= MAX_SEED_NEW_ENTROPY_WORDS)
+ {
+ /* Initial entropy is low. Reseed when we have accumulated more. */
+
+ rng_reseed();
+ }
+ else if (g_rng.blake2xs.out_node_offset == UINT32_MAX)
+ {
+ /* Maximum BLAKE2Xs output reached (2^32-1 output blocks, maximum 128 GiB
+ * bytes), reseed. */
+
+ rng_reseed();
+ }
+
+ /* Output phase for BLAKE2Xs. */
+
+ for (; nbytes > 0; ++g_rng.blake2xs.out_node_offset)
+ {
+ size_t block_size = MIN(nbytes, BLAKE2S_OUTBYTES);
+
+ /* Initialize state */
+
+ g_rng.blake2xs.param.digest_length = block_size;
+ blake2_store32(g_rng.blake2xs.param.node_offset,
+ g_rng.blake2xs.out_node_offset);
+ blake2s_init_param(&g_rng.blake2xs.ctx, &g_rng.blake2xs.param);
+
+ /* Process state and output random bytes */
+
+ blake2s_update(&g_rng.blake2xs.ctx, g_rng.blake2xs.out_root,
+ sizeof(g_rng.blake2xs.out_root));
+ blake2s_final(&g_rng.blake2xs.ctx, bytes, block_size);
+
+ bytes += block_size;
+ nbytes -= block_size;
+ }
+}
+
+static void rng_init(void)
+{
+ crypinfo("Initializing RNG\n");
+
+ memset(&g_rng, 0, sizeof(struct rng_s));
+ sem_init(&g_rng.rd_sem, 0, 1);
+
+ /* We do not initialize output here because this is called
+ * quite early in boot and there may not be enough entropy.
+ *
+ * Board level may define CONFIG_BOARD_INITRNGSEED if it implements
+ * early random seeding.
+ */
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Function: up_rngaddint
+ *
+ * Description:
+ * Add one integer to entropy pool, contributing a specific kind
+ * of entropy to pool.
+ *
+ * Parameters:
+ * kindof - Enumeration constant telling where val came from
+ * val - Integer to be added
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+void up_rngaddint(enum rnd_source_t kindof, int val)
+{
+ uint32_t buf[1];
+
+ buf[0] = val;
+
+ up_rngaddentropy(kindof, buf, 1);
+}
+
+/****************************************************************************
+ * Function: up_rngaddentropy
+ *
+ * Description:
+ * Add buffer of integers to entropy pool.
+ *
+ * Parameters:
+ * kindof - Enumeration constant telling where val came from
+ * buf - Buffer of integers to be added
+ * n - Number of elements in buf
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+void up_rngaddentropy(enum rnd_source_t kindof, FAR const uint32_t *buf,
+ size_t n)
+{
+ uint32_t tbuf[1];
+ struct timespec ts;
+ bool new_inc = true;
+
+ if (kindof == RND_SRC_IRQ && n > 0)
+ {
+ /* Ignore interrupt randomness if previous interrupt was from same
+ * source. */
+
+ if (buf[0] == g_rng.rd_prev_irq)
+ {
+ return;
+ }
+
+ g_rng.rd_prev_irq = buf[0];
+ }
+
+ /* We don't actually track what kind of entropy we receive,
+ * just add it all to pool. One exception is interrupt
+ * and timer randomness, where we limit rate of new pool entry
+ * counting to prevent high interrupt rate triggering RNG
+ * reseeding too fast.
+ */
+
+ (void)clock_gettime(CLOCK_REALTIME, &ts);
+ tbuf[0] = ROTL_32(ts.tv_nsec, 17) ^ ROTL_32(ts.tv_sec, 3);
+ tbuf[0] += ROTL_32(kindof, 27);
+ tbuf[0] += ROTL_32((uintptr_t)&tbuf[0], 11);
+
+ if (kindof == RND_SRC_TIME || kindof == RND_SRC_IRQ)
+ {
+ uint8_t curr_time = ts.tv_sec * 8 + ts.tv_nsec / (NSEC_PER_SEC / 8);
+
+ /* Allow interrupts/timers increase entropy counter at max rate
+ * of 8 Hz. */
+
+ if (g_rng.rd_prev_time == curr_time)
+ {
+ new_inc = false;
+ }
+ else
+ {
+ g_rng.rd_prev_time = curr_time;
+ }
+ }
+
+ if (n > 0)
+ {
+ tbuf[0] ^= buf[0];
+ buf++;
+ n--;
+ }
+
+ addentropy(tbuf, 1, new_inc);
+
+ if (n > 0)
+ {
+ addentropy(buf, n, new_inc);
+ }
+}
+
+/****************************************************************************
+ * Function: up_rngreseed
+ *
+ * Description:
+ * Force reseeding random number generator from entropy pool
+ *
+ ****************************************************************************/
+
+void up_rngreseed(void)
+{
+ while (sem_wait(&g_rng.rd_sem) != 0)
+ {
+ assert(errno == EINTR);
+ }
+
+ if (g_rng.rd_newentr >= MIN_SEED_NEW_ENTROPY_WORDS)
+ {
+ rng_reseed();
+ }
+
+ sem_post(&g_rng.rd_sem);
+}
+
+/****************************************************************************
+ * Function: up_randompool_initialize
+ *
+ * Description:
+ * Initialize entropy pool and random number generator
+ *
+ ****************************************************************************/
+
+void up_randompool_initialize(void)
+{
+ rng_init();
+
+#ifdef CONFIG_BOARD_INITRNGSEED
+ board_init_rngseed();
+#endif
+}
+
+/****************************************************************************
+ * Function: getrandom
+ *
+ * Description:
+ * Fill a buffer of arbitrary length with randomness. This is the
+ * preferred interface for getting random numbers. The traditional
+ * /dev/random approach is susceptible for things like the attacker
+ * exhausting file descriptors on purpose.
+ *
+ * Note that this function cannot fail, other than by asserting.
+ *
+ * Parameters:
+ * bytes - Buffer for returned random bytes
+ * nbytes - Number of bytes requested.
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+void getrandom(FAR void *bytes, size_t nbytes)
+{
+ while (sem_wait(&g_rng.rd_sem) != 0)
+ {
+ assert(errno == EINTR);
+ }
+
+ rng_buf_internal(bytes, nbytes);
+ sem_post(&g_rng.rd_sem);
+}
diff --git a/drivers/Kconfig b/drivers/Kconfig
index 00adcc8f17f..511d63c5f6c 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -69,6 +69,15 @@ config DEV_URANDOM_CONGRUENTIAL
NOTE: Not cyptographically secure
+config DEV_URANDOM_RANDOM_POOL
+ bool "Entropy pool"
+ depends on CRYPTO_RANDOM_POOL
+ ---help---
+ Use the entropy pool CPRNG output for urandom algorithm.
+
+ NOTE: May or may not be cyptographically secure, depending upon the
+ quality entropy available to entropy pool.
+
config DEV_URANDOM_ARCH
bool "Architecture-specific"
depends on ARCH_HAVE_RNG
diff --git a/drivers/analog/Kconfig b/drivers/analog/Kconfig
index 20d99f8acb4..ec14bdcd054 100644
--- a/drivers/analog/Kconfig
+++ b/drivers/analog/Kconfig
@@ -66,6 +66,25 @@ config ADS1255_FREQUENCY
endif # ADC_ADS125X
+config ADC_LTC1867L
+ bool "LTC 1863L/1867L support"
+ default n
+ select SPI
+ ---help---
+ Enable driver support for the LTC 1863L (12 bit) and LTC 1867L (16 bit) SPI powered ADC.
+
+ Note that the ADC conversion is started via the ANIOC_TRIGGER iotcl.
+
+if ADC_LTC1867L
+
+config LTC1867L_FREQUENCY
+ int "LTC 1863L/1867L SPI frequency"
+ default 1000000
+ ---help---
+ LTC 1863L/1867L SPI frequency. Maximum is 20 MHz.
+
+endif # ADC_LTC1867L
+
config ADC_PGA11X
bool "TI PGA112/3/6/7 support"
default n
@@ -109,6 +128,12 @@ config PGA11X_MULTIPLE
endif # if ADC_PGA11X
endif # ADC
+config COMP
+ bool "Analog Comparator"
+ default n
+ ---help---
+ Select to enable support for Analog Comparators (COMPs).
+
config DAC
bool "Digital-to-Analog Conversion"
default n
diff --git a/drivers/analog/Make.defs b/drivers/analog/Make.defs
index 2d12a1695d1..01d5a2fe8e2 100644
--- a/drivers/analog/Make.defs
+++ b/drivers/analog/Make.defs
@@ -1,7 +1,7 @@
############################################################################
# drivers/analog/Make.defs
#
-# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
+# Copyright (C) 2011-2012, 2017 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt
#
# Redistribution and use in source and binary forms, with or without
@@ -50,6 +50,16 @@ ifeq ($(CONFIG_DAC_AD5410),y)
endif
endif
+# Check for COMP devices
+
+ifeq ($(CONFIG_COMP),y)
+
+# Include the common COMP character driver
+
+CSRCS += comp.c
+
+endif
+
# Check for ADC devices
ifeq ($(CONFIG_ADC),y)
@@ -73,6 +83,10 @@ endif
ifeq ($(CONFIG_ADC_ADS125X),y)
CSRCS += ads1255.c
endif
+
+ifeq ($(CONFIG_ADC_LTC1867L),y)
+ CSRCS += ltc1867l.c
+endif
endif
# Add analog driver build support (the nested if-then-else implements an OR)
@@ -86,6 +100,11 @@ ifeq ($(CONFIG_ADC),y)
DEPPATH += --dep-path analog
VPATH += :analog
CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" $(TOPDIR)$(DELIM)drivers$(DELIM)analog}
+else
+ifeq ($(CONFIG_COMP),y)
+ DEPPATH += --dep-path analog
+ VPATH += :analog
+ CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" $(TOPDIR)$(DELIM)drivers$(DELIM)analog}
+endif
endif
endif
-
diff --git a/drivers/analog/adc.c b/drivers/analog/adc.c
index d81971f1012..be1682e3cda 100644
--- a/drivers/analog/adc.c
+++ b/drivers/analog/adc.c
@@ -60,6 +60,7 @@
#include
#include
#include
+#include
#include
@@ -296,6 +297,10 @@ static ssize_t adc_read(FAR struct file *filep, FAR char *buffer, size_t buflen)
break;
}
+ /* Feed ADC data to entropy pool */
+
+ add_sensor_randomness(msg->am_data);
+
/* Copy the message to the user buffer */
if (msglen == 1)
diff --git a/drivers/analog/comp.c b/drivers/analog/comp.c
new file mode 100644
index 00000000000..d2b95d77674
--- /dev/null
+++ b/drivers/analog/comp.c
@@ -0,0 +1,262 @@
+/****************************************************************************
+ * drivers/analog/comp.c
+ *
+ * Copyright (C) 2017 Gregory Nutt. All rights reserved.
+ * Author: Mateusz Szafoni
+ *
+ * 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
+#include
+#include
+#include
+
+#include
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static int comp_open(FAR struct file *filep);
+static int comp_close(FAR struct file *filep);
+static ssize_t comp_read(FAR struct file *filep, FAR char *buffer,
+ size_t buflen);
+static int comp_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct file_operations comp_fops =
+{
+ comp_open, /* open */
+ comp_close, /* close */
+ comp_read, /* read */
+ NULL, /* write */
+ NULL, /* seek */
+ comp_ioctl /* ioctl */
+#ifndef CONFIG_DISABLE_POLL
+ , NULL /* poll */
+#endif
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+ , NULL /* unlink */
+#endif
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+/****************************************************************************
+ * Name: comp_open
+ *
+ * Description:
+ * This function is called whenever the COMP device is opened.
+ *
+ ****************************************************************************/
+
+static int comp_open(FAR struct file *filep)
+{
+ FAR struct inode *inode = filep->f_inode;
+ FAR struct comp_dev_s *dev = inode->i_private;
+ uint8_t tmp;
+ int ret = OK;
+
+ /* If the port is the middle of closing, wait until the close is finished */
+
+ if (sem_wait(&dev->ad_closesem) != OK)
+ {
+ ret = -errno;
+ }
+ else
+ {
+ /* Increment the count of references to the device. If this the first
+ * time that the driver has been opened for this device, then initialize
+ * the device.
+ */
+
+ tmp = dev->ad_ocount + 1;
+ if (tmp == 0)
+ {
+ /* More than 255 opens; uint8_t overflows to zero */
+
+ ret = -EMFILE;
+ }
+ else
+ {
+ /* Check if this is the first time that the driver has been opened. */
+
+ if (tmp == 1)
+ {
+ /* Yes.. perform one time hardware initialization. */
+
+ irqstate_t flags = enter_critical_section();
+ ret = dev->ad_ops->ao_setup(dev);
+ if (ret == OK)
+ {
+ /* Save the new open count on success */
+
+ dev->ad_ocount = tmp;
+ }
+
+ leave_critical_section(flags);
+ }
+ }
+
+ sem_post(&dev->ad_closesem);
+ }
+
+ return ret;
+}
+
+/****************************************************************************
+ * Name: comp_close
+ *
+ * Description:
+ * This routine is called when the COMP device is closed.
+ * It waits for the last remaining data to be sent.
+ *
+ ****************************************************************************/
+
+static int comp_close(FAR struct file *filep)
+{
+ FAR struct inode *inode = filep->f_inode;
+ FAR struct comp_dev_s *dev = inode->i_private;
+ irqstate_t flags;
+ int ret = OK;
+
+ if (sem_wait(&dev->ad_closesem) != OK)
+ {
+ ret = -errno;
+ }
+ else
+ {
+ /* Decrement the references to the driver. If the reference count will
+ * decrement to 0, then uninitialize the driver.
+ */
+
+ if (dev->ad_ocount > 1)
+ {
+ dev->ad_ocount--;
+ sem_post(&dev->ad_closesem);
+ }
+ else
+ {
+ /* There are no more references to the port */
+
+ dev->ad_ocount = 0;
+
+ /* Free the IRQ and disable the COMP device */
+
+ flags = enter_critical_section(); /* Disable interrupts */
+ dev->ad_ops->ao_shutdown(dev); /* Disable the COMP */
+ leave_critical_section(flags);
+
+ sem_post(&dev->ad_closesem);
+ }
+ }
+
+ return ret;
+}
+
+/****************************************************************************
+ * Name: comp_read
+ ****************************************************************************/
+
+static ssize_t comp_read(FAR struct file *filep, FAR char *buffer, size_t buflen)
+{
+ FAR struct inode *inode = filep->f_inode;
+ FAR struct comp_dev_s *dev = inode->i_private;
+ int ret;
+
+ ret = dev->ad_ops->ao_read(dev);
+
+ buffer[0] = (uint8_t)ret;
+
+ return 1;
+}
+
+/****************************************************************************
+ * Name: comp_ioctl
+****************************************************************************/
+
+static int comp_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
+{
+ FAR struct inode *inode = filep->f_inode;
+ FAR struct comp_dev_s *dev = inode->i_private;
+ int ret;
+
+ ret = dev->ad_ops->ao_ioctl(dev, cmd, arg);
+ return ret;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: comp_register
+ ****************************************************************************/
+
+int comp_register(FAR const char *path, FAR struct comp_dev_s *dev)
+{
+ int ret;
+
+ /* Initialize the COMP device structure */
+
+ dev->ad_ocount = 0;
+
+ /* Initialize semaphores */
+
+ sem_init(&dev->ad_closesem, 0, 1);
+
+ /* Register the COMP character driver */
+
+ ret = register_driver(path, &comp_fops, 0444, dev);
+ if (ret < 0)
+ {
+ sem_destroy(&dev->ad_closesem);
+ }
+
+ return ret;
+}
diff --git a/drivers/analog/ltc1867l.c b/drivers/analog/ltc1867l.c
new file mode 100644
index 00000000000..0f5bf1a758e
--- /dev/null
+++ b/drivers/analog/ltc1867l.c
@@ -0,0 +1,380 @@
+/****************************************************************************
+ * arch/drivers/analog/ltc1867l.c
+ *
+ * Copyright (C) 2017 DS-Automotion GmbH. All rights reserved.
+ * Author: Martin Lederhilger
+ *
+ * This file is a part of NuttX:
+ *
+ * Copyright (C) 2017 Gregory Nutt. All rights reserved.
+ *
+ * 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
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#if defined(CONFIG_ADC_LTC1867L)
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Device uses SPI Mode 1: CKPOL = 0, CKPHA = 0 */
+
+#define LTC1867L_SPI_MODE (SPIDEV_MODE0)
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct ltc1867l_dev_s
+{
+ FAR const struct adc_callback_s *cb;
+ FAR struct spi_dev_s *spi;
+ unsigned int devno;
+ FAR struct ltc1867l_channel_config_s *channel_config;
+ int channel_config_count;
+ sem_t sem;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static void adc_lock(FAR struct spi_dev_s *spi);
+static void adc_unlock(FAR struct spi_dev_s *spi);
+
+/* ADC methods */
+
+static int adc_bind(FAR struct adc_dev_s *dev,
+ FAR const struct adc_callback_s *callback);
+static void adc_reset(FAR struct adc_dev_s *dev);
+static int adc_setup(FAR struct adc_dev_s *dev);
+static void adc_shutdown(FAR struct adc_dev_s *dev);
+static void adc_rxint(FAR struct adc_dev_s *dev, bool enable);
+static int adc_ioctl(FAR struct adc_dev_s *dev, int cmd, unsigned long arg);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct adc_ops_s g_adcops =
+{
+ .ao_bind = adc_bind, /* ao_bind */
+ .ao_reset = adc_reset, /* ao_reset */
+ .ao_setup = adc_setup, /* ao_setup */
+ .ao_shutdown = adc_shutdown, /* ao_shutdown */
+ .ao_rxint = adc_rxint, /* ao_rxint */
+ .ao_ioctl = adc_ioctl /* ao_read */
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: adc_lock
+ *
+ * Description:
+ * Lock and configure the SPI bus.
+ *
+ ****************************************************************************/
+
+static void adc_lock(FAR struct spi_dev_s *spi)
+{
+ (void)SPI_LOCK(spi, true);
+ SPI_SETMODE(spi, LTC1867L_SPI_MODE);
+ SPI_SETBITS(spi, 16);
+ (void)SPI_HWFEATURES(spi, 0);
+ SPI_SETFREQUENCY(spi, CONFIG_LTC1867L_FREQUENCY);
+}
+
+/****************************************************************************
+ * Name: adc_unlock
+ *
+ * Description:
+ * Unlock the SPI bus.
+ *
+ ****************************************************************************/
+
+static void adc_unlock(FAR struct spi_dev_s *spi)
+{
+ (void)SPI_LOCK(spi, false);
+}
+
+/****************************************************************************
+ * Name: adc_bind
+ *
+ * Description:
+ * Bind the upper-half driver callbacks to the lower-half implementation. This
+ * must be called early in order to receive ADC event notifications.
+ *
+ ****************************************************************************/
+
+static int adc_bind(FAR struct adc_dev_s *dev,
+ FAR const struct adc_callback_s *callback)
+{
+ FAR struct ltc1867l_dev_s *priv = (FAR struct ltc1867l_dev_s *)dev->ad_priv;
+ priv->cb = callback;
+ return OK;
+}
+
+/****************************************************************************
+ * Name: adc_reset
+ *
+ * Description:
+ * Reset the ADC device. Called early to initialize the hardware. This
+ * is called, before ao_setup() and on error conditions.
+ *
+ ****************************************************************************/
+
+static void adc_reset(FAR struct adc_dev_s *dev)
+{
+}
+
+/****************************************************************************
+ * Name: adc_setup
+ *
+ * Description:
+ * Configure the ADC. This method is called the first time that the ADC
+ * device is opened. This will occur when the port is first opened.
+ * This setup includes configuring and attaching ADC interrupts. Interrupts
+ * are all disabled upon return.
+ *
+ ****************************************************************************/
+
+static int adc_setup(FAR struct adc_dev_s *dev)
+{
+ return OK;
+}
+
+/****************************************************************************
+ * Name: adc_shutdown
+ *
+ * Description:
+ * Disable the ADC. This method is called when the ADC device is closed.
+ * This method reverses the operation the setup method.
+ *
+ ****************************************************************************/
+
+static void adc_shutdown(FAR struct adc_dev_s *dev)
+{
+}
+
+/****************************************************************************
+ * Name: adc_rxint
+ *
+ * Description:
+ * Call to enable or disable RX interrupts
+ *
+ ****************************************************************************/
+
+static void adc_rxint(FAR struct adc_dev_s *dev, bool enable)
+{
+}
+
+/****************************************************************************
+ * Name: adc_ioctl
+ *
+ * Description:
+ * All ioctl calls will be routed through this method
+ *
+ ****************************************************************************/
+
+static int adc_ioctl(FAR struct adc_dev_s *dev, int cmd, unsigned long arg)
+{
+ FAR struct ltc1867l_dev_s *priv = (FAR struct ltc1867l_dev_s *)dev->ad_priv;
+ FAR struct spi_dev_s *spi = priv->spi;
+ int i;
+ uint16_t command;
+ uint16_t data;
+ int32_t dataToPost;
+ int ret = OK;
+
+ if(cmd == ANIOC_TRIGGER)
+ {
+ while (sem_wait(&priv->sem) != OK);
+
+ adc_lock(spi);
+
+ for (i = 0; i <= priv->channel_config_count; i++)
+ {
+ SPI_SELECT(spi, priv->devno, true);
+
+ if (i < priv->channel_config_count)
+ {
+ command = priv->channel_config[i].analog_multiplexer_config |
+ priv->channel_config[i].analog_inputMode;
+ command = command << 8;
+ }
+ else
+ {
+ command = 0;
+ }
+
+ data = SPI_SEND(spi, command);
+ up_udelay(2);
+ SPI_SELECT(spi, priv->devno, false);
+ up_udelay(4);
+
+ if (i > 0)
+ {
+ if (priv->channel_config[i-1].analog_inputMode == LTC1867L_UNIPOLAR ||
+ (priv->channel_config[i-1].analog_inputMode == LTC1867L_BIPOLAR &&
+ data >= 0 && data <= 0x7fff))
+ {
+ dataToPost = data;
+ }
+ else
+ {
+ dataToPost = -(0xffff - data) - 1;
+ }
+
+ priv->cb->au_receive(dev, priv->channel_config[i-1].channel, dataToPost);
+ }
+ }
+
+ adc_unlock(spi);
+ sem_post(&priv->sem);
+ }
+ else
+ {
+ aerr("ERROR: Unrecognized cmd: %d\n", cmd);
+ ret = -ENOTTY;
+ }
+
+ return ret;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: ltc1867l_register
+ *
+ * Description:
+ * Register the LTC1867L character device as 'devpath'
+ *
+ * Input Parameters:
+ * devpath - The full path to the driver to register. E.g., "/dev/adc0"
+ * spi - An instance of the SPI interface to use to communicate with
+ * LTC1867L
+ * devno - SPI device number
+ * channel_config - A pointer to an array which holds the configuration
+ * for each sampled channel.
+ * channel_config_count - Number of channels to sample
+ *
+ * Returned Value:
+ * Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int ltc1867l_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
+ unsigned int devno,
+ FAR struct ltc1867l_channel_config_s* channel_config,
+ int channel_config_count)
+{
+ FAR struct ltc1867l_dev_s *adcpriv;
+ FAR struct adc_dev_s *adcdev;
+ int ret;
+
+ /* Sanity check */
+
+ DEBUGASSERT(spi != NULL);
+ DEBUGASSERT(channel_config != NULL);
+
+ /* Initialize the LTC1867L device structure */
+
+ adcpriv = (FAR struct ltc1867l_dev_s *)kmm_malloc(sizeof(struct ltc1867l_dev_s));
+ if (adcpriv == NULL)
+ {
+ aerr("ERROR: Failed to allocate ltc1867l_dev_s instance\n");
+ return -ENOMEM;
+ }
+
+ adcpriv->spi = spi;
+ adcpriv->devno = devno;
+ adcpriv->channel_config = channel_config;
+ adcpriv->channel_config_count = channel_config_count;
+
+ ret = sem_init(&adcpriv->sem, 1, 1);
+ if(ret == -1)
+ {
+ kmm_free(adcpriv);
+ return -errno;
+ }
+
+ adcdev = (FAR struct adc_dev_s *)kmm_malloc(sizeof(struct adc_dev_s));
+ if (adcdev == NULL)
+ {
+ aerr("ERROR: Failed to allocate adc_dev_s instance\n");
+ sem_destroy(&adcpriv->sem);
+ kmm_free(adcpriv);
+ return -ENOMEM;
+ }
+
+ memset(adcdev, 0, sizeof(struct adc_dev_s));
+ adcdev->ad_ops = &g_adcops;
+ adcdev->ad_priv = adcpriv;
+
+ /* Register the character driver */
+
+ ret = adc_register(devpath, adcdev);
+ if (ret < 0)
+ {
+ aerr("ERROR: Failed to register adc driver: %d\n", ret);
+ kmm_free(adcdev);
+ sem_destroy(&adcpriv->sem);
+ kmm_free(adcpriv);
+ }
+
+ return ret;
+}
+#endif
diff --git a/drivers/dev_urandom.c b/drivers/dev_urandom.c
index e7022cb9f54..5b59736907a 100644
--- a/drivers/dev_urandom.c
+++ b/drivers/dev_urandom.c
@@ -49,11 +49,13 @@
#include
#include
#include
+#include
#include
#include
#include
#include
+#include
#if defined(CONFIG_DEV_URANDOM) && !defined(CONFIG_DEV_URANDOM_ARCH)
@@ -62,13 +64,18 @@
****************************************************************************/
#if !defined(CONFIG_DEV_URANDOM_CONGRUENTIAL) && \
- !defined(CONFIG_DEV_URANDOM_XORSHIFT128)
-# define CONFIG_DEV_URANDOM_XORSHIFT128 1
+ !defined(CONFIG_DEV_URANDOM_XORSHIFT128) && \
+ !defined(CONFIG_DEV_URANDOM_RANDOM_POOL)
+# ifdef CONFIG_CRYPTO_RANDOM_POOL
+# define CONFIG_DEV_URANDOM_RANDOM_POOL 1
+# else
+# define CONFIG_DEV_URANDOM_XORSHIFT128 1
+# endif
#endif
#ifdef CONFIG_DEV_URANDOM_XORSHIFT128
# define PRNG() do_xorshift128()
-#else /* CONFIG_DEV_URANDOM_CONGRUENTIAL */
+#elif defined(CONFIG_DEV_URANDOM_CONGRUENTIAL)
# define PRNG() do_congruential()
#endif
@@ -158,6 +165,12 @@ static inline uint32_t do_congruential(void)
static ssize_t devurand_read(FAR struct file *filep, FAR char *buffer,
size_t len)
{
+#ifdef CONFIG_DEV_URANDOM_RANDOM_POOL
+ if (len)
+ {
+ getrandom(buffer, len);
+ }
+#else
size_t n;
uint32_t rnd;
@@ -208,6 +221,7 @@ static ssize_t devurand_read(FAR struct file *filep, FAR char *buffer,
}
while (--n > 0);
}
+#endif /* CONFIG_DEV_URANDOM_RANDOM_POOL */
return len;
}
@@ -228,6 +242,56 @@ static ssize_t devurand_write(FAR struct file *filep, FAR const char *buffer,
memcpy(&seed, buffer, len);
srand(seed);
return len;
+#elif defined(CONFIG_DEV_URANDOM_RANDOM_POOL)
+ const unsigned int alignmask = sizeof(uint32_t) - 1;
+ const size_t initlen = len;
+ uint32_t tmp = 0;
+ size_t currlen;
+
+ if (!len)
+ {
+ return 0;
+ }
+
+ /* Seed entropy pool with data from user. */
+
+ if ((uintptr_t)buffer & alignmask)
+ {
+ /* Make unaligned input aligned. */
+
+ currlen = min(sizeof(uint32_t) - ((uintptr_t)buffer & alignmask), len);
+ memcpy(&tmp, buffer, currlen);
+ up_rngaddint(RND_SRC_SW, tmp);
+
+ len -= currlen;
+ buffer += currlen;
+ }
+
+ if (len >= sizeof(uint32_t))
+ {
+ /* Handle bulk aligned, word-sized data. */
+
+ DEBUGASSERT(((uintptr_t)buffer & alignmask) == 0);
+ currlen = len / sizeof(uint32_t);
+ up_rngaddentropy(RND_SRC_SW, (FAR uint32_t *)buffer, currlen);
+ buffer += currlen * sizeof(uint32_t);
+ len %= sizeof(uint32_t);
+ }
+
+ if (len > 0)
+ {
+ /* Handle trailing bytes. */
+
+ DEBUGASSERT(len < sizeof(uint32_t));
+ memcpy(&tmp, buffer, len);
+ up_rngaddint(RND_SRC_SW, tmp);
+ }
+
+ /* Reseeding of random number generator from entropy pool. */
+
+ up_rngreseed();
+
+ return initlen;
#else
len = min(len, sizeof(g_prng.u));
memcpy(&g_prng.u, buffer, len);
@@ -274,6 +338,8 @@ void devurandom_register(void)
#ifdef CONFIG_DEV_URANDOM_CONGRUENTIAL
srand(10197);
+#elif defined(CONFIG_DEV_URANDOM_RANDOM_POOL)
+ up_randompool_initialize();
#else
g_prng.state.w = 97;
g_prng.state.x = 101;
diff --git a/drivers/input/ads7843e.c b/drivers/input/ads7843e.c
index d9c2c3b9882..6e4e9395ec6 100644
--- a/drivers/input/ads7843e.c
+++ b/drivers/input/ads7843e.c
@@ -70,6 +70,7 @@
#include
#include
#include
+#include
#include
#include
@@ -624,6 +625,8 @@ static void ads7843e_worker(FAR void *arg)
y = ads7843e_sendcmd(priv, ADS7843_CMD_YPOSITION);
#endif
+ add_ui_randomness((x << 16) | y);
+
/* Perform a thresholding operation so that the results will be more stable.
* If the difference from the last sample is small, then ignore the event.
* REVISIT: Should a large change in pressure also generate a event?
diff --git a/drivers/input/ajoystick.c b/drivers/input/ajoystick.c
index aaba021b95b..6665b8fdd21 100644
--- a/drivers/input/ajoystick.c
+++ b/drivers/input/ajoystick.c
@@ -60,6 +60,7 @@
#include
#include
#include
+#include
#include
@@ -321,6 +322,8 @@ static void ajoy_sample(FAR struct ajoy_upperhalf_s *priv)
DEBUGASSERT(lower->al_buttons);
sample = lower->al_buttons(lower);
+ add_ui_randomness(sample);
+
#if !defined(CONFIG_DISABLE_POLL) || !defined(CONFIG_DISABLE_SIGNALS)
/* Determine which buttons have been newly pressed and which have been
* newly released.
diff --git a/drivers/input/button_upper.c b/drivers/input/button_upper.c
index 2c03d3de3e0..b4432cbad35 100644
--- a/drivers/input/button_upper.c
+++ b/drivers/input/button_upper.c
@@ -56,6 +56,7 @@
#include
#include
#include
+#include
#include
@@ -317,6 +318,8 @@ static void btn_sample(FAR struct btn_upperhalf_s *priv)
DEBUGASSERT(lower->bl_buttons);
sample = lower->bl_buttons(lower);
+ add_ui_randomness(sample);
+
#if !defined(CONFIG_DISABLE_POLL) || !defined(CONFIG_DISABLE_SIGNALS)
/* Determine which buttons have been newly pressed and which have been
* newly released.
diff --git a/drivers/input/djoystick.c b/drivers/input/djoystick.c
index 1cc1b540045..bd3c9e47039 100644
--- a/drivers/input/djoystick.c
+++ b/drivers/input/djoystick.c
@@ -60,6 +60,7 @@
#include
#include
#include
+#include
#include
@@ -321,6 +322,8 @@ static void djoy_sample(FAR struct djoy_upperhalf_s *priv)
DEBUGASSERT(lower->dl_sample);
sample = lower->dl_sample(lower);
+ add_ui_randomness(sample);
+
#if !defined(CONFIG_DISABLE_POLL) || !defined(CONFIG_DISABLE_SIGNALS)
/* Determine which buttons have been newly pressed and which have been
* newly released.
diff --git a/drivers/input/max11802.c b/drivers/input/max11802.c
index 82ad1f66893..7fb2087f069 100644
--- a/drivers/input/max11802.c
+++ b/drivers/input/max11802.c
@@ -64,6 +64,7 @@
#include
#include
#include
+#include
#include
#include
@@ -628,6 +629,8 @@ static void max11802_worker(FAR void *arg)
}
while (readycount < 2);
+ add_ui_randomness((x << 16) | y);
+
/* Continue to sample the position while the pen is down */
wd_start(priv->wdog, MAX11802_WDOG_DELAY, max11802_wdog, 1,
diff --git a/drivers/input/mxt.c b/drivers/input/mxt.c
index e1152851719..01d11bc63b1 100644
--- a/drivers/input/mxt.c
+++ b/drivers/input/mxt.c
@@ -64,6 +64,7 @@
#include
#include
#include
+#include
#include
#include
@@ -889,6 +890,8 @@ static void mxt_touch_event(FAR struct mxt_dev_s *priv,
sample->pressure = pressure;
sample->valid = true;
+ add_ui_randomness((x << 16) ^ y ^ (area << 9) ^ (pressure << 1));
+
/* If this is not the first touch report, then report it as a move:
* Same contact, same ID, but with a new, updated position.
* The CONTACT_REPORT state means that a contacted has been detected,
diff --git a/drivers/input/stmpe811_temp.c b/drivers/input/stmpe811_temp.c
index 0cb5c686c7d..5bbad0d4550 100644
--- a/drivers/input/stmpe811_temp.c
+++ b/drivers/input/stmpe811_temp.c
@@ -48,6 +48,7 @@
#include
#include
+#include
#include "stmpe811.h"
@@ -139,6 +140,8 @@ uint16_t stmpe811_tempread(STMPE811_HANDLE handle)
temp1 = stmpe811_getreg8(priv, STMPE811_SYS_CTRL2);
temp2 = stmpe811_getreg8(priv, STMPE811_SYS_CTRL2+1);
+ add_sensor_randomness((temp1 << 8) | temp2);
+
/* Scale the temperature (where Vio is assumed to be .33) */
temp = ((uint32_t)(temp1 & 3) << 8) | temp2;
diff --git a/drivers/input/stmpe811_tsc.c b/drivers/input/stmpe811_tsc.c
index b58e9feebd1..c49723c731d 100644
--- a/drivers/input/stmpe811_tsc.c
+++ b/drivers/input/stmpe811_tsc.c
@@ -62,6 +62,7 @@
#include
#include
#include
+#include
#include
#include
@@ -534,6 +535,8 @@ static ssize_t stmpe811_read(FAR struct file *filep, FAR char *buffer, size_t le
report->point[0].y = sample.y;
report->point[0].pressure = sample.z;
+ add_ui_randomness((sample.x << 16) ^ (sample.y << 8) ^ sample.z);
+
/* Report the appropriate flags */
if (sample.contact == CONTACT_UP)
diff --git a/drivers/input/tsc2007.c b/drivers/input/tsc2007.c
index 8d49a2e0705..fb82cc05579 100644
--- a/drivers/input/tsc2007.c
+++ b/drivers/input/tsc2007.c
@@ -68,6 +68,7 @@
#include
#include
#include
+#include
#include
#include
@@ -619,7 +620,7 @@ static void tsc2007_worker(FAR void *arg)
* vertical or horizontal resistive network. The A/D converter converts
* the voltage measured at the point where the panel is touched. A measurement
* of the Y position of the pointing device is made by connecting the X+
- * input to a data converter chip, turning on the Y+ and Y– drivers, and
+ * input to a data converter chip, turning on the Y+ and Y- drivers, and
* digitizing the voltage seen at the X+ input ..."
*
* "... it is recommended that whenever the host writes to the TSC2007, the
@@ -698,6 +699,8 @@ static void tsc2007_worker(FAR void *arg)
priv->sample.y = y;
priv->sample.pressure = pressure;
priv->sample.valid = true;
+
+ add_ui_randomness((x << 16) ^ y ^ (pressure << 9));
}
/* Note the availability of new measurements */
diff --git a/drivers/lcd/pcf8574_lcd_backpack.c b/drivers/lcd/pcf8574_lcd_backpack.c
index ad107f1ff45..4729481a574 100644
--- a/drivers/lcd/pcf8574_lcd_backpack.c
+++ b/drivers/lcd/pcf8574_lcd_backpack.c
@@ -1,7 +1,7 @@
/****************************************************************************
* drivers/lcd/pcf8574_lcd_backpack.c
*
- * Copyright (C) 2016 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2016-2017 Gregory Nutt. All rights reserved.
* Author: dev@ziggurat29.com
*
* Redistribution and use in source and binary forms, with or without
@@ -39,6 +39,7 @@
#include
+#include
#include
#include
#include
diff --git a/drivers/sensors/Kconfig b/drivers/sensors/Kconfig
index 9b3e2660b20..5871c18b815 100644
--- a/drivers/sensors/Kconfig
+++ b/drivers/sensors/Kconfig
@@ -32,6 +32,29 @@ config BMP180
---help---
Enable driver support for the Bosch BMP180 barometer sensor.
+config HTS221
+ bool "ST HTS221 humidity sensor"
+ default n
+ select I2C
+ ---help---
+ Enable driver support for the ST HTS221 humidity sensor.
+
+if HTS221
+
+config DEBUG_HTS221
+ bool "Debug support for the HTS221"
+ default n
+ ---help---
+ Enables debug features for the HTS221
+
+config HTS221_NPOLLWAITERS
+ int "Number of waiters to poll"
+ default 1
+ ---help---
+ Number of waiters to poll
+
+endif # HTS221
+
config SENSORS_L3GD20
bool "ST L3GD20 Gyroscope Sensor support"
default n
diff --git a/drivers/sensors/Make.defs b/drivers/sensors/Make.defs
index c4b14ace8f6..d0bb9fa650f 100644
--- a/drivers/sensors/Make.defs
+++ b/drivers/sensors/Make.defs
@@ -81,6 +81,10 @@ ifeq ($(CONFIG_BMP180),y)
CSRCS += bmp180.c
endif
+ifeq ($(CONFIG_HTS221),y)
+ CSRCS += hts221.c
+endif
+
ifeq ($(CONFIG_I2C_LM75),y)
CSRCS += lm75.c
endif
diff --git a/drivers/sensors/adxl345_base.c b/drivers/sensors/adxl345_base.c
index 8a92d059eb6..93ebf9cf456 100644
--- a/drivers/sensors/adxl345_base.c
+++ b/drivers/sensors/adxl345_base.c
@@ -48,6 +48,7 @@
#include
#include
+#include
#include "adxl345.h"
@@ -165,6 +166,9 @@ static ssize_t adxl345_read(FAR struct file *filep, FAR char *buffer, size_t len
sample.data_z = adxl345_getreg8(priv, ADXL345_DATAZ1);
sample.data_z = (sample.data_z << 8) | adxl345_getreg8(priv, ADXL345_DATAZ0);
+ add_sensor_randomness(sample.data_x);
+ add_sensor_randomness((sample.data_z << 16) | sample.data_y);
+
/* Return read sample */
buffer = (FAR char *) &sample;
diff --git a/drivers/sensors/bh1750fvi.c b/drivers/sensors/bh1750fvi.c
index 88ba994a387..c0c2d38de01 100644
--- a/drivers/sensors/bh1750fvi.c
+++ b/drivers/sensors/bh1750fvi.c
@@ -51,6 +51,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_I2C) && defined(CONFIG_BH1750FVI)
@@ -250,6 +251,8 @@ static ssize_t bh1750fvi_read(FAR struct file *filep, FAR char *buffer,
buffer[0] = lux & 0xFF;
buffer[1] = (lux & 0xFF00) >> 8;
+ add_sensor_randomness(lux);
+
return buflen;
}
diff --git a/drivers/sensors/bmg160.c b/drivers/sensors/bmg160.c
index 03ad72a5d04..534985d133a 100644
--- a/drivers/sensors/bmg160.c
+++ b/drivers/sensors/bmg160.c
@@ -51,6 +51,7 @@
#include
#include
+#include
#if defined(CONFIG_SPI) && defined(CONFIG_BMG160)
@@ -243,6 +244,10 @@ static void bmg160_read_measurement_data(FAR struct bmg160_dev_s *dev)
/* Give back the semaphore */
sem_post(&dev->datasem);
+
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness((x_gyr << 16) ^ (y_gyr << 8) ^ z_gyr);
}
/****************************************************************************
diff --git a/drivers/sensors/bmp180.c b/drivers/sensors/bmp180.c
index 1a7d538c334..a0857d8e575 100644
--- a/drivers/sensors/bmp180.c
+++ b/drivers/sensors/bmp180.c
@@ -53,6 +53,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_I2C) && defined(CONFIG_BMP180)
@@ -464,6 +465,10 @@ static int bmp180_getpressure(FAR struct bmp180_dev_s *priv)
bmp180_read_press_temp(priv);
+ /* Feed raw sensor data to entropy pool */
+
+ add_sensor_randomness((priv->bmp180_utemp << 16) ^ priv->bmp180_upress);
+
/* Calculate true temperature */
x1 = ((priv->bmp180_utemp - priv->bmp180_cal_ac6) * priv->bmp180_cal_ac5) >> 15;
diff --git a/drivers/sensors/hts221.c b/drivers/sensors/hts221.c
new file mode 100644
index 00000000000..4dc9c0d2dd1
--- /dev/null
+++ b/drivers/sensors/hts221.c
@@ -0,0 +1,1131 @@
+/****************************************************************************
+ * drivers/sensors/hts221.c
+ *
+ * Copyright (C) 2014 Haltian Ltd. All rights reserved.
+ *
+ * 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
+#include
+#include
+#include
+
+#include
+
+/****************************************************************************
+ * Pre-Processor Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_DEBUG_HTS221
+# define hts221_dbg(x, ...) _info(x, ##__VA_ARGS__)
+#else
+# define hts221_dbg(x, ...) sninfo(x, ##__VA_ARGS__)
+#endif
+
+#define HTS221_WHO_AM_I 0x0f
+#define HTS221_AV_CONF 0x10
+#define HTS221_CTRL_REG1 0x20
+#define HTS221_CTRL_REG2 0x21
+#define HTS221_CTRL_REG3 0x22
+#define HTS221_STATUS_REG 0x27
+#define HTS221_HUM_OUT_L 0x28
+#define HTS221_HUM_OUT_H 0x29
+#define HTS221_TEMP_OUT_L 0x2a
+#define HTS221_TEMP_OUT_H 0x2b
+
+/* Calibration registers */
+
+#define HTS221_CALIB_H0_RH_X2 0x30
+#define HTS221_CALIB_H1_RH_X2 0x31
+#define HTS221_CALIB_T0_DEGC_X8 0x32
+#define HTS221_CALIB_T1_DEGC_X8 0x33
+#define HTS221_CALIB_T1_T0_MSB 0x35
+#define HTS221_CALIB_H0T0_OUT_L 0x36
+#define HTS221_CALIB_H0T0_OUT_H 0x37
+#define HTS221_CALIB_H1T0_OUT_L 0x3a
+#define HTS221_CALIB_H1T0_OUT_H 0x3b
+#define HTS221_CALIB_T0_OUT_L 0x3c
+#define HTS221_CALIB_T0_OUT_H 0x3d
+#define HTS221_CALIB_T1_OUT_L 0x3e
+#define HTS221_CALIB_T1_OUT_H 0x3f
+
+/* HTS221_CTRL_REG1 */
+
+#define HTS221_CTRL_REG1_PD (1 << 7)
+#define HTS221_CTRL_REG1_BDU (1 << 2)
+
+/* HTS221_CTRL_REG2 */
+
+#define HTS221_CTRL_REG2_BOOT (1 << 7)
+#define HTS221_CTRL_REG2_ONE_SHOT (1 << 0)
+
+/* HTS221_CTRL_REG3 */
+
+#define HTS221_CTRL_REG3_DRDY_L_H (1 << 7)
+#define HTS221_CTRL_REG3_PP_OD (1 << 6)
+#define HTS221_CTRL_REG3_DRDY_EN (1 << 2)
+
+/* HTS221_STATUS_REG */
+
+#define HTS221_STATUS_REG_H_DA (1 << 1)
+#define HTS221_STATUS_REG_T_DA (1 << 0)
+
+#define HTS221_I2C_RETRIES 10
+
+/****************************************************************************
+* Private Function Prototypes
+*****************************************************************************/
+
+static int hts221_open(FAR struct file *filep);
+static int hts221_close(FAR struct file *filep);
+static ssize_t hts221_read(FAR struct file *filep, FAR char *buffer,
+ size_t buflen);
+static ssize_t hts221_write(FAR struct file *filep, FAR const char *buffer,
+ size_t buflen);
+static int hts221_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
+#ifndef CONFIG_DISABLE_POLL
+static int hts221_poll(FAR struct file *filep, FAR struct pollfd *fds,
+ bool setup);
+#endif
+
+/****************************************************************************
+* Private Types
+****************************************************************************/
+
+struct hts221_dev_s
+{
+ struct i2c_master_s *i2c;
+ uint8_t addr;
+ hts221_config_t *config;
+ sem_t devsem;
+ volatile bool int_pending;
+#ifndef CONFIG_DISABLE_POLL
+ struct pollfd *fds[CONFIG_HTS221_NPOLLWAITERS];
+#endif
+ struct
+ {
+ int16_t t0_out;
+ int16_t t1_out;
+ int16_t h0_t0_out;
+ int16_t h1_t0_out;
+ unsigned int t0_x8:10;
+ unsigned int t1_x8:10;
+ uint8_t h0_x2;
+ uint8_t h1_x2;
+ } calib;
+};
+
+/****************************************************************************
+* Private Data
+****************************************************************************/
+
+static const struct file_operations g_humidityops =
+{
+ hts221_open, /* open */
+ hts221_close, /* close */
+ hts221_read, /* read */
+ hts221_write, /* write */
+ NULL, /* seek */
+ hts221_ioctl /* ioctl */
+#ifndef CONFIG_DISABLE_POLL
+ , hts221_poll /* poll */
+#endif
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+ , NULL /* unlink */
+#endif
+};
+
+static struct hts221_dev_s *g_humid_data;
+
+/****************************************************************************
+* Private Functions
+****************************************************************************/
+
+static int hts221_do_transfer(FAR struct hts221_dev_s *dev,
+ FAR struct i2c_msg_s *msgv,
+ size_t nmsg)
+{
+ int ret = -EIO;
+ int retries;
+
+ for (retries = 0; retries < HTS221_I2C_RETRIES; retries++)
+ {
+ ret = I2C_TRANSFER(dev->i2c, msgv, nmsg);
+ if (ret >= 0)
+ {
+ return 0;
+ }
+ else
+ {
+ /* Some error. Try to reset I2C bus and keep trying. */
+#ifdef CONFIG_I2C_RESET
+ if (retries == HTS221_I2C_RETRIES - 1)
+ {
+ break;
+ }
+
+ ret = up_i2creset(dev->i2c);
+ if (ret < 0)
+ {
+ hts221_dbg("up_i2creset failed: %d\n", ret);
+ return ret;
+ }
+#endif
+ }
+ }
+
+ hts221_dbg("xfer failed: %d\n", ret);
+ return ret;
+}
+
+static int32_t hts221_write_reg8(FAR struct hts221_dev_s *dev,
+ const uint8_t *command)
+{
+ struct i2c_msg_s msgv[2] =
+ {
+ {
+ .addr = dev->addr,
+ .flags = 0,
+ .buffer = (FAR void *)&command[0],
+ .length = 1
+ },
+ {
+ .addr = dev->addr,
+ .flags = I2C_M_NORESTART,
+ .buffer = (FAR void *)&command[1],
+ .length = 1
+ }
+ };
+
+ return hts221_do_transfer(dev, msgv, 2);
+}
+
+static int hts221_read_reg(FAR struct hts221_dev_s *dev,
+ FAR const uint8_t *command, FAR uint8_t *value)
+{
+ struct i2c_msg_s msgv[2] =
+ {
+ {
+ .addr = dev->addr,
+ .flags = 0,
+ .buffer = (FAR void *)command,
+ .length = 1
+ },
+ {
+ .addr = dev->addr,
+ .flags = I2C_M_READ,
+ .buffer = value,
+ .length = 1
+ }
+ };
+
+ return hts221_do_transfer(dev, msgv, 2);
+}
+
+static int hts221_get_id(FAR struct hts221_dev_s *priv, uint8_t * value)
+{
+ int ret = OK;
+ uint8_t cmd = HTS221_WHO_AM_I;
+
+ ret = hts221_read_reg(priv, &cmd, value);
+
+ hts221_dbg("Who am I request: 0x%02X\n", *value);
+
+ return ret;
+}
+
+static int hts221_cfgr_resolution(FAR struct hts221_dev_s *priv,
+ FAR hts221_settings_t *settings)
+{
+ int ret;
+ uint8_t value;
+ const uint8_t addr = HTS221_AV_CONF;
+ uint8_t regval = 0;
+ uint8_t cmd[2] = { 0 };
+ const uint8_t mask = 0x3f;
+
+ ret = hts221_read_reg(priv, &addr, ®val);
+ hts221_dbg("Default resolution: 0x%02X\n", regval);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ value = (uint8_t)settings->humid_resol |
+ ((uint8_t)settings->temp_resol << 3);
+ regval &= ~mask;
+ cmd[0] = addr;
+ cmd[1] = regval | value;
+ hts221_dbg("New resolution: 0x%02X\n", cmd[1]);
+
+ ret = hts221_write_reg8(priv, cmd);
+
+ hts221_dbg("Resolution changed: temp=%d humid=%d ret=%d\n",
+ settings->temp_resol, settings->humid_resol, ret);
+
+ return ret;
+}
+
+static int hts221_config_ctrl_reg3(FAR struct hts221_dev_s *priv,
+ FAR hts221_settings_t *settings)
+{
+ int ret = OK;
+ uint8_t regval = 0;
+ uint8_t addr = HTS221_CTRL_REG3;
+ const uint8_t mask = 0xc4;
+ uint8_t data_to_write[2] = { 0 };
+
+ ret = hts221_read_reg(priv, &addr, ®val);
+ hts221_dbg("CTRL_REG3: 0x%02X\n", regval);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ regval &= ~mask;
+ regval |= (uint8_t)(settings->is_high_edge ? 0 : HTS221_CTRL_REG3_DRDY_L_H);
+ regval |= (uint8_t)(settings->is_open_drain ? HTS221_CTRL_REG3_PP_OD : 0);
+ regval |= (uint8_t)(settings->is_data_rdy ? HTS221_CTRL_REG3_DRDY_EN : 0);
+
+ data_to_write[0] = addr;
+ data_to_write[1] = regval;
+
+ ret = hts221_write_reg8(priv, data_to_write);
+
+ return ret;
+}
+
+static int hts221_config_ctrl_reg2(FAR struct hts221_dev_s *priv,
+ FAR hts221_settings_t *settings)
+{
+ int ret = OK;
+ uint8_t regval = 0;
+ uint8_t addr = HTS221_CTRL_REG2;
+ const uint8_t mask = 0x80;
+ uint8_t data_to_write[2] = { 0 };
+
+ ret = hts221_read_reg(priv, &addr, ®val);
+ hts221_dbg("CTRL_REG2: 0x%02X\n", regval);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ regval &= ~mask;
+ regval |= (uint8_t)(settings->is_boot ? HTS221_CTRL_REG2_BOOT : 0);
+
+ data_to_write[0] = addr;
+ data_to_write[1] = regval;
+
+ ret = hts221_write_reg8(priv, data_to_write);
+
+ return ret;
+}
+
+static int hts221_config_ctrl_reg1(FAR struct hts221_dev_s *priv,
+ FAR hts221_settings_t * settings)
+{
+ int ret = OK;
+ uint8_t regval = 0;
+ uint8_t addr = HTS221_CTRL_REG1;
+ const uint8_t mask = 0x87;
+ uint8_t data_to_write[2] = { 0 };
+
+ ret = hts221_read_reg(priv, &addr, ®val);
+ hts221_dbg("CTRL_REG1: 0x%02X\n", regval);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ regval &= ~mask;
+ regval |= (uint8_t) (settings->odr & 0xFF);
+ regval |= (uint8_t) (settings->is_bdu ? HTS221_CTRL_REG1_BDU : 0);
+
+ data_to_write[0] = addr;
+ data_to_write[1] = regval;
+
+ ret = hts221_write_reg8(priv, data_to_write);
+
+ return ret;
+}
+
+static int hts221_power_on_off(FAR struct hts221_dev_s *priv, bool on)
+{
+ int ret = OK;
+ uint8_t regval = 0;
+ uint8_t addr = HTS221_CTRL_REG1;
+ uint8_t data_to_write[2];
+
+ ret = hts221_read_reg(priv, &addr, ®val);
+ hts221_dbg("CTRL_REG1: 0x%02X\n", regval);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ if (on)
+ {
+ regval |= HTS221_CTRL_REG1_PD;
+ }
+ else
+ {
+ regval &= ~HTS221_CTRL_REG1_PD;
+ }
+ data_to_write[0] = addr;
+ data_to_write[1] = regval;
+
+ ret = hts221_write_reg8(priv, data_to_write);
+
+ return ret;
+}
+
+static int hts221_config(FAR struct hts221_dev_s *priv,
+ FAR hts221_settings_t * cfgr)
+{
+ int ret = OK;
+
+ ret = hts221_cfgr_resolution(priv, cfgr);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ ret = hts221_config_ctrl_reg3(priv, cfgr);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ ret = hts221_config_ctrl_reg2(priv, cfgr);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ ret = hts221_config_ctrl_reg1(priv, cfgr);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ return ret;
+}
+
+static int hts221_start_conversion(FAR struct hts221_dev_s *priv)
+{
+ int ret;
+ uint8_t addr = HTS221_CTRL_REG2;
+ uint8_t data_to_write[2];
+
+ ret = hts221_power_on_off(priv, true);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ data_to_write[0] = addr;
+ data_to_write[1] = (uint8_t) HTS221_CTRL_REG2_ONE_SHOT;
+
+ ret = hts221_write_reg8(priv, data_to_write);
+ if (ret < 0)
+ {
+ hts221_dbg("Cannot start conversion\n");
+ ret = ERROR;
+ }
+
+ return ret;
+}
+
+static int hts221_check_status(FAR struct hts221_dev_s *priv,
+ FAR hts221_status_t * status)
+{
+ int ret = OK;
+ uint8_t addr = HTS221_STATUS_REG;
+ const uint8_t humid_mask = 0x02;
+ const uint8_t temp_mask = 0x01;
+ uint8_t regval = 0;
+
+ ret = hts221_read_reg(priv, &addr, ®val);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ status->is_humid_ready = ((regval & humid_mask) ? true : false);
+ status->is_temp_ready = ((regval & temp_mask) ? true : false);
+
+ return ret;
+}
+
+static int hts221_read_raw_data(FAR struct hts221_dev_s *priv,
+ FAR hts221_raw_data_t * data)
+{
+ int ret = OK;
+ uint8_t addr_humid_low = HTS221_HUM_OUT_L;
+ uint8_t addr_humid_high = HTS221_HUM_OUT_H;
+ uint8_t addr_temp_low = HTS221_TEMP_OUT_L;
+ uint8_t addr_temp_high = HTS221_TEMP_OUT_H;
+ uint32_t flags;
+
+ ret = hts221_read_reg(priv, &addr_humid_low, &data->humid_low_bits);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ ret = hts221_read_reg(priv, &addr_humid_high, &data->humid_high_bits);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ ret = hts221_read_reg(priv, &addr_temp_low, &data->temp_low_bits);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ ret = hts221_read_reg(priv, &addr_temp_high, &data->temp_high_bits);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ /* Add low-order bytes to entropy pool. */
+
+ add_sensor_randomness(((uint32_t)data->humid_low_bits << 8) | data->temp_low_bits);
+
+ flags = enter_critical_section();
+ priv->int_pending = false;
+ leave_critical_section(flags);
+
+ hts221_dbg("Humid: 0x%02X, 0x%02X Temper: 0x%02X 0x%02X\n",
+ data->humid_high_bits, data->humid_low_bits,
+ data->temp_high_bits, data->temp_low_bits);
+
+ return ret;
+}
+
+static int hts221_load_calibration_data(FAR struct hts221_dev_s *priv)
+{
+ int ret;
+ uint8_t addr;
+ uint8_t t0_degc_x8 = 0;
+ uint8_t t1_degc_x8 = 0;
+ uint8_t t1_t0_msb = 0;
+ uint8_t t0_out_lsb = 0;
+ uint8_t t0_out_msb = 0;
+ uint8_t t1_out_lsb = 0;
+ uint8_t t1_out_msb = 0;
+ uint8_t h0_rh_x2 = 0;
+ uint8_t h1_rh_x2 = 0;
+ uint8_t h0t0_out_lsb = 0;
+ uint8_t h0t0_out_msb = 0;
+ uint8_t h1t0_out_lsb = 0;
+ uint8_t h1t0_out_msb = 0;
+
+ addr = HTS221_CALIB_T0_DEGC_X8;
+ ret = hts221_read_reg(priv, &addr, &t0_degc_x8);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_T1_DEGC_X8;
+ ret = hts221_read_reg(priv, &addr, &t1_degc_x8);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_T1_T0_MSB;
+ ret = hts221_read_reg(priv, &addr, &t1_t0_msb);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_T0_OUT_L;
+ ret = hts221_read_reg(priv, &addr, &t0_out_lsb);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_T0_OUT_H;
+ ret = hts221_read_reg(priv, &addr, &t0_out_msb);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_T1_OUT_L;
+ ret = hts221_read_reg(priv, &addr, &t1_out_lsb);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_T1_OUT_H;
+ ret = hts221_read_reg(priv, &addr, &t1_out_msb);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_H0_RH_X2;
+ ret = hts221_read_reg(priv, &addr, &h0_rh_x2);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_H1_RH_X2;
+ ret = hts221_read_reg(priv, &addr, &h1_rh_x2);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_H0T0_OUT_L;
+ ret = hts221_read_reg(priv, &addr, &h0t0_out_lsb);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_H0T0_OUT_H;
+ ret = hts221_read_reg(priv, &addr, &h0t0_out_msb);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_H1T0_OUT_L;
+ ret = hts221_read_reg(priv, &addr, &h1t0_out_lsb);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ addr = HTS221_CALIB_H1T0_OUT_H;
+ ret = hts221_read_reg(priv, &addr, &h1t0_out_msb);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ priv->calib.t0_x8 = t0_degc_x8 | ((t1_t0_msb & 0x3) << 8);
+ priv->calib.t1_x8 = t1_degc_x8 | ((t1_t0_msb & (0x3 << 2)) << (8 - 2));
+ priv->calib.t0_out = (uint16_t) (t0_out_lsb | (t0_out_msb << 8));
+ priv->calib.t1_out = (uint16_t) (t1_out_lsb | (t1_out_msb << 8));
+ priv->calib.h0_x2 = h0_rh_x2;
+ priv->calib.h1_x2 = h1_rh_x2;
+ priv->calib.h0_t0_out = (uint16_t) (h0t0_out_lsb | (h0t0_out_msb << 8));
+ priv->calib.h1_t0_out = (uint16_t) (h1t0_out_lsb | (h1t0_out_msb << 8));
+
+ hts221_dbg("calib.t0_x8: %d\n", priv->calib.t0_x8);
+ hts221_dbg("calib.t1_x8: %d\n", priv->calib.t1_x8);
+ hts221_dbg("calib.t0_out: %d\n", priv->calib.t0_out);
+ hts221_dbg("calib.t1_out: %d\n", priv->calib.t1_out);
+ hts221_dbg("calib.h0_x2: %d\n", priv->calib.h0_x2);
+ hts221_dbg("calib.h1_x2: %d\n", priv->calib.h1_x2);
+ hts221_dbg("calib.h0_t0_out: %d\n", priv->calib.h0_t0_out);
+ hts221_dbg("calib.h1_t0_out: %d\n", priv->calib.h1_t0_out);
+
+ /* As calibration coefficients are unique to each sensor device,
+ * they are a good candidate to be added to entropy pool.
+ */
+
+ up_rngaddentropy(RND_SRC_HW, (uint32_t *)&priv->calib,
+ sizeof(priv->calib) / sizeof(uint32_t));
+
+ return OK;
+}
+
+static int hts221_calculate_temperature(FAR struct hts221_dev_s *priv,
+ FAR int *temperature,
+ FAR hts221_raw_data_t *raw_data)
+{
+ int16_t t_out = (raw_data->temp_high_bits << 8) | raw_data->temp_low_bits;
+ int x0 = priv->calib.t0_out;
+ int x1 = priv->calib.t1_out;
+ int y0 = priv->calib.t0_x8;
+ int y1 = priv->calib.t1_x8;
+ int x = t_out;
+ int64_t y;
+ int x1_x0_diff;
+
+ x1_x0_diff = x1 - x0;
+
+ y = (y0 * x1_x0_diff + (y1 - y0) * (x - x0));
+ y *= HTS221_TEMPERATURE_PRECISION;
+ y /= x1_x0_diff * 8;
+
+ *temperature = (int)y;
+
+ hts221_dbg("Interpolation data temper: %d\n", *temperature);
+
+ return OK;
+}
+
+static int hts221_calculate_humidity(FAR struct hts221_dev_s *priv,
+ FAR unsigned int *humidity,
+ FAR hts221_raw_data_t *raw_data)
+{
+ int16_t h_out = (raw_data->humid_high_bits << 8) | raw_data->humid_low_bits;
+ int x0 = priv->calib.h0_t0_out;
+ int x1 = priv->calib.h1_t0_out;
+ int y0 = priv->calib.h0_x2;
+ int y1 = priv->calib.h1_x2;
+ int x = h_out;
+ int64_t y;
+ int x1_x0_diff;
+
+ x1_x0_diff = x1 - x0;
+
+ y = (y0 * x1_x0_diff + (y1 - y0) * (x - x0));
+ y *= HTS221_HUMIDITY_PRECISION;
+ y /= x1_x0_diff * 2;
+
+ *humidity = (int)y;
+
+ hts221_dbg("Interpolation data humidity: %d\n", *humidity);
+
+ return OK;
+}
+
+static int hts221_read_convert_data(FAR struct hts221_dev_s *priv,
+ FAR hts221_conv_data_t *data)
+{
+ int ret = OK;
+ hts221_raw_data_t raw_data;
+
+ ret = hts221_read_raw_data(priv, &raw_data);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ ret = hts221_calculate_temperature(priv, &data->temperature, &raw_data);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ hts221_dbg("Temperature calculated\n");
+
+ ret = hts221_calculate_humidity(priv, &data->humidity, &raw_data);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ hts221_dbg("Humidity calculated\n");
+ return ret;
+}
+
+#ifdef CONFIG_DEBUG_HTS221
+static int hts221_dump_registers(FAR struct hts221_dev_s *priv)
+{
+ int ret = OK;
+ uint8_t av_addr = HTS221_AV_CONF;
+ uint8_t ctrl_reg1_addr = HTS221_CTRL_REG1;
+ uint8_t ctrl_reg2_addr = HTS221_CTRL_REG2;
+ uint8_t ctrl_reg3_addr = HTS221_CTRL_REG3;
+ uint8_t regval = 0;
+
+ ret = hts221_read_reg(priv, &av_addr, ®val);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ hts221_dbg("AV_CONF_REG: 0x%02X\n", regval);
+
+ ret = hts221_read_reg(priv, &ctrl_reg1_addr, ®val);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ hts221_dbg("CTRL_REG_1: 0x%02X\n", regval);
+
+ ret = hts221_read_reg(priv, &ctrl_reg2_addr, ®val);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ hts221_dbg("CTRL_REG_2: 0x%02X\n", regval);
+
+ ret = hts221_read_reg(priv, &ctrl_reg3_addr, ®val);
+ if (ret < 0)
+ {
+ return ERROR;
+ }
+
+ hts221_dbg("CTRL_REG_3: 0x%02X\n", regval);
+ return ret;
+}
+#endif
+
+static int hts221_open(FAR struct file *filep)
+{
+ FAR struct inode *inode = filep->f_inode;
+ FAR struct hts221_dev_s *priv = inode->i_private;
+
+ while (sem_wait(&priv->devsem) != 0)
+ {
+ assert(errno == EINTR);
+ }
+
+ priv->config->set_power(priv->config, true);
+ priv->config->irq_enable(priv->config, true);
+
+ sem_post(&priv->devsem);
+ hts221_dbg("Sensor is powered on\n");
+ return OK;
+}
+
+static int hts221_close(FAR struct file *filep)
+{
+ FAR struct inode *inode = filep->f_inode;
+ FAR struct hts221_dev_s *priv = inode->i_private;
+ int ret = OK;
+
+ while (sem_wait(&priv->devsem) != 0)
+ {
+ assert(errno == EINTR);
+ }
+
+ priv->config->irq_enable(priv->config, false);
+ ret = hts221_power_on_off(priv, false);
+ priv->config->set_power(priv->config, false);
+
+ sem_post(&priv->devsem);
+ hts221_dbg("CLOSED\n");
+ return ret;
+}
+
+static ssize_t hts221_read(FAR struct file *filep, FAR char *buffer,
+ size_t buflen)
+{
+ FAR struct inode *inode = filep->f_inode;
+ FAR struct hts221_dev_s *priv = inode->i_private;
+ int ret = OK;
+ ssize_t length = 0;
+ hts221_conv_data_t data;
+
+ while (sem_wait(&priv->devsem) != 0)
+ {
+ assert(errno == EINTR);
+ }
+
+ ret = hts221_read_convert_data(priv, &data);
+ if (ret < 0)
+ {
+ hts221_dbg("cannot read data: %d\n", ret);
+ }
+ else
+ {
+ /* This interface is mainly intended for easy debugging in nsh. */
+
+ length = snprintf(buffer, buflen, "%d %u\n",
+ data.temperature, data.humidity);
+ if (length > buflen)
+ {
+ length = buflen;
+ }
+ }
+
+ sem_post(&priv->devsem);
+ return length;
+}
+
+static ssize_t hts221_write(FAR struct file *filep, FAR const char *buffer,
+ size_t buflen)
+{
+ ssize_t length = 0;
+ return length;
+}
+
+static int hts221_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
+{
+ FAR struct inode *inode = filep->f_inode;
+ FAR struct hts221_dev_s *priv = inode->i_private;
+ int32_t ret = 0;
+
+ while (sem_wait(&priv->devsem) != 0)
+ {
+ assert(errno == EINTR);
+ }
+
+ switch (cmd)
+ {
+ case SNIOC_GET_DEV_ID:
+ ret = hts221_get_id(priv, (FAR uint8_t *) arg);
+ break;
+
+ case SNIOC_CFGR:
+ ret = hts221_config(priv, (FAR hts221_settings_t *) arg);
+ break;
+
+ case SNIOC_START_CONVERSION:
+ ret = hts221_start_conversion(priv);
+ break;
+
+ case SNIOC_CHECK_STATUS_REG:
+ ret = hts221_check_status(priv, (FAR hts221_status_t *) arg);
+ break;
+
+ case SNIOC_READ_RAW_DATA:
+ ret = hts221_read_raw_data(priv, (FAR hts221_raw_data_t *) arg);
+ break;
+
+#ifdef CONFIG_DEBUG_HTS221
+ case SNIOC_DUMP_REGS:
+ ret = hts221_dump_registers(priv);
+ break;
+#endif
+
+ case SNIOC_READ_CONVERT_DATA:
+ ret = hts221_read_convert_data(priv, (FAR hts221_conv_data_t *) arg);
+ break;
+
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ sem_post(&priv->devsem);
+ return ret;
+}
+
+#ifndef CONFIG_DISABLE_POLL
+static bool hts221_sample(FAR struct hts221_dev_s *priv)
+{
+ int ret;
+ hts221_status_t status =
+ {
+ .is_humid_ready = false,
+ .is_temp_ready = false
+ };
+
+ ret = hts221_check_status(priv, &status);
+ if (ret < 0)
+ {
+ return false;
+ }
+
+ return status.is_humid_ready || status.is_temp_ready;
+}
+
+static void hts221_notify(FAR struct hts221_dev_s *priv)
+{
+ DEBUGASSERT(priv != NULL);
+
+ int i;
+
+ /* If there are threads waiting on poll() for data to become available,
+ * then wake them up now. NOTE: we wake up all waiting threads because we
+ * do not know that they are going to do. If they all try to read the data,
+ * then some make end up blocking after all.
+ */
+
+ for (i = 0; i < CONFIG_HTS221_NPOLLWAITERS; i++)
+ {
+ FAR struct pollfd *fds = priv->fds[i];
+ if (fds)
+ {
+ fds->revents |= POLLIN;
+ hts221_dbg("Report events: %02x\n", fds->revents);
+ sem_post(fds->sem);
+ }
+ }
+}
+
+static int hts221_poll(FAR struct file *filep, FAR struct pollfd *fds,
+ bool setup)
+{
+ FAR struct inode *inode;
+ FAR struct hts221_dev_s *priv;
+ int ret = OK;
+ int i;
+ uint32_t flags;
+
+ DEBUGASSERT(filep && fds);
+ inode = filep->f_inode;
+
+ DEBUGASSERT(inode && inode->i_private);
+ priv = (FAR struct hts221_dev_s *)inode->i_private;
+
+ while (sem_wait(&priv->devsem) != 0)
+ {
+ assert(errno == EINTR);
+ }
+
+ if (setup)
+ {
+ /* Ignore waits that do not include POLLIN */
+
+ if ((fds->events & POLLIN) == 0)
+ {
+ ret = -EDEADLK;
+ goto out;
+ }
+
+ /* This is a request to set up the poll. Find an available slot for
+ * the poll structure reference.
+ */
+
+ for (i = 0; i < CONFIG_HTS221_NPOLLWAITERS; i++)
+ {
+ /* Find an available slot */
+
+ if (!priv->fds[i])
+ {
+ /* Bind the poll structure and this slot */
+
+ priv->fds[i] = fds;
+ fds->priv = &priv->fds[i];
+ break;
+ }
+ }
+
+ if (i >= CONFIG_HTS221_NPOLLWAITERS)
+ {
+ fds->priv = NULL;
+ ret = -EBUSY;
+ goto out;
+ }
+
+ flags = enter_critical_section();
+ if (priv->int_pending || hts221_sample(priv))
+ {
+ hts221_notify(priv);
+ }
+
+ leave_critical_section(flags);
+ }
+ else if (fds->priv)
+ {
+ /* This is a request to tear down the poll. */
+
+ struct pollfd **slot = (struct pollfd **)fds->priv;
+ DEBUGASSERT(slot != NULL);
+
+ /* Remove all memory of the poll setup */
+
+ *slot = NULL;
+ fds->priv = NULL;
+ }
+
+out:
+ sem_post(&priv->devsem);
+ return ret;
+}
+#endif /* !CONFIG_DISABLE_POLL */
+
+static int hts221_int_handler(int irq, FAR void *context, FAR void *arg)
+{
+ if (!g_humid_data)
+ return OK;
+
+ g_humid_data->int_pending = true;
+ hts221_dbg("Hts221 interrupt\n");
+#ifndef CONFIG_DISABLE_POLL
+ hts221_notify(g_humid_data);
+#endif
+
+ return OK;
+}
+
+int hts221_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
+ uint8_t addr, FAR hts221_config_t *config)
+{
+ int ret = 0;
+ FAR struct hts221_dev_s *priv;
+
+ priv = (struct hts221_dev_s *)kmm_zalloc(sizeof(struct hts221_dev_s));
+
+ if (!priv)
+ {
+ hts221_dbg("Memory cannot be allocated for hts221 sensor");
+ return -ENOMEM;
+ }
+
+ g_humid_data = priv;
+ priv->addr = addr;
+ priv->i2c = i2c;
+ priv->config = config;
+ sem_init(&priv->devsem, 0, 1);
+
+ ret = hts221_load_calibration_data(priv);
+ if (ret < 0)
+ {
+ kmm_free(priv);
+ hts221_dbg("Cannot calibrate hts221 sensor\n");
+ return -EAGAIN;
+ }
+
+ ret = register_driver(devpath, &g_humidityops, 0666, priv);
+
+ hts221_dbg("Registered with %d\n", ret);
+
+ if (ret < 0)
+ {
+ kmm_free(priv);
+ hts221_dbg("Error occurred during the driver registering\n");
+ return ret;
+ }
+
+ if (priv->config->irq_clear)
+ {
+ priv->config->irq_clear(priv->config);
+ }
+
+ priv->config->irq_attach(priv->config, hts221_int_handler);
+ priv->config->irq_enable(priv->config, false);
+ return OK;
+}
diff --git a/drivers/sensors/kxtj9.c b/drivers/sensors/kxtj9.c
index 70ec5ec808b..875a4486b41 100644
--- a/drivers/sensors/kxtj9.c
+++ b/drivers/sensors/kxtj9.c
@@ -51,6 +51,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_I2C) && defined(CONFIG_SENSOR_KXTJ9)
@@ -459,6 +460,12 @@ static int kxtj9_read_sensor_data(FAR struct kxtj9_dev_s *priv,
kxtj9_reg_read(priv, INT_REL, &data, 1);
sem_post(&priv->exclsem);
+
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness((acc_data[0] << 16) ^ (acc_data[1] << 8) ^
+ acc_data[2]);
+
return OK;
}
diff --git a/drivers/sensors/l3gd20.c b/drivers/sensors/l3gd20.c
index d400f213088..10bcbeb77a1 100644
--- a/drivers/sensors/l3gd20.c
+++ b/drivers/sensors/l3gd20.c
@@ -49,6 +49,7 @@
#include
#include
+#include
#include
@@ -257,6 +258,10 @@ static void l3gd20_read_measurement_data(FAR struct l3gd20_dev_s *dev)
/* Give back the semaphore */
sem_post(&dev->datasem);
+
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness((x_gyr << 16) ^ (y_gyr << 8) ^ (z_gyr << 0));
}
/****************************************************************************
diff --git a/drivers/sensors/lis331dl.c b/drivers/sensors/lis331dl.c
index f94a3b2ec2c..deef62d7051 100644
--- a/drivers/sensors/lis331dl.c
+++ b/drivers/sensors/lis331dl.c
@@ -48,6 +48,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_I2C) && defined(CONFIG_LIS331DL)
@@ -414,6 +415,11 @@ lis331dl_getreadings(FAR struct lis331dl_dev_s * dev)
return NULL;
}
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness((retval[2] << 16) ^ (retval[4] << 8) ^
+ (retval[6] << 0));
+
dev->a.x = retval[2];
dev->a.y = retval[4];
dev->a.z = retval[6];
diff --git a/drivers/sensors/lis3dsh.c b/drivers/sensors/lis3dsh.c
index 243f89874dc..80db21c3f47 100644
--- a/drivers/sensors/lis3dsh.c
+++ b/drivers/sensors/lis3dsh.c
@@ -48,6 +48,7 @@
#include
#include
+#include
#include
#include
@@ -245,6 +246,10 @@ static void lis3dsh_read_measurement_data(FAR struct lis3dsh_dev_s *dev)
/* Give back the semaphore */
sem_post(&dev->datasem);
+
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness((x_acc << 16) ^ (y_acc << 8) ^ (z_acc << 0));
}
/****************************************************************************
diff --git a/drivers/sensors/lis3mdl.c b/drivers/sensors/lis3mdl.c
index cdb04e776e7..64f33bae7ae 100644
--- a/drivers/sensors/lis3mdl.c
+++ b/drivers/sensors/lis3mdl.c
@@ -47,6 +47,7 @@
#include
#include
+#include
#include
#include
@@ -251,6 +252,11 @@ static void lis3mdl_read_measurement_data(FAR struct lis3mdl_dev_s *dev)
/* Give back the semaphore */
sem_post(&dev->datasem);
+
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness((x_mag << 16) ^ (y_mag << 10) ^ (z_mag << 2) ^
+ temperature);
}
/****************************************************************************
diff --git a/drivers/sensors/lm75.c b/drivers/sensors/lm75.c
index ce9445558b6..6fa670e4e6a 100644
--- a/drivers/sensors/lm75.c
+++ b/drivers/sensors/lm75.c
@@ -49,6 +49,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_I2C) && defined(CONFIG_I2C_LM75)
@@ -269,6 +270,8 @@ static int lm75_readtemp(FAR struct lm75_dev_s *priv, FAR b16_t *temp)
return ret;
}
+ add_sensor_randomness(temp16);
+
sninfo("Centigrade: %08x\n", temp16);
/* Was fahrenheit requested? */
diff --git a/drivers/sensors/lm92.c b/drivers/sensors/lm92.c
index c801e6633c7..63ea40db38a 100644
--- a/drivers/sensors/lm92.c
+++ b/drivers/sensors/lm92.c
@@ -51,6 +51,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_I2C) && defined(CONFIG_LM92)
@@ -272,6 +273,8 @@ static int lm92_readtemp(FAR struct lm92_dev_s *priv, FAR b16_t *temp)
return ret;
}
+ add_sensor_randomness(temp16);
+
sninfo("Centigrade: %08x\n", temp16);
/* Was Fahrenheit requested? */
diff --git a/drivers/sensors/lsm9ds1.c b/drivers/sensors/lsm9ds1.c
index ae69bd68c7e..d54cdce3797 100644
--- a/drivers/sensors/lsm9ds1.c
+++ b/drivers/sensors/lsm9ds1.c
@@ -50,6 +50,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_I2C) && defined(CONFIG_SN_LSM9DS1)
@@ -1244,6 +1245,7 @@ static ssize_t lsm9ds1_read(FAR struct file *filep, FAR char *buffer,
uint8_t regaddr;
uint8_t lo;
uint8_t hi;
+ uint32_t merge = 0;
/* Sanity check */
@@ -1301,6 +1303,10 @@ static ssize_t lsm9ds1_read(FAR struct file *filep, FAR char *buffer,
data = ((uint16_t)hi << 8) | (uint16_t)lo;
+ /* Collect entropy */
+
+ merge += data ^ (merge >> 16);
+
/* The value is positive */
if (data < 0x8000)
@@ -1329,6 +1335,10 @@ static ssize_t lsm9ds1_read(FAR struct file *filep, FAR char *buffer,
}
}
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness(merge);
+
return nsamples * samplesize;
}
diff --git a/drivers/sensors/max31855.c b/drivers/sensors/max31855.c
index 19800a1c598..97b56f42ec0 100644
--- a/drivers/sensors/max31855.c
+++ b/drivers/sensors/max31855.c
@@ -54,6 +54,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_SPI) && defined(CONFIG_MAX31855)
@@ -220,6 +221,10 @@ static ssize_t max31855_read(FAR struct file *filep, FAR char *buffer, size_t bu
sninfo("Read from MAX31855 = 0x%08X\n", regval);
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness(regval);
+
/* If negative, fix signal bits */
if (regval & 0x80000000)
diff --git a/drivers/sensors/max6675.c b/drivers/sensors/max6675.c
index 0d205a049b8..71a0e2d1420 100644
--- a/drivers/sensors/max6675.c
+++ b/drivers/sensors/max6675.c
@@ -54,6 +54,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_SPI) && defined(CONFIG_MAX6675)
@@ -230,6 +231,10 @@ static ssize_t max6675_read(FAR struct file *filep, FAR char *buffer, size_t buf
ret = -EINVAL;
}
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness(regval);
+
/* Get the temperature */
*temp = (regval & MAX6675_TEMP_COUPLE) >> 3;
diff --git a/drivers/sensors/mb7040.c b/drivers/sensors/mb7040.c
index 2bdaecee0ef..125825cab08 100644
--- a/drivers/sensors/mb7040.c
+++ b/drivers/sensors/mb7040.c
@@ -51,6 +51,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_I2C) && defined(CONFIG_MB7040)
@@ -323,6 +324,10 @@ static int mb7040_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
if (ret == OK)
{
*ptr = (int32_t)range;
+
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness(range);
}
sninfo("range: %04x ret: %d\n", *ptr, ret);
diff --git a/drivers/sensors/mcp9844.c b/drivers/sensors/mcp9844.c
index 77dcee773e8..f895d86152a 100644
--- a/drivers/sensors/mcp9844.c
+++ b/drivers/sensors/mcp9844.c
@@ -50,6 +50,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_I2C) && defined(CONFIG_MCP9844)
@@ -274,6 +275,10 @@ static int mcp9844_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
if (ret == OK)
{
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness(raw_temperature);
+
/* BIT15 - 13 contain information if preset temperature values
* have been exceeded or undercut. BIT12 is now not any longer
* needed since we do have the sign information retrieved.
diff --git a/drivers/sensors/mlx90393.c b/drivers/sensors/mlx90393.c
index 93a53ef871c..d5b27b801e4 100644
--- a/drivers/sensors/mlx90393.c
+++ b/drivers/sensors/mlx90393.c
@@ -50,6 +50,7 @@
#include
#include
+#include
#if defined(CONFIG_SPI) && defined(CONFIG_MLX90393)
@@ -232,6 +233,11 @@ static void mlx90393_read_measurement_data(FAR struct mlx90393_dev_s *dev)
/* Give back the semaphore */
sem_post(&dev->datasem);
+
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness((x_mag << 17) ^ (y_mag << 9) ^ (z_mag << 1) ^
+ temperature);
}
/****************************************************************************
diff --git a/drivers/sensors/mpl115a.c b/drivers/sensors/mpl115a.c
index 38763f5c71d..c23df63eaf1 100644
--- a/drivers/sensors/mpl115a.c
+++ b/drivers/sensors/mpl115a.c
@@ -50,6 +50,7 @@
#include
#include
#include
+#include
#if defined(CONFIG_SPI) && defined(CONFIG_MPL115A)
@@ -227,6 +228,11 @@ static void mpl115a_read_press_temp(FAR struct mpl115a_dev_s *priv)
priv->mpl115a_temperature >>= 6; /* Tadc is 10bit unsigned */
sninfo("Temperature = %d\n", priv->mpl115a_temperature);
+
+ /* Feed sensor data to entropy pool */
+
+ add_sensor_randomness((priv->mpl115a_pressure << 16) ^
+ priv->mpl115a_temperature);
}
/****************************************************************************
diff --git a/drivers/sensors/ms58xx.c b/drivers/sensors/ms58xx.c
index 47f04e57cae..3efdda2713b 100644
--- a/drivers/sensors/ms58xx.c
+++ b/drivers/sensors/ms58xx.c
@@ -53,6 +53,7 @@
#include
#include
#include