You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/11/23 11:52:41 UTC

[incubator-nuttx] branch master updated (98a9762e2a -> 9c6971279d)

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


    from 98a9762e2a rptun: fix rptun don't wait issue when get tx patyload
     new 3351146c0b boards/xtensa/esp32: add initial commit for the ESP32-SPARROW-KIT
     new e0374c30e4 esp32-sparrow-kit: add support for the LTR308 light sensor
     new 9c6971279d esp32-sparrow-kit: enable support for MMCSD-SPI

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 boards/Kconfig                                     |  21 ++
 boards/xtensa/esp32/common/include/esp32_ltr308.h  |  85 +++++
 boards/xtensa/esp32/common/src/Make.defs           |   4 +
 boards/xtensa/esp32/common/src/esp32_ltr308.c      |  86 +++++
 boards/xtensa/esp32/esp32-sparrow-kit/Kconfig      |   8 +
 .../esp32/esp32-sparrow-kit/configs/nsh/defconfig  |  65 ++++
 .../xtensa/esp32/esp32-sparrow-kit/include/board.h | 107 ++++++
 .../esp32-sparrow-kit/include/board_memorymap.h    | 128 +++++++
 .../scripts/.gitignore                             |   0
 .../esp32/esp32-sparrow-kit/scripts/Make.defs      |  92 +++++
 .../xtensa/esp32/esp32-sparrow-kit/src/Make.defs   |  66 ++++
 .../esp32-sparrow-kit/src/esp32-sparrow-kit.h      | 118 ++++++
 .../esp32/esp32-sparrow-kit/src/esp32_appinit.c    |  80 ++++
 .../esp32/esp32-sparrow-kit/src/esp32_autoleds.c   | 185 ++++++++++
 .../esp32/esp32-sparrow-kit/src/esp32_boot.c       | 101 +++++
 .../esp32/esp32-sparrow-kit/src/esp32_bringup.c    | 410 +++++++++++++++++++++
 .../esp32/esp32-sparrow-kit/src/esp32_buttons.c    | 166 +++++++++
 .../esp32/esp32-sparrow-kit/src/esp32_gpio.c       | 391 ++++++++++++++++++++
 .../esp32/esp32-sparrow-kit/src/esp32_mmcsd.c      |  84 +++++
 .../esp32/esp32-sparrow-kit/src/esp32_reset.c      |  63 ++++
 .../esp32/esp32-sparrow-kit/src/esp32_userleds.c   |  94 +++++
 21 files changed, 2354 insertions(+)
 create mode 100644 boards/xtensa/esp32/common/include/esp32_ltr308.h
 create mode 100644 boards/xtensa/esp32/common/src/esp32_ltr308.c
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/Kconfig
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/include/board.h
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/include/board_memorymap.h
 copy boards/xtensa/esp32/{esp32-devkitc => esp32-sparrow-kit}/scripts/.gitignore (100%)
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/scripts/Make.defs
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/Make.defs
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32-sparrow-kit.h
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_appinit.c
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_autoleds.c
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_boot.c
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_bringup.c
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_buttons.c
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_gpio.c
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_mmcsd.c
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_reset.c
 create mode 100644 boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_userleds.c


[incubator-nuttx] 02/03: esp32-sparrow-kit: add support for the LTR308 light sensor

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit e0374c30e43a6f3825763dbc60dcea6b8c674716
Author: Robert-Ionut Alexa <ro...@gmail.com>
AuthorDate: Mon Nov 21 18:52:12 2022 +0200

    esp32-sparrow-kit: add support for the LTR308 light sensor
    
    Add support to esp32-sparrow-kit for the LTR308 sensor. This patch also
    enables the sensor in the default nsh config file.
    
    Signed-off-by: Robert-Ionut Alexa <ro...@gmail.com>
---
 boards/xtensa/esp32/common/include/esp32_ltr308.h  | 85 +++++++++++++++++++++
 boards/xtensa/esp32/common/src/Make.defs           |  4 +
 boards/xtensa/esp32/common/src/esp32_ltr308.c      | 86 ++++++++++++++++++++++
 .../esp32/esp32-sparrow-kit/configs/nsh/defconfig  |  4 +
 .../esp32/esp32-sparrow-kit/src/esp32_bringup.c    | 15 ++++
 5 files changed, 194 insertions(+)

diff --git a/boards/xtensa/esp32/common/include/esp32_ltr308.h b/boards/xtensa/esp32/common/include/esp32_ltr308.h
new file mode 100644
index 0000000000..76b7c67dcc
--- /dev/null
+++ b/boards/xtensa/esp32/common/include/esp32_ltr308.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+ * boards/xtensa/esp32/common/include/esp32_ltr308.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __BOARDS_XTENSA_ESP32_COMMON_INCLUDE_ESP32_LTR308_H
+#define __BOARDS_XTENSA_ESP32_COMMON_INCLUDE_ESP32_LTR308_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Inline Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_ltr308_initialize
+ *
+ * Description:
+ *   Initialize and register the LTR308 Lite-On ambient light sensors driver.
+ *
+ * Input Parameters:
+ *   devno - The device number, used to build the device path as
+ *           /dev/uorb/sensor_lightN
+ *   busno - The I2C bus number
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int board_ltr308_initialize(int devno, int busno);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BOARDS_XTENSA_ESP32_COMMON_INCLUDE_ESP32_LTR308_H */
diff --git a/boards/xtensa/esp32/common/src/Make.defs b/boards/xtensa/esp32/common/src/Make.defs
index 7332908a7d..77ba2b6fde 100644
--- a/boards/xtensa/esp32/common/src/Make.defs
+++ b/boards/xtensa/esp32/common/src/Make.defs
@@ -88,6 +88,10 @@ ifeq ($(CONFIG_SENSORS_MS5611),y)
   CSRCS += esp32_ms5611.c
 endif
 
+ifeq ($(CONFIG_SENSORS_LTR308),y)
+  CSRCS += esp32_ltr308.c
+endif
+
 ifeq ($(CONFIG_LCD_HT16K33),y)
   CSRCS += esp32_ht16k33.c
 endif
diff --git a/boards/xtensa/esp32/common/src/esp32_ltr308.c b/boards/xtensa/esp32/common/src/esp32_ltr308.c
new file mode 100644
index 0000000000..eadbdd8385
--- /dev/null
+++ b/boards/xtensa/esp32/common/src/esp32_ltr308.c
@@ -0,0 +1,86 @@
+/****************************************************************************
+ * boards/xtensa/esp32/common/src/esp32_ltr308.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdio.h>
+#include <debug.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/sensors/ltr308.h>
+#include <nuttx/i2c/i2c_master.h>
+
+#include "esp32_board_i2c.h"
+#include "esp32_i2c.h"
+#include "esp32_ltr308.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_ltr308_initialize
+ *
+ * Description:
+ *   Initialize and register the LTR308 Lite-On ambient light sensor driver.
+ *
+ * Input Parameters:
+ *   devno - The device number, used to build the device path as
+ *           /dev/uorb/sensor_lightN
+ *   busno - The I2C bus number
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno value on failure.
+ *
+ ****************************************************************************/
+
+int board_ltr308_initialize(int devno, int busno)
+{
+  struct i2c_master_s *i2c;
+  int ret;
+
+  sninfo("Initializing LTR308!\n");
+
+  /* Initialize LTR308 */
+
+  i2c = esp32_i2cbus_initialize(busno);
+  if (i2c != NULL)
+    {
+      /* Then try to register the light sensor in one of the two I2C
+       * available controllers.
+       */
+
+      ret = ltr308_register(devno, i2c);
+      if (ret < 0)
+        {
+          snerr("ERROR: Error registering LTR308 in I2C%d\n", busno);
+        }
+    }
+  else
+    {
+      ret = -ENODEV;
+    }
+
+  return ret;
+}
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig b/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig
index 337a63c046..c2c140b764 100644
--- a/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig
@@ -20,6 +20,8 @@ CONFIG_ARCH_STACKDUMP=y
 CONFIG_ARCH_XTENSA=y
 CONFIG_BOARD_LOOPSPERMSEC=16717
 CONFIG_BUILTIN=y
+CONFIG_ESP32_I2C0=y
+CONFIG_ESP32_I2C0_SDAPIN=21
 CONFIG_ESP32_UART0=y
 CONFIG_FS_PROCFS=y
 CONFIG_HAVE_CXX=y
@@ -38,6 +40,8 @@ CONFIG_RAM_SIZE=114688
 CONFIG_RAM_START=0x20000000
 CONFIG_RR_INTERVAL=200
 CONFIG_SCHED_WAITPID=y
+CONFIG_SENSORS=y
+CONFIG_SENSORS_LTR308=y
 CONFIG_START_DAY=6
 CONFIG_START_MONTH=12
 CONFIG_START_YEAR=2011
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_bringup.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_bringup.c
index 77be5e2c5f..edc68e4e74 100644
--- a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_bringup.c
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_bringup.c
@@ -80,6 +80,10 @@
 #  include "esp32_bmp180.h"
 #endif
 
+#ifdef CONFIG_SENSORS_LTR308
+#  include "esp32_ltr308.h"
+#endif
+
 #ifdef CONFIG_INPUT_BUTTONS
 #  include <nuttx/input/buttons.h>
 #endif
@@ -342,6 +346,17 @@ int esp32_bringup(void)
     }
 #endif
 
+#ifdef CONFIG_SENSORS_LTR308
+  /* Try to register LTR308 device in I2C0 */
+
+  ret = board_ltr308_initialize(0, 0);
+
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to initialize LTR308 driver: %d\n", ret);
+    }
+#endif
+
 #ifdef CONFIG_INPUT_BUTTONS
   /* Register the BUTTON driver */
 


[incubator-nuttx] 01/03: boards/xtensa/esp32: add initial commit for the ESP32-SPARROW-KIT

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 3351146c0bf12ac59fc12d957b07116d5504a411
Author: Robert-Ionut Alexa <ro...@gmail.com>
AuthorDate: Mon Nov 21 17:05:17 2022 +0200

    boards/xtensa/esp32: add initial commit for the ESP32-SPARROW-KIT
    
    ESP32-SPARROW-KIT is built upon ESP32-WROVER-KIT by adding various
    peripherals. This is an initial commits that only backports the code
    as it is, without further changes.
    
    Signed-off-by: Robert-Ionut Alexa <ro...@gmail.com>
---
 boards/Kconfig                                     |  21 ++
 boards/xtensa/esp32/esp32-sparrow-kit/Kconfig      |   8 +
 .../esp32/esp32-sparrow-kit/configs/nsh/defconfig  |  45 +++
 .../xtensa/esp32/esp32-sparrow-kit/include/board.h | 107 ++++++
 .../esp32-sparrow-kit/include/board_memorymap.h    | 128 +++++++
 .../esp32/esp32-sparrow-kit/scripts/.gitignore     |   1 +
 .../esp32/esp32-sparrow-kit/scripts/Make.defs      |  92 +++++
 .../xtensa/esp32/esp32-sparrow-kit/src/Make.defs   |  66 ++++
 .../esp32-sparrow-kit/src/esp32-sparrow-kit.h      | 118 ++++++
 .../esp32/esp32-sparrow-kit/src/esp32_appinit.c    |  80 +++++
 .../esp32/esp32-sparrow-kit/src/esp32_autoleds.c   | 185 ++++++++++
 .../esp32/esp32-sparrow-kit/src/esp32_boot.c       | 101 ++++++
 .../esp32/esp32-sparrow-kit/src/esp32_bringup.c    | 395 +++++++++++++++++++++
 .../esp32/esp32-sparrow-kit/src/esp32_buttons.c    | 166 +++++++++
 .../esp32/esp32-sparrow-kit/src/esp32_gpio.c       | 391 ++++++++++++++++++++
 .../esp32/esp32-sparrow-kit/src/esp32_mmcsd.c      |  84 +++++
 .../esp32/esp32-sparrow-kit/src/esp32_reset.c      |  63 ++++
 .../esp32/esp32-sparrow-kit/src/esp32_userleds.c   |  94 +++++
 18 files changed, 2145 insertions(+)

diff --git a/boards/Kconfig b/boards/Kconfig
index a8c7dd9555..02e5a5a92d 100644
--- a/boards/Kconfig
+++ b/boards/Kconfig
@@ -253,6 +253,23 @@ config ARCH_BOARD_ESP32_LYRAT
 		Development Framework (ADF). It is designed for smart speakers and smart-home
 		applications. This port is for board version 4.3.
 
+config ARCH_BOARD_ESP32_SPARROWKIT
+	bool "Espressif ESP-SPARROW-KIT"
+	depends on ARCH_CHIP_ESP32WROVER
+	select ARCH_HAVE_LEDS
+	select ARCH_HAVE_BUTTONS
+	select ARCH_HAVE_IRQBUTTONS if ESP32_GPIO_IRQ
+	---help---
+		ESP32-SPARROW-KIT is a custom-made board based on Espressif's ESP32WROVER chip
+		and built upon the ESP32-WROVERKIT board. It is designed for a university
+		course and its purpose is to allow the user to enable support by default for
+		various peripherals which have been soldered into the board:
+			LTR308 ambient light sensor
+			BME680 sensor
+			MicroSD card slot
+			SSD1306 OLED display
+			I2S microphone
+
 config ARCH_BOARD_ESP32_WROVERKIT
 	bool "Espressif ESP-WROVER-KIT"
 	depends on ARCH_CHIP_ESP32WROVER
@@ -2669,6 +2686,7 @@ config ARCH_BOARD
 	default "ttgo_eink5_v2"            if ARCH_BOARD_TTGO_T5V2_ESP32
 	default "esp32-ethernet-kit"       if ARCH_BOARD_ESP32_ETHERNETKIT
 	default "esp32-lyrat"              if ARCH_BOARD_ESP32_LYRAT
+	default "esp32-sparrow-kit"        if ARCH_BOARD_ESP32_SPARROWKIT
 	default "esp32-wrover-kit"         if ARCH_BOARD_ESP32_WROVERKIT
 	default "esp32c3-devkit"           if ARCH_BOARD_ESP32C3_DEVKIT
 	default "esp32c3-devkit-rust-1"    if ARCH_BOARD_ESP32C3_DEVKIT_RUST1
@@ -3672,6 +3690,9 @@ endif
 if ARCH_BOARD_ESP32_LYRAT
 source "boards/xtensa/esp32/esp32-lyrat/Kconfig"
 endif
+if ARCH_BOARD_ESP32_SPARROWKIT
+source "boards/xtensa/esp32/esp32-sparrow-kit/Kconfig"
+endif
 if ARCH_BOARD_ESP32_WROVERKIT
 source "boards/xtensa/esp32/esp32-wrover-kit/Kconfig"
 endif
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/Kconfig b/boards/xtensa/esp32/esp32-sparrow-kit/Kconfig
new file mode 100644
index 0000000000..4027c14aed
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/Kconfig
@@ -0,0 +1,8 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+if ARCH_BOARD_ESP32_SPARROWKIT
+
+endif # ARCH_BOARD_ESP32_SPARROWKIT
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig b/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig
new file mode 100644
index 0000000000..337a63c046
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig
@@ -0,0 +1,45 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed .config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that includes your
+# modifications.
+#
+# CONFIG_ARCH_LEDS is not set
+# CONFIG_NSH_ARGCAT is not set
+# CONFIG_NSH_CMDOPT_HEXDUMP is not set
+# CONFIG_NSH_CMDPARMS is not set
+CONFIG_ARCH="xtensa"
+CONFIG_ARCH_BOARD="esp32-sparrow-kit"
+CONFIG_ARCH_BOARD_COMMON=y
+CONFIG_ARCH_BOARD_ESP32_SPARROWKIT=y
+CONFIG_ARCH_CHIP="esp32"
+CONFIG_ARCH_CHIP_ESP32=y
+CONFIG_ARCH_CHIP_ESP32WROVER=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARCH_XTENSA=y
+CONFIG_BOARD_LOOPSPERMSEC=16717
+CONFIG_BUILTIN=y
+CONFIG_ESP32_UART0=y
+CONFIG_FS_PROCFS=y
+CONFIG_HAVE_CXX=y
+CONFIG_HAVE_CXXINITIALIZE=y
+CONFIG_IDLETHREAD_STACKSIZE=3072
+CONFIG_INIT_ENTRYPOINT="nsh_main"
+CONFIG_INTELHEX_BINARY=y
+CONFIG_MM_REGIONS=3
+CONFIG_NSH_ARCHINIT=y
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_LINELEN=64
+CONFIG_NSH_READLINE=y
+CONFIG_PREALLOC_TIMERS=4
+CONFIG_RAM_SIZE=114688
+CONFIG_RAM_START=0x20000000
+CONFIG_RR_INTERVAL=200
+CONFIG_SCHED_WAITPID=y
+CONFIG_START_DAY=6
+CONFIG_START_MONTH=12
+CONFIG_START_YEAR=2011
+CONFIG_SYSTEM_NSH=y
+CONFIG_UART0_SERIAL_CONSOLE=y
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/include/board.h b/boards/xtensa/esp32/esp32-sparrow-kit/include/board.h
new file mode 100644
index 0000000000..13f16006b1
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/include/board.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/include/board.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __BOARDS_XTENSA_ESP32_ESP32_SPARROW_KIT_INCLUDE_BOARD_H
+#define __BOARDS_XTENSA_ESP32_ESP32_SPARROW_KIT_INCLUDE_BOARD_H
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Clocking *****************************************************************/
+
+/* The ESP32 Wrover kit board uses a 40MHz crystal oscillator. */
+
+#define BOARD_XTAL_FREQUENCY  40000000
+
+#ifdef CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ
+#  define BOARD_CLOCK_FREQUENCY (CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ * 1000000)
+#else
+#  define BOARD_CLOCK_FREQUENCY 80000000
+#endif
+
+/* GPIO definitions *********************************************************/
+
+/* Display */
+
+#define DISPLAY_SPI       2
+#define DISPLAY_DC        21
+#define DISPLAY_RST       18
+#define DISPLAY_BCKL      5
+
+/* LED definitions **********************************************************/
+
+/* Define how many LEDs this board has (needed by userleds) */
+
+#define BOARD_LED1        0
+#define BOARD_LED2        1
+#define BOARD_LED3        2
+#define BOARD_NLEDS       3
+
+#define BOARD_LED_RED     BOARD_LED1
+#define BOARD_LED_GREEN   BOARD_LED2
+#define BOARD_LED_BLUE    BOARD_LED3
+
+/* LED bits for use with autoleds */
+
+#define BOARD_LED1_BIT    (1 << BOARD_LED1)
+#define BOARD_LED2_BIT    (1 << BOARD_LED2)
+#define BOARD_LED3_BIT    (1 << BOARD_LED3)
+
+/* If CONFIG_ARCH_LEDs is defined, then NuttX will control the 3 LEDs on
+ * board the ESP-SPARROW-KIT.  The following definitions describe how
+ * NuttX controls the LEDs:
+ */
+
+/* These values index an array that contains the bit definitions for the
+ * correct LEDs (see esp32_autoleds.c).
+ */
+
+#define LED_STARTED       0  /* LED2 */
+#define LED_HEAPALLOCATE  1  /* LED3 */
+#define LED_IRQSENABLED   2  /* LED3 + LED2 */
+#define LED_STACKCREATED  3  /* LED3 */
+#define LED_INIRQ         4  /* LED1 + LED3 */
+#define LED_SIGNAL        5  /* LED2 + LED3 */
+#define LED_ASSERTION     6  /* LED1 + LED2 + LED3 */
+#define LED_PANIC         7  /* LED1  + N/C  + N/C */
+
+/* The values below are used only to distinguish between the CPUs.
+ * The LEDs are actually mapped as:
+ *    CPU0 -> GPIO_LED1 (Red LED)
+ *    CPU1 -> GPIO_LED2 (Green LED)
+ * Note that from the previous list only LED_HEAPALLOCATE will still be
+ * valid.  This is to avoid collisions and to keep a way to show a successful
+ * heap allocation.  The LED used is still LED3 (Blue LED).
+ */
+
+#ifdef CONFIG_ARCH_LEDS_CPU_ACTIVITY
+#  define LED_CPU0        8
+#  define LED_CPU1        9
+#  define LED_CPU         (LED_CPU0 + up_cpu_index())
+#endif
+
+/* GPIO pins used by the GPIO Subsystem */
+
+#define BOARD_NGPIOIN     1 /* Amount of GPIO Input pins */
+#define BOARD_NGPIOOUT    1 /* Amount of GPIO Output pins */
+#define BOARD_NGPIOINT    1 /* Amount of GPIO Input w/ Interruption pins */
+
+#endif /* __BOARDS_XTENSA_ESP32_ESP32_SPARROW_KIT_INCLUDE_BOARD_H */
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/include/board_memorymap.h b/boards/xtensa/esp32/esp32-sparrow-kit/include/board_memorymap.h
new file mode 100644
index 0000000000..8b6018704a
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/include/board_memorymap.h
@@ -0,0 +1,128 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/include/board_memorymap.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __BOARDS_XTENSA_ESP32_ESP32_SPARROW_KIT_INCLUDE_BOARD_MEMORYMAP_H
+#define __BOARDS_XTENSA_ESP32_ESP32_SPARROW_KIT_INCLUDE_BOARD_MEMORYMAP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Kernel ROM */
+
+#define KIROM_START     (uintptr_t)__kirom_start
+#define KIROM_SIZE      (uintptr_t)__kirom_size
+#define KDROM_START     (uintptr_t)__kdrom_start
+#define KDROM_SIZE      (uintptr_t)__kdrom_size
+
+/* Kernel RAM */
+
+#define KIRAM_0_START   (uintptr_t)__kiram_0_start
+#define KIRAM_0_SIZE    (uintptr_t)__kiram_0_size
+#define KIRAM_0_END     (uintptr_t)__kiram_0_end
+#define KIRAM_1_START   (uintptr_t)__kiram_1_start
+#define KIRAM_1_SIZE    (uintptr_t)__kiram_1_size
+#define KIRAM_1_END     (uintptr_t)__kiram_1_end
+#define KDRAM_0_START   (uintptr_t)__kdram_0_start
+#define KDRAM_0_SIZE    (uintptr_t)__kdram_0_size
+#define KDRAM_0_END     (uintptr_t)__kdram_0_end
+#define KDRAM_1_START   (uintptr_t)__kdram_1_start
+#define KDRAM_1_SIZE    (uintptr_t)__kdram_1_size
+#define KDRAM_1_END     (uintptr_t)__kdram_1_end
+
+/* Exception vectors */
+
+#define VECTORS_START   (uintptr_t)__vectors_start
+#define VECTORS_END     (uintptr_t)__vectors_end
+
+/* User ROM */
+
+#define UIROM_START     (uintptr_t)__uirom_start
+#define UIROM_SIZE      (uintptr_t)__uirom_size
+#define UIROM_END       (uintptr_t)__uirom_end
+#define UDROM_START     (uintptr_t)__udrom_start
+#define UDROM_SIZE      (uintptr_t)__udrom_size
+#define UDROM_END       (uintptr_t)__udrom_end
+
+/* User RAM */
+
+#define UIRAM_START     (uintptr_t)__uiram_start
+#define UIRAM_SIZE      (uintptr_t)__uiram_size
+#define UIRAM_END       (uintptr_t)__uiram_end
+#define UDRAM_START     (uintptr_t)__udram_start
+#define UDRAM_SIZE      (uintptr_t)__udram_size
+#define UDRAM_END       (uintptr_t)__udram_end
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* Kernel ROM (RX)  */
+
+extern uint8_t          __kirom_start[];
+extern uint8_t          __kirom_size[];
+extern uint8_t          __kdrom_start[];
+extern uint8_t          __kdrom_size[];
+
+/* Kernel RAM (RW) */
+
+extern uint8_t          __kiram_0_start[];
+extern uint8_t          __kiram_0_size[];
+extern uint8_t          __kiram_0_end[];
+extern uint8_t          __kiram_1_start[];
+extern uint8_t          __kiram_1_size[];
+extern uint8_t          __kiram_1_end[];
+extern uint8_t          __kdram_0_start[];
+extern uint8_t          __kdram_0_size[];
+extern uint8_t          __kdram_0_end[];
+extern uint8_t          __kdram_1_start[];
+extern uint8_t          __kdram_1_size[];
+extern uint8_t          __kdram_1_end[];
+
+/* Exception vectors */
+
+extern uint8_t          __vectors_start[];
+extern uint8_t          __vectors_end[];
+
+/* User ROM (RX) */
+
+extern uint8_t          __uirom_start[];
+extern uint8_t          __uirom_size[];
+extern uint8_t          __uirom_end[];
+extern uint8_t          __udrom_start[];
+extern uint8_t          __udrom_size[];
+extern uint8_t          __udrom_end[];
+
+/* User RAM (RW) */
+
+extern uint8_t          __uiram_start[];
+extern uint8_t          __uiram_size[];
+extern uint8_t          __uiram_end[];
+extern uint8_t          __udram_start[];
+extern uint8_t          __udram_size[];
+extern uint8_t          __udram_end[];
+
+#endif /* __BOARDS_XTENSA_ESP32_ESP32_SPARROW_KIT_INCLUDE_BOARD_MEMORYMAP_H */
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/scripts/.gitignore b/boards/xtensa/esp32/esp32-sparrow-kit/scripts/.gitignore
new file mode 100644
index 0000000000..461270524b
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/scripts/.gitignore
@@ -0,0 +1 @@
+/esp32_out.ld
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/scripts/Make.defs b/boards/xtensa/esp32/esp32-sparrow-kit/scripts/Make.defs
new file mode 100644
index 0000000000..0658e7e273
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/scripts/Make.defs
@@ -0,0 +1,92 @@
+############################################################################
+# boards/xtensa/esp32/esp32-sparrow-kit/scripts/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+###########################################################################
+
+include $(TOPDIR)/.config
+include $(TOPDIR)/tools/Config.mk
+include $(TOPDIR)/tools/esp32/Config.mk
+include $(TOPDIR)/arch/xtensa/src/lx6/Toolchain.defs
+
+# This is the generated memory layout linker script.  It will always be
+# generated at the board level.
+
+ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)esp32_out.ld
+
+# Pick the linker scripts from the board level if they exist, if not
+# pick the common linker scripts.
+
+ifneq ($(wildcard $(BOARD_DIR)$(DELIM)scripts$(DELIM)esp32.ld),)
+	ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)esp32.ld
+else
+	ifeq ($(CONFIG_BUILD_PROTECTED),y)
+		ARCHSCRIPT += $(BOARD_COMMON_DIR)$(DELIM)scripts$(DELIM)kernel-space.ld
+	else
+		ifeq ($(CONFIG_ESP32_APP_FORMAT_MCUBOOT),y)
+			ARCHSCRIPT += $(BOARD_COMMON_DIR)$(DELIM)scripts$(DELIM)esp32_mcuboot.ld
+		else
+			ARCHSCRIPT += $(BOARD_COMMON_DIR)$(DELIM)scripts$(DELIM)esp32.ld
+		endif
+	endif
+endif
+
+ifneq ($(wildcard $(BOARD_DIR)$(DELIM)scripts$(DELIM)esp32_rom.ld),)
+	ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)esp32_rom.ld
+else
+	ARCHSCRIPT += $(BOARD_COMMON_DIR)$(DELIM)scripts$(DELIM)esp32_rom.ld
+endif
+
+ifneq ($(wildcard $(BOARD_DIR)$(DELIM)scripts$(DELIM)esp32.template.ld),)
+	LDSCRIPT_TEMPLATE = $(BOARD_DIR)$(DELIM)scripts$(DELIM)esp32.template.ld
+else
+	ifeq ($(CONFIG_BUILD_PROTECTED),y)
+		LDSCRIPT_TEMPLATE = $(BOARD_COMMON_DIR)$(DELIM)scripts$(DELIM)protected.template.ld
+	else
+		LDSCRIPT_TEMPLATE = $(BOARD_COMMON_DIR)$(DELIM)scripts$(DELIM)flat.template.ld
+	endif
+endif
+
+ARCHPICFLAGS = -fpic
+
+# if SPIRAM/PSRAM is used then we need to include a workaround
+
+ifeq ($(CONFIG_ESP32_SPIRAM),y)
+  ARCHCFLAGS += -mfix-esp32-psram-cache-issue
+endif
+
+CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
+CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
+CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
+CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS)
+CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS)
+AFLAGS := $(CFLAGS) -D__ASSEMBLY__
+
+# Loadable module definitions
+
+CMODULEFLAGS = $(CFLAGS) -mtext-section-literals
+
+LDMODULEFLAGS = -r -e module_initialize
+LDMODULEFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
+
+# ELF module definitions
+
+CELFFLAGS = $(CFLAGS) -mtext-section-literals
+CXXELFFLAGS = $(CXXFLAGS) -mtext-section-literals
+
+LDELFFLAGS = -r -e main
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/Make.defs b/boards/xtensa/esp32/esp32-sparrow-kit/src/Make.defs
new file mode 100644
index 0000000000..bb0a5de2b7
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/Make.defs
@@ -0,0 +1,66 @@
+#############################################################################
+# boards/xtensa/esp32/esp32-sparrow-kit/src/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+#############################################################################
+
+include $(TOPDIR)/Make.defs
+
+CONFIGFILE = $(TOPDIR)$(DELIM)include$(DELIM)nuttx$(DELIM)config.h
+
+CSRCS = esp32_boot.c esp32_bringup.c
+
+ifeq ($(CONFIG_ARCH_LEDS),y)
+CSRCS += esp32_autoleds.c
+else
+CSRCS += esp32_userleds.c
+endif
+
+ifeq ($(CONFIG_BOARDCTL),y)
+CSRCS += esp32_appinit.c
+ifeq ($(CONFIG_BOARDCTL_RESET),y)
+CSRCS += esp32_reset.c
+endif
+endif
+
+ifeq ($(CONFIG_MMCSD),y)
+CSRCS += esp32_mmcsd.c
+endif
+
+ifeq ($(CONFIG_DEV_GPIO),y)
+CSRCS += esp32_gpio.c
+endif
+
+ifeq ($(CONFIG_ARCH_BUTTONS),y)
+CSRCS += esp32_buttons.c
+endif
+
+SCRIPTOUT = $(BOARD_DIR)$(DELIM)scripts$(DELIM)esp32_out.ld
+
+.PHONY = context distclean
+
+$(SCRIPTOUT): $(LDSCRIPT_TEMPLATE) $(CONFIGFILE)
+	$(Q) $(CC) -isystem $(TOPDIR)/include -C -P -x c -E $(LDSCRIPT_TEMPLATE) -o $@
+
+context:: $(SCRIPTOUT)
+
+distclean::
+	$(call DELFILE, $(SCRIPTOUT))
+
+DEPPATH += --dep-path board
+VPATH += :board
+CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board)
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32-sparrow-kit.h b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32-sparrow-kit.h
new file mode 100644
index 0000000000..787ccf9939
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32-sparrow-kit.h
@@ -0,0 +1,118 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32-sparrow-kit.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __BOARDS_XTENSA_ESP32_ESP32_SPARROWKIT_SRC_ESP32_SPARROWKIT_H
+#define __BOARDS_XTENSA_ESP32_ESP32_SPARROWKIT_SRC_ESP32_SPARROWKIT_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/compiler.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* ESP-SPARROW-KIT GPIOs ****************************************************/
+
+/* LEDs */
+
+#define GPIO_LED1  0
+#define GPIO_LED2  2
+#define GPIO_LED3  4
+
+/* BOOT Button */
+
+#define BUTTON_BOOT  0
+
+/* TIMERS */
+
+#define TIMER0 0
+#define TIMER1 1
+#define TIMER2 2
+#define TIMER3 3
+
+/* ONESHOT */
+
+#define ONESHOT_TIMER         1
+#define ONESHOT_RESOLUTION_US 1
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32_bringup
+ *
+ * Description:
+ *   Perform architecture-specific initialization
+ *
+ *   CONFIG_BOARD_LATE_INITIALIZE=y :
+ *     Called from board_late_initialize().
+ *
+ *   CONFIG_BOARD_LATE_INITIALIZE=y && CONFIG_BOARDCTL=y :
+ *     Called from the NSH library via board_app_initialize()
+ *
+ ****************************************************************************/
+
+int esp32_bringup(void);
+
+/****************************************************************************
+ * Name: esp32_mmcsd_initialize
+ *
+ * Description:
+ *   Initialize SPI-based SD card and card detect thread.
+ *
+ ****************************************************************************/
+
+int esp32_mmcsd_initialize(int minor);
+
+/****************************************************************************
+ * Name: esp32_spiflash_init
+ *
+ * Description:
+ *   Initialize the SPIFLASH and register the MTD device.
+ ****************************************************************************/
+
+int esp32_spiflash_init(void);
+
+/****************************************************************************
+ * Name: esp32_gpio_init
+ ****************************************************************************/
+
+#ifdef CONFIG_DEV_GPIO
+int esp32_gpio_init(void);
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_XTENSA_ESP32_ESP32_SPARROWKIT_SRC_ESP32_SPARROWKIT_H */
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_appinit.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_appinit.c
new file mode 100644
index 0000000000..cc5ff31e2f
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_appinit.c
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_appinit.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <nuttx/board.h>
+
+#include "esp32-sparrow-kit.h"
+
+#ifdef CONFIG_BOARDCTL
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_app_initialize
+ *
+ * Description:
+ *   Perform application specific initialization.  This function is never
+ *   called directly from application code, but only indirectly via the
+ *   (non-standard) boardctl() interface using the command BOARDIOC_INIT.
+ *
+ * Input Parameters:
+ *   arg - The boardctl() argument is passed to the board_app_initialize()
+ *         implementation without modification.  The argument has no
+ *         meaning to NuttX; the meaning of the argument is a contract
+ *         between the board-specific initialization logic and the
+ *         matching application logic.  The value could be such things as a
+ *         mode enumeration value, a set of DIP switch settings, a
+ *         pointer to configuration data read from a file or serial FLASH,
+ *         or whatever you would like to do with it.  Every implementation
+ *         should accept zero/NULL as a default configuration.
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure to indicate the nature of the failure.
+ *
+ ****************************************************************************/
+
+int board_app_initialize(uintptr_t arg)
+{
+#ifdef CONFIG_BOARD_LATE_INITIALIZE
+  /* Board initialization already performed by board_late_initialize() */
+
+  return OK;
+#else
+  /* Perform board-specific initialization */
+
+  return esp32_bringup();
+#endif
+}
+
+#endif /* CONFIG_BOARDCTL */
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_autoleds.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_autoleds.c
new file mode 100644
index 0000000000..74229dcada
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_autoleds.c
@@ -0,0 +1,185 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_autoleds.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <debug.h>
+
+#include <nuttx/board.h>
+#include <arch/board/board.h>
+
+#include "esp32_gpio.h"
+#include "esp32-sparrow-kit.h"
+
+#ifdef CONFIG_ARCH_LEDS
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* The following definitions map the encoded LED setting to GPIO settings */
+
+#ifndef CONFIG_ARCH_LEDS_CPU_ACTIVITY
+#  define LED_STARTED_BITS         (BOARD_LED2_BIT)
+#  define LED_HEAPALLOCATE_BITS    (BOARD_LED3_BIT)
+#  define LED_IRQSENABLED_BITS     (BOARD_LED3_BIT | BOARD_LED2_BIT)
+#  define LED_STACKCREATED_BITS    (BOARD_LED3_BIT)
+#  define LED_INIRQ_BITS           (BOARD_LED1_BIT | BOARD_LED3_BIT)
+#  define LED_SIGNAL_BITS          (BOARD_LED2_BIT | BOARD_LED3_BIT)
+#  define LED_ASSERTION_BITS       (BOARD_LED1_BIT | BOARD_LED2_BIT |\
+                                    BOARD_LED3_BIT)
+#  define LED_PANIC_BITS           (BOARD_LED1_BIT)
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+#ifndef CONFIG_ARCH_LEDS_CPU_ACTIVITY
+static const unsigned int g_ledbits[8] =
+{
+  LED_STARTED_BITS,
+  LED_HEAPALLOCATE_BITS,
+  LED_IRQSENABLED_BITS,
+  LED_STACKCREATED_BITS,
+  LED_INIRQ_BITS,
+  LED_SIGNAL_BITS,
+  LED_ASSERTION_BITS,
+  LED_PANIC_BITS
+};
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static inline void led_clrbits(unsigned int clrbits)
+{
+  if ((clrbits & BOARD_LED1_BIT) != 0)
+    {
+      esp32_gpiowrite(GPIO_LED1, false);
+    }
+
+  if ((clrbits & BOARD_LED2_BIT) != 0)
+    {
+      esp32_gpiowrite(GPIO_LED2, false);
+    }
+
+  if ((clrbits & BOARD_LED3_BIT) != 0)
+    {
+      esp32_gpiowrite(GPIO_LED3, false);
+    }
+}
+
+static inline void led_setbits(unsigned int setbits)
+{
+  if ((setbits & BOARD_LED1_BIT) != 0)
+    {
+      esp32_gpiowrite(GPIO_LED1, true);
+    }
+
+  if ((setbits & BOARD_LED2_BIT) != 0)
+    {
+      esp32_gpiowrite(GPIO_LED2, true);
+    }
+
+  if ((setbits & BOARD_LED3_BIT) != 0)
+    {
+      esp32_gpiowrite(GPIO_LED3, true);
+    }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_autoled_initialize
+ ****************************************************************************/
+
+void board_autoled_initialize(void)
+{
+  /* Configure LED1-4 GPIOs for output */
+
+  esp32_configgpio(GPIO_LED1, OUTPUT);
+  esp32_configgpio(GPIO_LED2, OUTPUT);
+  esp32_configgpio(GPIO_LED3, OUTPUT);
+}
+
+/****************************************************************************
+ * Name: board_autoled_on
+ ****************************************************************************/
+
+void board_autoled_on(int led)
+{
+#ifdef CONFIG_ARCH_LEDS_CPU_ACTIVITY
+  switch (led)
+    {
+      case LED_CPU0:
+        esp32_gpiowrite(GPIO_LED1, true);
+        break;
+      case LED_CPU1:
+        esp32_gpiowrite(GPIO_LED2, true);
+        break;
+      case LED_HEAPALLOCATE:
+        esp32_gpiowrite(GPIO_LED3, true);
+        break;
+      default:
+        break;
+    }
+#else
+  led_clrbits(BOARD_LED1_BIT | BOARD_LED2_BIT | BOARD_LED3_BIT);
+  led_setbits(g_ledbits[led]);
+#endif
+}
+
+/****************************************************************************
+ * Name: board_autoled_off
+ ****************************************************************************/
+
+void board_autoled_off(int led)
+{
+#ifdef CONFIG_ARCH_LEDS_CPU_ACTIVITY
+  switch (led)
+    {
+      case LED_CPU0:
+        esp32_gpiowrite(GPIO_LED1, false);
+        break;
+      case LED_CPU1:
+        esp32_gpiowrite(GPIO_LED2, false);
+        break;
+      case LED_HEAPALLOCATE:
+        esp32_gpiowrite(GPIO_LED3, false);
+        break;
+      default:
+        break;
+    }
+#else
+  led_clrbits(g_ledbits[led]);
+#endif
+}
+
+#endif /* CONFIG_ARCH_LEDS */
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_boot.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_boot.c
new file mode 100644
index 0000000000..e7ce03815f
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_boot.c
@@ -0,0 +1,101 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_boot.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <debug.h>
+
+#include <nuttx/board.h>
+#include <nuttx/mm/mm.h>
+#include <arch/board/board.h>
+#include <arch/esp32/memory_layout.h>
+
+#include "esp32-sparrow-kit.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32_board_initialize
+ *
+ * Description:
+ *   All ESP32 architectures must provide the following entry point.
+ *   This entry point is called early in the initialization -- after all
+ *   memory has been configured and mapped but before any devices have been
+ *   initialized.
+ *
+ ****************************************************************************/
+
+void esp32_board_initialize(void)
+{
+  /* Configure on-board LEDs if LED support has been selected. */
+
+#ifdef CONFIG_ARCH_LEDS
+  board_autoled_initialize();
+#endif
+}
+
+/****************************************************************************
+ * Name: board_late_initialize
+ *
+ * Description:
+ *   If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional
+ *   initialization call will be performed in the boot-up sequence to a
+ *   function called board_late_initialize().  board_late_initialize() will
+ *   be called immediately after up_initialize() is called and just before
+ *   the initial application is started.  This additional initialization
+ *   phase may be used, for example, to initialize board-specific device
+ *   drivers.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_BOARD_LATE_INITIALIZE
+void board_late_initialize(void)
+{
+  /* Perform board-specific initialization */
+
+  esp32_bringup();
+
+#ifdef CONFIG_SMP
+  /* To avoid corrupting the heap, this region of memory (~3KB) is not
+   * included until the APP CPU has started.
+   * So we can't add it with the rest of the regions at xtensa_add_region(),
+   * that function is called early from up_initialize().  We wait until the
+   * SMP bringup is complete.
+   */
+
+  umm_addregion((void *)HEAP_REGION_ROMAPP_START,
+                (size_t)(HEAP_REGION_ROMAPP_END - HEAP_REGION_ROMAPP_START));
+#endif
+}
+#endif
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_bringup.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_bringup.c
new file mode 100644
index 0000000000..77be5e2c5f
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_bringup.c
@@ -0,0 +1,395 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_bringup.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <syslog.h>
+#include <debug.h>
+#include <stdio.h>
+
+#include <syslog.h>
+#include <errno.h>
+#include <nuttx/fs/fs.h>
+#include <nuttx/himem/himem.h>
+
+#include "esp32_partition.h"
+
+#include <arch/board/board.h>
+
+#ifdef CONFIG_USERLED
+#  include <nuttx/leds/userled.h>
+#endif
+
+#ifdef CONFIG_TIMER
+#include <esp32_tim_lowerhalf.h>
+#endif
+
+#ifdef CONFIG_ONESHOT
+#  include "esp32_board_oneshot.h"
+#endif
+
+#ifdef CONFIG_WATCHDOG
+#  include "esp32_board_wdt.h"
+#endif
+
+#ifdef CONFIG_ESP32_SPIFLASH
+#  include "esp32_board_spiflash.h"
+#endif
+
+#ifdef CONFIG_ESP32_BLE
+#  include "esp32_ble.h"
+#endif
+
+#ifdef CONFIG_ESP32_WIFI
+#  include "esp32_board_wlan.h"
+#endif
+
+#ifdef CONFIG_ESP32_I2C
+#  include "esp32_board_i2c.h"
+#endif
+
+#ifdef CONFIG_SENSORS_BMP180
+#  include "esp32_bmp180.h"
+#endif
+
+#ifdef CONFIG_INPUT_BUTTONS
+#  include <nuttx/input/buttons.h>
+#endif
+
+#ifdef CONFIG_VIDEO_FB
+#  include <nuttx/video/fb.h>
+#endif
+
+#ifdef CONFIG_ESP32_RT_TIMER
+#  include "esp32_rt_timer.h"
+#endif
+
+#ifdef CONFIG_LCD_DEV
+#  include <nuttx/board.h>
+#  include <nuttx/lcd/lcd_dev.h>
+#endif
+
+#ifdef CONFIG_RTC_DRIVER
+#  include "esp32_rtc_lowerhalf.h"
+#endif
+
+#ifdef CONFIG_LCD_BACKPACK
+#  include "esp32_lcd_backpack.h"
+#endif
+
+#include "esp32-sparrow-kit.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32_bringup
+ *
+ * Description:
+ *   Perform architecture-specific initialization
+ *
+ *   CONFIG_BOARD_LATE_INITIALIZE=y :
+ *     Called from board_late_initialize().
+ *
+ *   CONFIG_BOARD_LATE_INITIALIZE=n && CONFIG_BOARDCTL=y :
+ *     Called from the NSH library
+ *
+ ****************************************************************************/
+
+int esp32_bringup(void)
+{
+  int ret;
+
+#if defined(CONFIG_ESP32_SPIRAM) && \
+    defined(CONFIG_ESP32_SPIRAM_BANKSWITCH_ENABLE)
+  ret = esp_himem_init();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: Failed to init HIMEM: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_FS_PROCFS
+  /* Mount the procfs file system */
+
+  ret = nx_mount(NULL, "/proc", "procfs", 0, NULL);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: Failed to mount procfs at /proc: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_FS_TMPFS
+  /* Mount the tmpfs file system */
+
+  ret = nx_mount(NULL, CONFIG_LIBC_TMPDIR, "tmpfs", 0, NULL);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: Failed to mount tmpfs at %s: %d\n",
+             CONFIG_LIBC_TMPDIR, ret);
+    }
+#endif
+
+#ifdef CONFIG_LCD_BACKPACK
+  /* slcd:0, i2c:0, rows=2, cols=16 */
+
+  ret = board_lcd_backpack_init(0, 0, 2, 16);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to initialize PCF8574 LCD, error %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_MMCSD
+  ret = esp32_mmcsd_initialize(0);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to initialize SD slot: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_ESP32_SPIFLASH
+  ret = esp32_spiflash_init();
+  if (ret)
+    {
+      syslog(LOG_ERR, "ERROR: Failed to initialize SPI Flash\n");
+    }
+#endif
+
+#ifdef CONFIG_ESP32_PARTITION_TABLE
+  ret = esp32_partition_init();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: Failed to initialize partition error=%d\n",
+             ret);
+    }
+#endif
+
+#ifdef CONFIG_ESP32_RT_TIMER
+  ret = esp32_rt_timer_init();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to initialize RT timer: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_ESP32_BLE
+  ret = esp32_ble_initialize();
+  if (ret)
+    {
+      syslog(LOG_ERR, "ERROR: Failed to initialize BLE: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_ESP32_WIFI
+  ret = board_wlan_init();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: Failed to initialize wireless subsystem=%d\n",
+             ret);
+    }
+#endif
+
+/* First, register the timer drivers and let timer 1 for oneshot
+ * if it is enabled.
+ */
+
+#ifdef CONFIG_TIMER
+
+#if defined(CONFIG_ESP32_TIMER0) && !defined(CONFIG_ESP32_RT_TIMER)
+  ret = esp32_timer_initialize("/dev/timer0", TIMER0);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR,
+             "ERROR: Failed to initialize timer driver: %d\n",
+             ret);
+    }
+#endif
+
+#if defined(CONFIG_ESP32_TIMER1) && !defined(CONFIG_ONESHOT)
+  ret = esp32_timer_initialize("/dev/timer1", TIMER1);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR,
+             "ERROR: Failed to initialize timer driver: %d\n",
+             ret);
+    }
+#endif
+
+#ifdef CONFIG_ESP32_TIMER2
+  ret = esp32_timer_initialize("/dev/timer2", TIMER2);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR,
+             "ERROR: Failed to initialize timer driver: %d\n",
+             ret);
+    }
+#endif
+
+#ifdef CONFIG_ESP32_TIMER3
+  ret = esp32_timer_initialize("/dev/timer3", TIMER3);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR,
+             "ERROR: Failed to initialize timer driver: %d\n",
+             ret);
+    }
+#endif
+
+#endif /* CONFIG_TIMER */
+
+  /* Now register one oneshot driver */
+
+#if defined(CONFIG_ONESHOT) && defined(CONFIG_ESP32_TIMER1)
+
+  ret = esp32_oneshot_init(ONESHOT_TIMER, ONESHOT_RESOLUTION_US);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: esp32_oneshot_init() failed: %d\n", ret);
+    }
+
+#endif /* CONFIG_ONESHOT */
+
+#ifdef CONFIG_USERLED
+  /* Register the LED driver */
+
+  ret = userled_lower_initialize("/dev/userleds");
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_WATCHDOG
+  /* Configure watchdog timer */
+
+  ret = board_wdt_init();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR,
+             "ERROR: Failed to initialize watchdog drivers: %d\n",
+             ret);
+    }
+#endif
+
+#ifdef CONFIG_DEV_GPIO
+  ret = esp32_gpio_init();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_I2C_DRIVER
+
+#ifdef CONFIG_ESP32_I2C0
+  ret = esp32_i2c_register(0);
+
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to initialize I2C Driver for I2C0: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_ESP32_I2C1
+  ret = esp32_i2c_register(1);
+
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to initialize I2C Driver for I2C1: %d\n", ret);
+    }
+#endif
+
+#endif
+
+#ifdef CONFIG_SENSORS_BMP180
+  /* Try to register BMP180 device in I2C0 */
+
+  ret = board_bmp180_initialize(0, 0);
+
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "Failed to initialize BMP180 driver: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_INPUT_BUTTONS
+  /* Register the BUTTON driver */
+
+  ret = btn_lower_initialize("/dev/buttons");
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: btn_lower_initialize() failed: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_VIDEO_FB
+  ret = fb_register(0, 0);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: Failed to initialize Frame Buffer Driver.\n");
+    }
+#endif
+
+#ifdef CONFIG_LCD_DEV
+  ret = board_lcd_initialize();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: board_lcd_initialize() failed: %d\n", ret);
+    }
+
+  ret = lcddev_register(0);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: lcddev_register() failed: %d\n", ret);
+    }
+#endif
+
+#ifdef CONFIG_RTC_DRIVER
+  /* Instantiate the ESP32 RTC driver */
+
+  ret = esp32_rtc_driverinit();
+  if (ret < 0)
+    {
+      syslog(LOG_ERR,
+             "ERROR: Failed to Instantiate the RTC driver: %d\n", ret);
+    }
+#endif
+
+  /* If we got here then perhaps not all initialization was successful, but
+   * at least enough succeeded to bring-up NSH with perhaps reduced
+   * capabilities.
+   */
+
+  UNUSED(ret);
+  return OK;
+}
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_buttons.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_buttons.c
new file mode 100644
index 0000000000..66096be619
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_buttons.c
@@ -0,0 +1,166 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_buttons.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <assert.h>
+#include <debug.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/board.h>
+#include <nuttx/irq.h>
+#include <arch/irq.h>
+
+#include "esp32_gpio.h"
+
+#include "esp32-sparrow-kit.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_button_initialize
+ *
+ * Description:
+ *   board_button_initialize() must be called to initialize button resources.
+ *   After that, board_buttons() may be called to collect the current state
+ *   of all buttons or board_button_irq() may be called to register button
+ *   interrupt handlers.
+ *
+ ****************************************************************************/
+
+uint32_t board_button_initialize(void)
+{
+  esp32_configgpio(BUTTON_BOOT, INPUT_FUNCTION_3 | PULLUP);
+  return 1;
+}
+
+/****************************************************************************
+ * Name: board_buttons
+ *
+ * Description:
+ *   After board_button_initialize() has been called, board_buttons() may be
+ *   called to collect the state of all buttons.  board_buttons() returns an
+ *   8-bit bit set with each bit associated with a button.  See the
+ *   BUTTON_*_BIT  definitions in board.h for the meaning of each bit.
+ *
+ ****************************************************************************/
+
+uint32_t board_buttons(void)
+{
+  uint8_t ret = 0;
+  int i = 0;
+  int n = 0;
+
+  bool b0 = esp32_gpioread(BUTTON_BOOT);
+
+  for (i = 0; i < 10; i++)
+    {
+      up_mdelay(1); /* TODO */
+
+      bool b1 = esp32_gpioread(BUTTON_BOOT);
+
+      if (b0 == b1)
+        {
+          n++;
+        }
+      else
+        {
+          n = 0;
+        }
+
+      if (3 == n)
+        {
+          break;
+        }
+
+      b0 = b1;
+    }
+
+  iinfo("b=%d n=%d\n", b0, n);
+
+  /* Low value means that the button is pressed */
+
+  if (!b0)
+    {
+      ret = 0x1;
+    }
+
+  return ret;
+}
+
+/****************************************************************************
+ * Name: board_button_irq
+ *
+ * Description:
+ *   board_button_irq() may be called to register an interrupt handler that
+ *   will be called when a button is depressed or released.  The ID value is
+ *   a button enumeration value that uniquely identifies a button resource.
+ *   See the BUTTON_* definitions in board.h for the meaning of enumeration
+ *   value.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ARCH_IRQBUTTONS
+int board_button_irq(int id, xcpt_t irqhandler, void *arg)
+{
+  int ret;
+  DEBUGASSERT(id == BUTTON_BOOT);
+
+  int irq = ESP32_PIN2IRQ(BUTTON_BOOT);
+
+  if (NULL != irqhandler)
+    {
+      /* Make sure the interrupt is disabled */
+
+      esp32_gpioirqdisable(irq);
+
+      ret = irq_attach(irq, irqhandler, arg);
+      if (ret < 0)
+        {
+          syslog(LOG_ERR, "ERROR: irq_attach() failed: %d\n", ret);
+          return ret;
+        }
+
+      gpioinfo("Attach %p\n", irqhandler);
+
+      gpioinfo("Enabling the interrupt\n");
+
+      /* Configure the interrupt for rising and falling edges */
+
+      esp32_gpioirqenable(irq, CHANGE);
+    }
+  else
+    {
+      gpioinfo("Disable the interrupt\n");
+      esp32_gpioirqdisable(irq);
+    }
+
+  return OK;
+}
+#endif
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_gpio.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_gpio.c
new file mode 100644
index 0000000000..a2c455ac7e
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_gpio.c
@@ -0,0 +1,391 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_gpio.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <nuttx/irq.h>
+#include <arch/irq.h>
+#include <assert.h>
+#include <debug.h>
+
+#include <nuttx/ioexpander/gpio.h>
+
+#include <arch/board/board.h>
+
+#include "esp32-sparrow-kit.h"
+#include "esp32_gpio.h"
+#include "hardware/esp32_gpio_sigmap.h"
+
+#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF)
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if !defined(CONFIG_ESP32_GPIO_IRQ) && BOARD_NGPIOINT > 0
+#  error "NGPIOINT is > 0 and GPIO interrupts aren't enabled"
+#endif
+
+/* Output pins. GPIO16 is used as an example, any other outputs could be
+ * used.
+ */
+
+#define GPIO_OUT1    16
+
+/* Input pins. GPIO17 is used as an example, any other inputs could be
+ * used.
+ */
+
+#define GPIO_IN1     17
+
+/* Interrupt pins.  GPIO22 is used as an example, any other inputs could be
+ * used.
+ */
+
+#define GPIO_IRQPIN1  22
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct esp32gpio_dev_s
+{
+  struct gpio_dev_s gpio;
+  uint8_t id;
+};
+
+struct esp32gpint_dev_s
+{
+  struct esp32gpio_dev_s esp32gpio;
+  pin_interrupt_t callback;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+#if BOARD_NGPIOOUT > 0
+static int gpout_read(struct gpio_dev_s *dev, bool *value);
+static int gpout_write(struct gpio_dev_s *dev, bool value);
+#endif
+
+#if BOARD_NGPIOIN > 0
+static int gpin_read(struct gpio_dev_s *dev, bool *value);
+#endif
+
+#if BOARD_NGPIOINT > 0
+static int gpint_read(struct gpio_dev_s *dev, bool *value);
+static int gpint_attach(struct gpio_dev_s *dev,
+                        pin_interrupt_t callback);
+static int gpint_enable(struct gpio_dev_s *dev, bool enable);
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+#if BOARD_NGPIOOUT > 0
+static const struct gpio_operations_s gpout_ops =
+{
+  .go_read   = gpout_read,
+  .go_write  = gpout_write,
+  .go_attach = NULL,
+  .go_enable = NULL,
+};
+
+/* This array maps the GPIO pins used as OUTPUT */
+
+static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] =
+{
+  GPIO_OUT1
+};
+
+static struct esp32gpio_dev_s g_gpout[BOARD_NGPIOOUT];
+#endif
+
+#if BOARD_NGPIOIN > 0
+static const struct gpio_operations_s gpin_ops =
+{
+  .go_read   = gpin_read,
+  .go_write  = NULL,
+  .go_attach = NULL,
+  .go_enable = NULL,
+};
+
+/* This array maps the GPIO pins used as INTERRUPT INPUTS */
+
+static const uint32_t g_gpioinputs[BOARD_NGPIOIN] =
+{
+  GPIO_IN1
+};
+
+static struct esp32gpio_dev_s g_gpin[BOARD_NGPIOIN];
+#endif
+
+#if BOARD_NGPIOINT > 0
+static const struct gpio_operations_s gpint_ops =
+{
+  .go_read   = gpint_read,
+  .go_write  = NULL,
+  .go_attach = gpint_attach,
+  .go_enable = gpint_enable,
+};
+
+/* This array maps the GPIO pins used as INTERRUPT INPUTS */
+
+static const uint32_t g_gpiointinputs[BOARD_NGPIOINT] =
+{
+  GPIO_IRQPIN1,
+};
+
+static struct esp32gpint_dev_s g_gpint[BOARD_NGPIOINT];
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: gpout_read
+ ****************************************************************************/
+
+#if BOARD_NGPIOOUT > 0
+static int gpout_read(struct gpio_dev_s *dev, bool *value)
+{
+  struct esp32gpio_dev_s *esp32gpio = (struct esp32gpio_dev_s *)dev;
+
+  DEBUGASSERT(esp32gpio != NULL && value != NULL);
+  DEBUGASSERT(esp32gpio->id < BOARD_NGPIOOUT);
+  gpioinfo("Reading...\n");
+
+  *value = esp32_gpioread(g_gpiooutputs[esp32gpio->id]);
+  return OK;
+}
+
+/****************************************************************************
+ * Name: gpout_write
+ ****************************************************************************/
+
+static int gpout_write(struct gpio_dev_s *dev, bool value)
+{
+  struct esp32gpio_dev_s *esp32gpio = (struct esp32gpio_dev_s *)dev;
+
+  DEBUGASSERT(esp32gpio != NULL);
+  DEBUGASSERT(esp32gpio->id < BOARD_NGPIOOUT);
+  gpioinfo("Writing %d\n", (int)value);
+
+  esp32_gpiowrite(g_gpiooutputs[esp32gpio->id], value);
+  return OK;
+}
+#endif
+
+/****************************************************************************
+ * Name: gpin_read
+ ****************************************************************************/
+
+#if BOARD_NGPIOIN > 0
+static int gpin_read(struct gpio_dev_s *dev, bool *value)
+{
+  struct esp32gpio_dev_s *esp32gpio = (struct esp32gpio_dev_s *)dev;
+
+  DEBUGASSERT(esp32gpio != NULL && value != NULL);
+  DEBUGASSERT(esp32gpio->id < BOARD_NGPIOIN);
+  gpioinfo("Reading... pin %d\n", g_gpioinputs[esp32gpio->id]);
+
+  *value = esp32_gpioread(g_gpioinputs[esp32gpio->id]);
+  return OK;
+}
+#endif
+
+/****************************************************************************
+ * Name: esp32gpio_interrupt
+ ****************************************************************************/
+
+#if BOARD_NGPIOINT > 0
+static int esp32gpio_interrupt(int irq, void *context, void *arg)
+{
+  struct esp32gpint_dev_s *esp32gpint =
+    (struct esp32gpint_dev_s *)arg;
+
+  DEBUGASSERT(esp32gpint != NULL && esp32gpint->callback != NULL);
+  gpioinfo("Interrupt! callback=%p\n", esp32gpint->callback);
+
+  esp32gpint->callback(&esp32gpint->esp32gpio.gpio,
+                       esp32gpint->esp32gpio.id);
+  return OK;
+}
+
+/****************************************************************************
+ * Name: gpint_read
+ ****************************************************************************/
+
+static int gpint_read(struct gpio_dev_s *dev, bool *value)
+{
+  struct esp32gpint_dev_s *esp32gpint =
+    (struct esp32gpint_dev_s *)dev;
+
+  DEBUGASSERT(esp32gpint != NULL && value != NULL);
+  DEBUGASSERT(esp32gpint->esp32gpio.id < BOARD_NGPIOINT);
+  gpioinfo("Reading int pin...\n");
+
+  *value = esp32_gpioread(g_gpiointinputs[esp32gpint->esp32gpio.id]);
+  return OK;
+}
+
+/****************************************************************************
+ * Name: gpint_attach
+ ****************************************************************************/
+
+static int gpint_attach(struct gpio_dev_s *dev,
+                        pin_interrupt_t callback)
+{
+  struct esp32gpint_dev_s *esp32gpint =
+    (struct esp32gpint_dev_s *)dev;
+  int irq = ESP32_PIN2IRQ(g_gpiointinputs[esp32gpint->esp32gpio.id]);
+  int ret;
+
+  gpioinfo("Attaching the callback\n");
+
+  /* Make sure the interrupt is disabled */
+
+  esp32_gpioirqdisable(irq);
+  ret = irq_attach(irq,
+                   esp32gpio_interrupt,
+                   &g_gpint[esp32gpint->esp32gpio.id]);
+  if (ret < 0)
+    {
+      syslog(LOG_ERR, "ERROR: gpint_attach() failed: %d\n", ret);
+      return ret;
+    }
+
+  gpioinfo("Attach %p\n", callback);
+  esp32gpint->callback = callback;
+  return OK;
+}
+
+/****************************************************************************
+ * Name: gpint_enable
+ ****************************************************************************/
+
+static int gpint_enable(struct gpio_dev_s *dev, bool enable)
+{
+  struct esp32gpint_dev_s *esp32gpint =
+    (struct esp32gpint_dev_s *)dev;
+  int irq = ESP32_PIN2IRQ(g_gpiointinputs[esp32gpint->esp32gpio.id]);
+
+  if (enable)
+    {
+      if (esp32gpint->callback != NULL)
+        {
+          gpioinfo("Enabling the interrupt\n");
+
+          /* Configure the interrupt for rising edge */
+
+          esp32_gpioirqenable(irq, RISING);
+        }
+    }
+  else
+    {
+      gpioinfo("Disable the interrupt\n");
+      esp32_gpioirqdisable(irq);
+    }
+
+  return OK;
+}
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32_gpio_init
+ ****************************************************************************/
+
+int esp32_gpio_init(void)
+{
+  int pincount = 0;
+  int i;
+
+#if BOARD_NGPIOOUT > 0
+  for (i = 0; i < BOARD_NGPIOOUT; i++)
+    {
+      /* Setup and register the GPIO pin */
+
+      g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN;
+      g_gpout[i].gpio.gp_ops     = &gpout_ops;
+      g_gpout[i].id              = i;
+      gpio_pin_register(&g_gpout[i].gpio, pincount);
+
+      /* Configure the pins that will be used as output */
+
+      esp32_gpio_matrix_out(g_gpiooutputs[i], SIG_GPIO_OUT_IDX, 0, 0);
+      esp32_configgpio(g_gpiooutputs[i], OUTPUT_FUNCTION_3 |
+                       INPUT_FUNCTION_3);
+      esp32_gpiowrite(g_gpiooutputs[i], 0);
+
+      pincount++;
+    }
+#endif
+
+#if BOARD_NGPIOIN > 0
+  for (i = 0; i < BOARD_NGPIOIN; i++)
+    {
+      /* Setup and register the GPIO pin */
+
+      g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN;
+      g_gpin[i].gpio.gp_ops     = &gpin_ops;
+      g_gpin[i].id              = i;
+      gpio_pin_register(&g_gpin[i].gpio, pincount);
+
+      /* Configure the pins that will be used as INPUT */
+
+      esp32_configgpio(g_gpioinputs[i], INPUT_FUNCTION_3);
+
+      pincount++;
+    }
+#endif
+
+#if BOARD_NGPIOINT > 0
+  for (i = 0; i < BOARD_NGPIOINT; i++)
+    {
+      /* Setup and register the GPIO pin */
+
+      g_gpint[i].esp32gpio.gpio.gp_pintype = GPIO_INTERRUPT_PIN;
+      g_gpint[i].esp32gpio.gpio.gp_ops     = &gpint_ops;
+      g_gpint[i].esp32gpio.id              = i;
+      gpio_pin_register(&g_gpint[i].esp32gpio.gpio, pincount);
+
+      /* Configure the pins that will be used as interrupt input */
+
+      esp32_configgpio(g_gpiointinputs[i], INPUT_FUNCTION_3 | PULLDOWN);
+
+      pincount++;
+    }
+#endif
+
+  return OK;
+}
+#endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_mmcsd.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_mmcsd.c
new file mode 100644
index 0000000000..6dc3afda83
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_mmcsd.c
@@ -0,0 +1,84 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_mmcsd.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <debug.h>
+#include <nuttx/config.h>
+#include <nuttx/mmcsd.h>
+#include <nuttx/spi/spi.h>
+#include <pthread.h>
+#include <sched.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "esp32_spi.h"
+#include "esp32-sparrow-kit.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32_mmcsd_initialize
+ *
+ * Description:
+ *   Initialize SPI-based SD card and card detect thread.
+ ****************************************************************************/
+
+int esp32_mmcsd_initialize(int minor)
+{
+  struct spi_dev_s *spi;
+  int rv;
+
+  mcinfo("INFO: Initializing mmcsd card\n");
+
+  spi = esp32_spibus_initialize(CONFIG_NSH_MMCSDSPIPORTNO);
+  if (spi == NULL)
+    {
+      mcerr("ERROR: Failed to initialize SPI port %d\n", 2);
+      return -ENODEV;
+    }
+
+  rv = mmcsd_spislotinitialize(minor, 0, spi);
+  if (rv < 0)
+    {
+      mcerr("ERROR: Failed to bind SPI port %d to SD slot %d\n",
+            2, 0);
+      return rv;
+    }
+
+  spiinfo("INFO: mmcsd card has been initialized successfully\n");
+  return OK;
+}
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_reset.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_reset.c
new file mode 100644
index 0000000000..e77dac3805
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_reset.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_reset.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/board.h>
+
+#ifdef CONFIG_BOARDCTL_RESET
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_reset
+ *
+ * Description:
+ *   Reset board.  Support for this function is required by board-level
+ *   logic if CONFIG_BOARDCTL_RESET is selected.
+ *
+ * Input Parameters:
+ *   status - Status information provided with the reset event.  This
+ *            meaning of this status information is board-specific.  If not
+ *            used by a board, the value zero may be provided in calls to
+ *            board_reset().
+ *
+ * Returned Value:
+ *   If this function returns, then it was not possible to power-off the
+ *   board due to some constraints.  The return value in this case is a
+ *   board-specific reason for the failure to shutdown.
+ *
+ ****************************************************************************/
+
+int board_reset(int status)
+{
+  up_systemreset();
+
+  return 0;
+}
+
+#endif /* CONFIG_BOARDCTL_RESET */
diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_userleds.c b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_userleds.c
new file mode 100644
index 0000000000..a1b49875d8
--- /dev/null
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_userleds.c
@@ -0,0 +1,94 @@
+/****************************************************************************
+ * boards/xtensa/esp32/esp32-sparrow-kit/src/esp32_userleds.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <debug.h>
+
+#include <nuttx/board.h>
+#include <arch/board/board.h>
+
+#include "esp32_gpio.h"
+#include "esp32-sparrow-kit.h"
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/* This array maps an LED number to GPIO pin configuration */
+
+static const uint32_t g_ledcfg[BOARD_NLEDS] =
+{
+  GPIO_LED1, GPIO_LED2, GPIO_LED3
+};
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_userled_initialize
+ ****************************************************************************/
+
+uint32_t board_userled_initialize(void)
+{
+  uint8_t i;
+
+  /* Configure the LEDs GPIOs as outputs */
+
+  for (i = 0; i < BOARD_NLEDS; i++)
+    {
+      esp32_configgpio(g_ledcfg[i], OUTPUT);
+    }
+
+  return BOARD_NLEDS;
+}
+
+/****************************************************************************
+ * Name: board_userled
+ ****************************************************************************/
+
+void board_userled(int led, bool ledon)
+{
+  if ((unsigned)led < BOARD_NLEDS)
+    {
+      esp32_gpiowrite(g_ledcfg[led], ledon);
+    }
+}
+
+/****************************************************************************
+ * Name: board_userled_all
+ ****************************************************************************/
+
+void board_userled_all(uint32_t ledset)
+{
+  uint8_t i;
+
+  for (i = 0; i < BOARD_NLEDS; i++)
+    {
+      esp32_gpiowrite(g_ledcfg[i], (ledset & (1 << i)) != 0);
+    }
+}


[incubator-nuttx] 03/03: esp32-sparrow-kit: enable support for MMCSD-SPI

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 9c6971279d58e532cd4d9b6d9d57579549d67c7a
Author: Robert-Ionut Alexa <ro...@gmail.com>
AuthorDate: Mon Nov 21 18:55:09 2022 +0200

    esp32-sparrow-kit: enable support for MMCSD-SPI
    
    Add the necessary configs to the default nsh config file in order to enable
    support for MMCSD-SPI.
    
    Signed-off-by: Robert-Ionut Alexa <ro...@gmail.com>
---
 .../xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig b/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig
index c2c140b764..cf8554005b 100644
--- a/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig
+++ b/boards/xtensa/esp32/esp32-sparrow-kit/configs/nsh/defconfig
@@ -6,9 +6,14 @@
 # modifications.
 #
 # CONFIG_ARCH_LEDS is not set
+# CONFIG_ESP32_SPI2_DMA is not set
+# CONFIG_MMCSD_HAVE_CARDDETECT is not set
+# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set
+# CONFIG_MMCSD_MMCSUPPORT is not set
 # CONFIG_NSH_ARGCAT is not set
 # CONFIG_NSH_CMDOPT_HEXDUMP is not set
 # CONFIG_NSH_CMDPARMS is not set
+# CONFIG_SPI_EXCHANGE is not set
 CONFIG_ARCH="xtensa"
 CONFIG_ARCH_BOARD="esp32-sparrow-kit"
 CONFIG_ARCH_BOARD_COMMON=y
@@ -22,18 +27,29 @@ CONFIG_BOARD_LOOPSPERMSEC=16717
 CONFIG_BUILTIN=y
 CONFIG_ESP32_I2C0=y
 CONFIG_ESP32_I2C0_SDAPIN=21
+CONFIG_ESP32_SPI2=y
+CONFIG_ESP32_SPI2_CLKPIN=18
+CONFIG_ESP32_SPI2_CSPIN=5
+CONFIG_ESP32_SPI2_MISOPIN=19
+CONFIG_ESP32_SPI2_MOSIPIN=23
 CONFIG_ESP32_UART0=y
+CONFIG_FAT_LCNAMES=y
+CONFIG_FAT_LFN=y
+CONFIG_FS_FAT=y
 CONFIG_FS_PROCFS=y
 CONFIG_HAVE_CXX=y
 CONFIG_HAVE_CXXINITIALIZE=y
 CONFIG_IDLETHREAD_STACKSIZE=3072
 CONFIG_INIT_ENTRYPOINT="nsh_main"
 CONFIG_INTELHEX_BINARY=y
+CONFIG_MMCSD=y
+CONFIG_MMCSD_SPICLOCK=4000000
 CONFIG_MM_REGIONS=3
 CONFIG_NSH_ARCHINIT=y
 CONFIG_NSH_BUILTIN_APPS=y
 CONFIG_NSH_FILEIOSIZE=512
 CONFIG_NSH_LINELEN=64
+CONFIG_NSH_MMCSDSPIPORTNO=2
 CONFIG_NSH_READLINE=y
 CONFIG_PREALLOC_TIMERS=4
 CONFIG_RAM_SIZE=114688