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/08/06 07:31:10 UTC
[incubator-nuttx] 01/02: Added support for the Lily Go TTGO T-Display ESP32 V1.1 board.
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 2ccb4eb16357f2590840cb062cf522e8674ce9de
Author: Tiago Medicci Serrano <ti...@espressif.com>
AuthorDate: Thu Jul 28 18:56:53 2022 -0300
Added support for the Lily Go TTGO T-Display ESP32 V1.1 board.
https://github.com/Xinyuan-LilyGO/TTGO-T-Display
---
boards/Kconfig | 15 +
boards/xtensa/esp32/common/src/Make.defs | 6 +-
boards/xtensa/esp32/common/src/esp32_board_spi.c | 2 +-
.../src/{esp32_board_spi.c => esp32_st7789.c} | 155 +++---
boards/xtensa/esp32/ttgo_t_display_esp32/Kconfig | 118 +++++
.../ttgo_t_display_esp32/configs/nsh/defconfig | 45 ++
.../esp32/ttgo_t_display_esp32/include/board.h | 65 +++
.../ttgo_t_display_esp32/include/board_memorymap.h | 128 +++++
.../esp32/ttgo_t_display_esp32/scripts/.gitignore | 1 +
.../esp32/ttgo_t_display_esp32/scripts/Make.defs | 92 ++++
.../esp32/ttgo_t_display_esp32/src/Make.defs | 73 +++
.../esp32/ttgo_t_display_esp32/src/esp32_appinit.c | 80 +++
.../esp32/ttgo_t_display_esp32/src/esp32_boot.c | 96 ++++
.../esp32/ttgo_t_display_esp32/src/esp32_bringup.c | 560 +++++++++++++++++++++
.../esp32/ttgo_t_display_esp32/src/esp32_buttons.c | 166 ++++++
.../esp32/ttgo_t_display_esp32/src/esp32_gpio.c | 391 ++++++++++++++
.../esp32/ttgo_t_display_esp32/src/esp32_ledc.c | 134 +++++
.../esp32/ttgo_t_display_esp32/src/esp32_mmcsd.c | 84 ++++
.../esp32/ttgo_t_display_esp32/src/esp32_reset.c | 87 ++++
.../esp32/ttgo_t_display_esp32/src/esp32_twai.c | 92 ++++
.../ttgo_t_display_esp32/src/esp32_userleds.c | 95 ++++
.../src/ttgo_t_display_esp32.h} | 169 +++----
22 files changed, 2484 insertions(+), 170 deletions(-)
diff --git a/boards/Kconfig b/boards/Kconfig
index ffc8ba68b8..b33bdca136 100644
--- a/boards/Kconfig
+++ b/boards/Kconfig
@@ -285,6 +285,17 @@ config ARCH_BOARD_TTGO_T5V2_ESP32
Display resolution 128/296. More info:
https://github.com/Xinyuan-LilyGO/LilyGo-T5-Epaper-Series
+config ARCH_BOARD_TTGO_T_DISPLAY_ESP32
+ bool "TTGO T-Display ESP32 v1.1"
+ depends on ARCH_CHIP_ESP32WROOM32 || ARCH_CHIP_ESP32WROOM32_8MB || ARCH_CHIP_ESP32WROOM32_16MB || ARCH_CHIP_ESP32WROVER || ARCH_CHIP_ESP32SOLO1
+ select ARCH_HAVE_LEDS
+ select ARCH_HAVE_BUTTONS
+ select ARCH_HAVE_IRQBUTTONS if ESP32_GPIO_IRQ
+ ---help---
+ TTGO-T-DISPLAY-ESP32 is an ESP32 with a TFT Display.
+ This port is for board version 1.1, more info:
+ https://github.com/Xinyuan-LilyGO/TTGO-T-Display
+
config ARCH_BOARD_ESP32C3_DEVKIT
bool "Espressif ESP32-C3 DevKit"
depends on ARCH_CHIP_ESP32C3MINI1 || ARCH_CHIP_ESP32C3WROOM02
@@ -2777,6 +2788,7 @@ config ARCH_BOARD
default "tm4c1294-launchpad" if ARCH_BOARD_TM4C1294_LAUNCHPAD
default "tms570ls31x-usb-kit" if ARCH_BOARD_TMS570LS31X_USB_KIT
default "ttgo_lora_esp32" if ARCH_BOARD_TTGO_LORA_ESP32
+ default "ttgo_t_display_esp32" if ARCH_BOARD_TTGO_T_DISPLAY_ESP32
default "twr-k60n512" if ARCH_BOARD_TWR_K60N512
default "twr-k64f120m" if ARCH_BOARD_TWR_K64F120M
default "u-blox-c027" if ARCH_BOARD_U_BLOX_C027
@@ -3550,6 +3562,9 @@ endif
if ARCH_BOARD_TTGO_LORA_ESP32
source "boards/xtensa/esp32/ttgo_lora_esp32/Kconfig"
endif
+if ARCH_BOARD_TTGO_T_DISPLAY_ESP32
+source "boards/xtensa/esp32/ttgo_t_display_esp32/Kconfig"
+endif
if ARCH_BOARD_Z16F2800100ZCOG
source "boards/z16/z16f/z16f2800100zcog/Kconfig"
endif
diff --git a/boards/xtensa/esp32/common/src/Make.defs b/boards/xtensa/esp32/common/src/Make.defs
index 2d044889e1..a6f53e6476 100644
--- a/boards/xtensa/esp32/common/src/Make.defs
+++ b/boards/xtensa/esp32/common/src/Make.defs
@@ -57,7 +57,7 @@ ifeq ($(CONFIG_SENSORS_BMP180),y)
endif
ifeq ($(CONFIG_SENSORS_BMP280),y)
-CSRCS += esp32_bmp280.c
+ CSRCS += esp32_bmp280.c
endif
ifeq ($(CONFIG_SENSORS_SHT3X),y)
@@ -84,6 +84,10 @@ ifeq ($(CONFIG_LCD_ILI9341),y)
CSRCS += esp32_ili9341.c
endif
+ifeq ($(CONFIG_LCD_ST7789),y)
+ CSRCS += esp32_st7789.c
+endif
+
ifeq ($(CONFIG_LCD_SSD1306_I2C),y)
CSRCS += esp32_ssd1306.c
endif
diff --git a/boards/xtensa/esp32/common/src/esp32_board_spi.c b/boards/xtensa/esp32/common/src/esp32_board_spi.c
index 5a02dd6622..c9aefde260 100644
--- a/boards/xtensa/esp32/common/src/esp32_board_spi.c
+++ b/boards/xtensa/esp32/common/src/esp32_board_spi.c
@@ -71,7 +71,7 @@ static inline uint8_t spi_status(struct spi_dev_s *dev, uint32_t devid)
static inline int spi_cmddata(struct spi_dev_s *dev, uint32_t devid,
bool cmd)
{
-#if defined(CONFIG_LCD_ILI9341) || defined(CONFIG_LCD_SSD1680)
+#if defined(CONFIG_LCD_ILI9341) || defined(CONFIG_LCD_SSD1680) || defined(CONFIG_LCD_ST7789)
if (devid == SPIDEV_DISPLAY(0))
{
/* This is the Data/Command control pad which determines whether the
diff --git a/boards/xtensa/esp32/common/src/esp32_board_spi.c b/boards/xtensa/esp32/common/src/esp32_st7789.c
similarity index 51%
copy from boards/xtensa/esp32/common/src/esp32_board_spi.c
copy to boards/xtensa/esp32/common/src/esp32_st7789.c
index 5a02dd6622..62af334a0f 100644
--- a/boards/xtensa/esp32/common/src/esp32_board_spi.c
+++ b/boards/xtensa/esp32/common/src/esp32_st7789.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * boards/xtensa/esp32/common/src/esp32_board_spi.c
+ * boards/xtensa/esp32/common/src/esp32_st7789.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -24,128 +24,123 @@
#include <nuttx/config.h>
-#include <stdint.h>
+#include <stdio.h>
#include <stdbool.h>
#include <debug.h>
+#include <errno.h>
+#include <nuttx/arch.h>
+#include <nuttx/board.h>
#include <nuttx/spi/spi.h>
+#include <nuttx/lcd/lcd.h>
+#include <nuttx/lcd/st7789.h>
+
#include <arch/board/board.h>
+#include "esp32_spi.h"
#include "esp32_gpio.h"
/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: spi_status
+ * Pre-processor Definitions
****************************************************************************/
-static inline uint8_t spi_status(struct spi_dev_s *dev, uint32_t devid)
-{
- uint8_t status = 0;
-
-#ifdef CONFIG_MMCSD_SPI
- if (devid == SPIDEV_MMCSD(0))
- {
- status |= SPI_STATUS_PRESENT;
- }
+#ifndef CONFIG_SPI_CMDDATA
+# error "The ST7789 driver requires CONFIG_SPI_CMDATA in the config"
#endif
-#if defined(CONFIG_LCD_ILI9341) || defined(CONFIG_LCD_SSD1680)
- if (devid == SPIDEV_DISPLAY(0))
- {
- status |= SPI_STATUS_PRESENT;
- }
+#ifndef CONFIG_ESP32_SPI_SWCS
+# error "The ST7789 driver requires CONFIG_ESP32_SPI_SWCS in the config"
#endif
- return status;
-}
-
/****************************************************************************
- * Name: spi_cmddata
+ * Private Data
****************************************************************************/
-#ifdef CONFIG_SPI_CMDDATA
-
-static inline int spi_cmddata(struct spi_dev_s *dev, uint32_t devid,
- bool cmd)
-{
-#if defined(CONFIG_LCD_ILI9341) || defined(CONFIG_LCD_SSD1680)
- if (devid == SPIDEV_DISPLAY(0))
- {
- /* This is the Data/Command control pad which determines whether the
- * data bits are data or a command.
- */
-
- esp32_gpiowrite(DISPLAY_DC, !cmd);
- return OK;
- }
-#endif
-
- return -ENODEV;
-}
-
-#endif
+static struct spi_dev_s *g_spidev;
+static struct lcd_dev_s *g_lcd = NULL;
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
- * Name: esp32_spi2_status
+ * Name: board_lcd_initialize
+ *
+ * Description:
+ * Initialize the LCD video hardware. The initial state of the LCD is
+ * fully initialized, display memory cleared, and the LCD ready to use, but
+ * with the power setting at 0 (full off).
+ *
****************************************************************************/
-#ifdef CONFIG_ESP32_SPI2
-
-uint8_t esp32_spi2_status(struct spi_dev_s *dev, uint32_t devid)
+int board_lcd_initialize(void)
{
- return spi_status(dev, devid);
-}
+ g_spidev = esp32_spibus_initialize(DISPLAY_SPI);
+ if (!g_spidev)
+ {
+ lcderr("ERROR: Failed to initialize SPI port %d\n", DISPLAY_SPI);
+ return -ENODEV;
+ }
-#endif
+ /* SPI RX is not used. Same pin is used as LCD Data/Command control */
-/****************************************************************************
- * Name: esp32_spi2_cmddata
- ****************************************************************************/
+ esp32_configgpio(DISPLAY_DC, OUTPUT);
+ esp32_gpiowrite(DISPLAY_DC, true);
-#if defined(CONFIG_ESP32_SPI2) && defined(CONFIG_SPI_CMDDATA)
+ /* Pull LCD_RESET high */
-int esp32_spi2_cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
-{
- spiinfo("devid: %" PRIu32 " CMD: %s\n", devid, cmd ? "command" :
- "data");
+ esp32_configgpio(DISPLAY_RST, OUTPUT);
+ esp32_gpiowrite(DISPLAY_RST, false);
+ up_mdelay(1);
+ esp32_gpiowrite(DISPLAY_RST, true);
+ up_mdelay(10);
- return spi_cmddata(dev, devid, cmd);
-}
+ /* Set full brightness */
-#endif
+ esp32_configgpio(DISPLAY_BCKL, OUTPUT);
+ esp32_gpiowrite(DISPLAY_BCKL, true);
+
+ lcdinfo("LCD successfully initialized");
+
+ return OK;
+}
/****************************************************************************
- * Name: esp32_spi3_status
+ * Name: board_lcd_getdev
+ *
+ * Description:
+ * Return a a reference to the LCD object for the specified LCD. This
+ * allows support for multiple LCD devices.
+ *
****************************************************************************/
-#ifdef CONFIG_ESP32_SPI3
-
-uint8_t esp32_spi3_status(struct spi_dev_s *dev, uint32_t devid)
+FAR struct lcd_dev_s *board_lcd_getdev(int devno)
{
- return spi_status(dev, devid);
-}
+ g_lcd = st7789_lcdinitialize(g_spidev);
+ if (g_lcd == NULL)
+ {
+ lcderr("ERROR: Failed to bind SPI port %d to LCD %d\n", DISPLAY_SPI,
+ devno);
-#endif
+ return NULL;
+ }
+
+ lcdinfo("SPI port %d bound to LCD %d\n", DISPLAY_SPI, devno);
+
+ return g_lcd;
+}
/****************************************************************************
- * Name: esp32_spi3_cmddata
+ * Name: board_lcd_uninitialize
+ *
+ * Description:
+ * Uninitialize the LCD support
+ *
****************************************************************************/
-#if defined(CONFIG_ESP32_SPI3) && defined(CONFIG_SPI_CMDDATA)
-
-int esp32_spi3_cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
+void board_lcd_uninitialize(void)
{
- spiinfo("devid: %" PRIu32 " CMD: %s\n", devid, cmd ? "command" :
- "data");
+ /* Turn the display off */
- return spi_cmddata(dev, devid, cmd);
+ g_lcd->setpower(g_lcd, 0);
}
-
-#endif
diff --git a/boards/xtensa/esp32/ttgo_t_display_esp32/Kconfig b/boards/xtensa/esp32/ttgo_t_display_esp32/Kconfig
new file mode 100644
index 0000000000..b9fcf41810
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/Kconfig
@@ -0,0 +1,118 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+if ARCH_BOARD_TTGO_T_DISPLAY_ESP32
+
+if PM
+
+config PM_ALARM_SEC
+ int "PM_STANDBY delay (seconds)"
+ default 15
+ depends on PM
+ ---help---
+ Number of seconds to wait in PM_STANDBY before going to PM_STANDBY mode.
+
+config PM_ALARM_NSEC
+ int "PM_STANDBY delay (nanoseconds)"
+ default 0
+ depends on PM
+ ---help---
+ Number of additional nanoseconds to wait in PM_STANDBY before going to PM_STANDBY mode.
+
+config PM_SLEEP_WAKEUP_SEC
+ int "PM_SLEEP delay (seconds)"
+ default 20
+ depends on PM
+ ---help---
+ Number of seconds to wait in PM_SLEEP.
+
+config PM_SLEEP_WAKEUP_NSEC
+ int "PM_SLEEP delay (nanoseconds)"
+ default 0
+ depends on PM
+ ---help---
+ Number of additional nanoseconds to wait in PM_SLEEP.
+
+endif # PM
+
+if ESP32_SPIRAM
+
+menu "PSRAM clock and cs IO for ESP32-DOWD"
+config D0WD_PSRAM_CLK_IO
+ int "PSRAM CLK IO number"
+ range 0 33
+ default 17
+ ---help---
+ The PSRAM CLOCK IO can be any unused GPIO, user can config it
+ based on hardware design. If user use 1.8V flash and 1.8V psram,
+ this value can only be one of 6, 7, 8, 9, 10, 11, 16, 17.
+
+config D0WD_PSRAM_CS_IO
+ int "PSRAM CS IO number"
+ range 0 33
+ default 16
+ ---help---
+ The PSRAM CS IO can be any unused GPIO, user can config it based
+ on hardware design. If user use 1.8V flash and 1.8V psram, this
+ value can only be one of 6, 7, 8, 9, 10, 11, 16, 17.
+endmenu
+
+menu "PSRAM clock and cs IO for ESP32-D2WD"
+config D2WD_PSRAM_CLK_IO
+ int "PSRAM CLK IO number"
+ range 0 33
+ default 9
+ ---help---
+ User can config it based on hardware design. For ESP32-D2WD chip,
+ the psram can only be 1.8V psram, so this value can only be one
+ of 6, 7, 8, 9, 10, 11, 16, 17.
+
+config D2WD_PSRAM_CS_IO
+ int "PSRAM CS IO number"
+ range 0 33
+ default 10
+ ---help---
+ User can config it based on hardware design. For ESP32-D2WD chip,
+ the psram can only be 1.8V psram, so this value can only be one
+ of 6, 7, 8, 9, 10, 11, 16, 17.
+endmenu
+
+menu "PSRAM clock and cs IO for ESP32-PICO"
+config PICO_PSRAM_CS_IO
+ int "PSRAM CS IO number"
+ range 0 33
+ default 10
+ ---help---
+ The PSRAM CS IO can be any unused GPIO, user can config it based on
+ hardware design.
+ For ESP32-PICO chip, the psram share clock with flash, so user do
+ not need to configure the clock IO.
+ For the reference hardware design, please refer to
+ https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf
+endmenu
+
+config ESP32_SPIRAM_SPIWP_SD3_PIN
+ int "SPI PSRAM WP(SD3) Pin when customising pins via eFuse (read help)"
+ range 0 33
+ default 7
+ ---help---
+ This value is ignored unless flash mode is set to DIO or DOUT and
+ the SPI flash pins have been overridden by setting the eFuses
+ SPI_PAD_CONFIG_xxx.
+
+ When this is the case, the eFuse config only defines 3 of the 4
+ Quad I/O data pins. The WP pin (aka ESP32 pin "SD_DATA_3" or SPI
+ flash pin "IO2") is not specified in eFuse. And the psram only
+ has QPI mode, the WP pin is necessary, so we need to configure
+ this value here.
+
+ When flash mode is set to QIO or QOUT, the PSRAM WP pin will be
+ set as the value configured in bootloader.
+
+ For ESP32-PICO chip, the default value of this config should be 7.
+
+endif # ESP32_PSRAM
+
+endif # ARCH_BOARD_TTGO_T_DISPLAY_ESP32
diff --git a/boards/xtensa/esp32/ttgo_t_display_esp32/configs/nsh/defconfig b/boards/xtensa/esp32/ttgo_t_display_esp32/configs/nsh/defconfig
new file mode 100644
index 0000000000..b2c8986dde
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/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="ttgo_t_display_esp32"
+CONFIG_ARCH_BOARD_COMMON=y
+CONFIG_ARCH_BOARD_TTGO_T_DISPLAY_ESP32=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/ttgo_t_display_esp32/include/board.h b/boards/xtensa/esp32/ttgo_t_display_esp32/include/board.h
new file mode 100644
index 0000000000..c0eafaeccf
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/include/board.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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_TTGO_T_DISPLAY_ESP32_INCLUDE_BOARD_H
+#define __BOARDS_XTENSA_ESP32_TTGO_T_DISPLAY_ESP32_INCLUDE_BOARD_H
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Clocking *****************************************************************/
+
+/* The TTGO-T-DISPLAY-ESP32 is fitted with a 40MHz crystal */
+
+#ifdef CONFIG_ESP32_XTAL_26MHz
+# define BOARD_XTAL_FREQUENCY 26000000
+#else
+# define BOARD_XTAL_FREQUENCY 40000000
+#endif
+
+#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 16
+#define DISPLAY_RST 23
+#define DISPLAY_BCKL 4
+
+/* LED definitions **********************************************************/
+
+/* Define how many LEDs this board has (needed by userleds) */
+
+#define BOARD_NLEDS 1
+
+/* GPIO pins used by the GPIO Subsystem */
+
+#define BOARD_NGPIOOUT 1 /* Amount of GPIO Output pins */
+#define BOARD_NGPIOIN 1 /* Amount of GPIO Input without Interruption */
+#define BOARD_NGPIOINT 1 /* Amount of GPIO Input w/ Interruption pins */
+
+#endif /* __BOARDS_XTENSA_ESP32_TTGO_T_DISPLAY_ESP32_INCLUDE_BOARD_H */
diff --git a/boards/xtensa/esp32/ttgo_t_display_esp32/include/board_memorymap.h b/boards/xtensa/esp32/ttgo_t_display_esp32/include/board_memorymap.h
new file mode 100644
index 0000000000..e9951ba419
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/include/board_memorymap.h
@@ -0,0 +1,128 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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_TTGO_T_DISPLAY_ESP32_INCLUDE_BOARD_MEMORYMAP_H
+#define __BOARDS_XTENSA_ESP32_TTGO_T_DISPLAY_ESP32_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 uintptr_t __kirom_start;
+extern uintptr_t __kirom_size;
+extern uintptr_t __kdrom_start;
+extern uintptr_t __kdrom_size;
+
+/* Kernel RAM (RW) */
+
+extern uintptr_t __kiram_0_start;
+extern uintptr_t __kiram_0_size;
+extern uintptr_t __kiram_0_end;
+extern uintptr_t __kiram_1_start;
+extern uintptr_t __kiram_1_size;
+extern uintptr_t __kiram_1_end;
+extern uintptr_t __kdram_0_start;
+extern uintptr_t __kdram_0_size;
+extern uintptr_t __kdram_0_end;
+extern uintptr_t __kdram_1_start;
+extern uintptr_t __kdram_1_size;
+extern uintptr_t __kdram_1_end;
+
+/* Exception vectors */
+
+extern uintptr_t __vectors_start;
+extern uintptr_t __vectors_end;
+
+/* User ROM (RX) */
+
+extern uintptr_t __uirom_start;
+extern uintptr_t __uirom_size;
+extern uintptr_t __uirom_end;
+extern uintptr_t __udrom_start;
+extern uintptr_t __udrom_size;
+extern uintptr_t __udrom_end;
+
+/* User RAM (RW) */
+
+extern uintptr_t __uiram_start;
+extern uintptr_t __uiram_size;
+extern uintptr_t __uiram_end;
+extern uintptr_t __udram_start;
+extern uintptr_t __udram_size;
+extern uintptr_t __udram_end;
+
+#endif /* __BOARDS_XTENSA_ESP32_TTGO_T_DISPLAY_ESP32_INCLUDE_BOARD_MEMORYMAP_H */
diff --git a/boards/xtensa/esp32/ttgo_t_display_esp32/scripts/.gitignore b/boards/xtensa/esp32/ttgo_t_display_esp32/scripts/.gitignore
new file mode 100644
index 0000000000..461270524b
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/scripts/.gitignore
@@ -0,0 +1 @@
+/esp32_out.ld
diff --git a/boards/xtensa/esp32/ttgo_t_display_esp32/scripts/Make.defs b/boards/xtensa/esp32/ttgo_t_display_esp32/scripts/Make.defs
new file mode 100644
index 0000000000..f4528ed85c
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/scripts/Make.defs
@@ -0,0 +1,92 @@
+############################################################################
+# boards/xtensa/esp32/ttgo_t_display_esp32/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/ttgo_t_display_esp32/src/Make.defs b/boards/xtensa/esp32/ttgo_t_display_esp32/src/Make.defs
new file mode 100644
index 0000000000..47f8bf5938
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/Make.defs
@@ -0,0 +1,73 @@
+############################################################################
+# boards/xtensa/esp32/ttgo_t_display_esp32/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_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_PWM),y)
+CSRCS += esp32_ledc.c
+endif
+
+ifeq ($(CONFIG_USERLED),y)
+CSRCS += esp32_userleds.c
+endif
+
+ifeq ($(CONFIG_ARCH_BUTTONS),y)
+CSRCS += esp32_buttons.c
+endif
+
+ifeq ($(CONFIG_ESP32_TWAI),y)
+CSRCS += esp32_twai.c
+endif
+
+SCRIPTOUT = $(BOARD_DIR)$(DELIM)scripts$(DELIM)esp32_out.ld
+
+.PHONY = context distclean
+
+$(SCRIPTOUT): $(LDSCRIPT_TEMPLATE) $(CONFIGFILE)
+ $(Q) $(CC) -isystem $(TOPDIR)/include -I $(BOARD_COMMON_DIR)$(DELIM)scripts -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/ttgo_t_display_esp32/src/esp32_appinit.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_appinit.c
new file mode 100644
index 0000000000..3e00e1006d
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_appinit.c
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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 "ttgo_t_display_esp32.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/ttgo_t_display_esp32/src/esp32_boot.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_boot.c
new file mode 100644
index 0000000000..de0dd65f72
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_boot.c
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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 "ttgo_t_display_esp32.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)
+{
+}
+
+/****************************************************************************
+ * 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/ttgo_t_display_esp32/src/esp32_bringup.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_bringup.c
new file mode 100644
index 0000000000..b002b928f7
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_bringup.c
@@ -0,0 +1,560 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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 <errno.h>
+#if defined(CONFIG_ESP32_EFUSE)
+#include <nuttx/efuse/efuse.h>
+#endif
+#include <nuttx/fs/fs.h>
+#include <nuttx/himem/himem.h>
+
+#if defined(CONFIG_ESP32_EFUSE)
+#include "esp32_efuse.h"
+#endif
+#include "esp32_partition.h"
+
+#ifdef CONFIG_USERLED
+# include <nuttx/leds/userled.h>
+#endif
+
+#ifdef CONFIG_CAN_MCP2515
+# include "esp32_mcp2515.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_WIFI_BT_COEXIST
+# include "esp32_wifi_adapter.h"
+#endif
+
+#ifdef CONFIG_ESP32_I2C
+# include "esp32_board_i2c.h"
+#endif
+
+#ifdef CONFIG_I2CMULTIPLEXER_TCA9548A
+# include "esp32_tca9548a.h"
+#endif
+
+#ifdef CONFIG_SENSORS_BMP180
+# include "esp32_bmp180.h"
+#endif
+
+#ifdef CONFIG_SENSORS_BMP280
+# include "esp32_bmp280.h"
+#endif
+
+#ifdef CONFIG_SENSORS_SHT3X
+# include "esp32_sht3x.h"
+#endif
+
+#ifdef CONFIG_SENSORS_MS5611
+# include "esp32_ms5611.h"
+#endif
+
+#ifdef CONFIG_LCD_HT16K33
+# include "esp32_ht16k33.h"
+#endif
+
+#ifdef CONFIG_ESP32_AES_ACCELERATOR
+# include "esp32_aes.h"
+#endif
+
+#ifdef CONFIG_ESP32_RT_TIMER
+# include "esp32_rt_timer.h"
+#endif
+
+#ifdef CONFIG_INPUT_BUTTONS
+# include <nuttx/input/buttons.h>
+#endif
+
+#ifdef CONFIG_RTC_DRIVER
+# include "esp32_rtc_lowerhalf.h"
+#endif
+
+#ifdef CONFIG_SPI_DRIVER
+# include "esp32_spi.h"
+#endif
+
+#ifdef CONFIG_LCD_DEV
+# include <nuttx/board.h>
+# include <nuttx/lcd/lcd_dev.h>
+#endif
+
+#ifdef CONFIG_VIDEO_FB
+# include <nuttx/video/fb.h>
+#endif
+
+#ifdef CONFIG_LCD_BACKPACK
+# include "esp32_lcd_backpack.h"
+#endif
+
+#include "ttgo_t_display_esp32.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;
+
+#ifdef CONFIG_ESP32_AES_ACCELERATOR
+ ret = esp32_aes_init();
+ if (ret < 0)
+ {
+ syslog(LOG_ERR,
+ "ERROR: Failed to initialize AES: %d\n", ret);
+ }
+#endif
+
+#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
+
+#if defined(CONFIG_ESP32_EFUSE)
+ ret = esp32_efuse_initialize("/dev/efuse");
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: Failed to init EFUSE: %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_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_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_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_LEDC
+ ret = esp32_pwm_setup();
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: esp32_pwm_setup() failed: %d\n", ret);
+ }
+#endif /* CONFIG_ESP32_LEDC */
+
+#ifdef CONFIG_ESP32_TWAI
+
+ /* Initialize TWAI and register the TWAI driver. */
+
+ ret = esp32_twai_setup();
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: esp32_twai_setup failed: %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_WIFI_BT_COEXIST
+ ret = esp32_wifi_bt_coexist_init();
+ if (ret)
+ {
+ syslog(LOG_ERR, "ERROR: Failed to initialize Wi-Fi and BT "
+ "coexistence support\n");
+ }
+#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_CAN_MCP2515
+ /* Configure and initialize the MCP2515 CAN device */
+
+ ret = board_mcp2515_initialize(0);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: board_mcp2515_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
+
+ /* Register the TCA9548A Multiplexer before others I2C drivers to allow it
+ * be used by other drivers. Look at esp32_ms5611.c how to use it.
+ */
+
+#ifdef CONFIG_I2CMULTIPLEXER_TCA9548A
+ /* Add the TCA9548A Mux as device 0 (0x70) in I2C Bus 0 */
+
+ ret = board_tca9548a_initialize(0, 0);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "Failed to initialize TCA9548A driver: %d\n", ret);
+ return 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_SENSORS_BMP280
+ /* Try to register BMP280 device in I2C0 */
+
+ ret = board_bmp280_initialize(0, 0);
+
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "Failed to initialize BMP280 driver: %d\n", ret);
+ }
+#endif
+
+#ifdef CONFIG_SENSORS_SHT3X
+ /* Try to register SHT3x device in I2C0 */
+
+ ret = board_sht3x_initialize(0, 0);
+
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "Failed to initialize SHT3X driver: %d\n", ret);
+ }
+#endif
+
+#ifdef CONFIG_SENSORS_MS5611
+ /* Try to register MS5611 device in I2C0 as device 0: I2C addr 0x77 */
+
+ ret = board_ms5611_initialize(0, 0);
+
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "Failed to initialize MS5611 driver: %d\n", ret);
+ return ret;
+ }
+#endif
+
+#ifdef CONFIG_LCD_HT16K33
+ /* Try to register HT16K33 in the I2C0 */
+
+ ret = board_ht16k33_initialize(0, 0);
+
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "Failed to initialize HT16K33 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
+
+#ifdef CONFIG_SPI_DRIVER
+# ifdef CONFIG_ESP32_SPI2
+ ret = board_spidev_initialize(ESP32_SPI2);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "Failed to initialize SPI%d driver: %d\n",
+ ESP32_SPI2, ret);
+ }
+# endif
+#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/ttgo_t_display_esp32/src/esp32_buttons.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_buttons.c
new file mode 100644
index 0000000000..38922beacf
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_buttons.c
@@ -0,0 +1,166 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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 "ttgo_t_display_esp32.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/ttgo_t_display_esp32/src/esp32_gpio.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_gpio.c
new file mode 100644
index 0000000000..56305d4181
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_gpio.c
@@ -0,0 +1,391 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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 "ttgo_t_display_esp32.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. GPIO15 is used as an example, any other outputs could be
+ * used.
+ */
+
+#define GPIO_OUT1 25
+
+/* Input pins. GPIO18 is used as an example, any other inputs could be
+ * used.
+ */
+
+#define GPIO_IN1 26
+
+/* Interrupt pins. GPIO22 is used as an example, any other inputs could be
+ * used.
+ */
+
+#define GPIO_IRQPIN1 27
+
+/****************************************************************************
+ * 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/ttgo_t_display_esp32/src/esp32_ledc.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_ledc.c
new file mode 100644
index 0000000000..a2110ae04d
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_ledc.c
@@ -0,0 +1,134 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_ledc.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 <errno.h>
+#include <debug.h>
+
+#include <nuttx/board.h>
+#include <nuttx/timers/pwm.h>
+
+#include <arch/board/board.h>
+
+#include "chip.h"
+#include "esp32_ledc.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32_pwm_setup
+ *
+ * Description:
+ * Initialize LEDC PWM and register the PWM device.
+ *
+ ****************************************************************************/
+
+int esp32_pwm_setup(void)
+{
+ int ret;
+ struct pwm_lowerhalf_s *pwm;
+
+#ifdef CONFIG_ESP32_LEDC_TIM0
+ pwm = esp32_ledc_init(0);
+ if (!pwm)
+ {
+ syslog(LOG_ERR, "ERROR: Failed to get the LEDC PWM 0 lower half\n");
+ return -ENODEV;
+ }
+
+ /* Register the PWM driver at "/dev/pwm0" */
+
+ ret = pwm_register("/dev/pwm0", pwm);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: pwm_register failed: %d\n", ret);
+ return ret;
+ }
+#endif
+
+#ifdef CONFIG_ESP32_LEDC_TIM1
+ pwm = esp32_ledc_init(1);
+ if (!pwm)
+ {
+ syslog(LOG_ERR, "ERROR: Failed to get the LEDC PWM 1 lower half\n");
+ return -ENODEV;
+ }
+
+ /* Register the PWM driver at "/dev/pwm1" */
+
+ ret = pwm_register("/dev/pwm1", pwm);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: pwm_register failed: %d\n", ret);
+ return ret;
+ }
+#endif
+
+#ifdef CONFIG_ESP32_LEDC_TIM2
+ pwm = esp32_ledc_init(2);
+ if (!pwm)
+ {
+ syslog(LOG_ERR, "ERROR: Failed to get the LEDC PWM 2 lower half\n");
+ return -ENODEV;
+ }
+
+ /* Register the PWM driver at "/dev/pwm2" */
+
+ ret = pwm_register("/dev/pwm2", pwm);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: pwm_register failed: %d\n", ret);
+ return ret;
+ }
+#endif
+
+#ifdef CONFIG_ESP32_LEDC_TIM3
+ pwm = esp32_ledc_init(3);
+ if (!pwm)
+ {
+ syslog(LOG_ERR, "ERROR: Failed to get the LEDC PWM 3 lower half\n");
+ return -ENODEV;
+ }
+
+ /* Register the PWM driver at "/dev/pwm3" */
+
+ ret = pwm_register("/dev/pwm3", pwm);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: pwm_register failed: %d\n", ret);
+ return ret;
+ }
+#endif
+
+ return OK;
+}
+
diff --git a/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_mmcsd.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_mmcsd.c
new file mode 100644
index 0000000000..cb543c3cf9
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_mmcsd.c
@@ -0,0 +1,84 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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 "ttgo_t_display_esp32.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/ttgo_t_display_esp32/src/esp32_reset.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_reset.c
new file mode 100644
index 0000000000..0b2779cbe6
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_reset.c
@@ -0,0 +1,87 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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 <stdlib.h>
+#include <debug.h>
+#include <assert.h>
+#include <nuttx/arch.h>
+#include <nuttx/board.h>
+
+#include "esp32_systemreset.h"
+
+#ifdef CONFIG_BOARDCTL_RESET
+
+#if CONFIG_BOARD_ASSERT_RESET_VALUE == EXIT_SUCCESS
+# error "CONFIG_BOARD_ASSERT_RESET_VALUE must not be equal to EXIT_SUCCESS"
+#endif
+
+/****************************************************************************
+ * 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)
+{
+ syslog(LOG_INFO, "reboot status=%d\n", status);
+
+ switch (status)
+ {
+ case EXIT_SUCCESS:
+ up_shutdown_handler();
+ break;
+
+ case CONFIG_BOARD_ASSERT_RESET_VALUE:
+ break;
+
+ default:
+ break;
+ }
+
+ up_systemreset();
+
+ return 0;
+}
+
+#endif /* CONFIG_BOARDCTL_RESET */
diff --git a/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_twai.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_twai.c
new file mode 100644
index 0000000000..0daeff65a6
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_twai.c
@@ -0,0 +1,92 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_twai.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 <errno.h>
+#include <debug.h>
+
+#include <nuttx/can/can.h>
+#include <arch/board/board.h>
+
+#include "chip.h"
+
+#include "esp32_twai.h"
+#include "ttgo_t_display_esp32.h"
+
+#ifdef CONFIG_CAN
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Configuration ************************************************************/
+
+#define TWAI_PORT0 0
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp32_twai_setup
+ *
+ * Description:
+ * Initialize TWAI and register the TWAI device
+ *
+ ****************************************************************************/
+
+int esp32_twai_setup(void)
+{
+#ifdef CONFIG_ESP32_TWAI0
+ struct can_dev_s *twai;
+ int ret;
+
+ /* Call esp32_twaiinitialize() to get an instance of the TWAI0
+ * interface
+ * */
+
+ twai = esp32_twaiinitialize(TWAI_PORT0);
+ if (twai == NULL)
+ {
+ canerr("ERROR: Failed to get TWAI0 interface\n");
+ return -ENODEV;
+ }
+
+ /* Register the TWAI0 driver at "/dev/can0" */
+
+ ret = can_register("/dev/can0", twai);
+ if (ret < 0)
+ {
+ canerr("ERROR: TWAI1 register failed: %d\n", ret);
+ return ret;
+ }
+
+ return OK;
+#else
+ return -ENODEV;
+#endif
+}
+
+#endif /* CONFIG_CAN */
diff --git a/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_userleds.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_userleds.c
new file mode 100644
index 0000000000..9c149978fa
--- /dev/null
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_userleds.c
@@ -0,0 +1,95 @@
+/****************************************************************************
+ * boards/xtensa/esp32/ttgo_t_display_esp32/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 "ttgo_t_display_esp32.h"
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/* This array maps an LED number to GPIO pin configuration */
+
+static const uint32_t g_ledcfg[BOARD_NLEDS] =
+{
+ GPIO_LED1,
+};
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_userled_initialize
+ ****************************************************************************/
+
+uint32_t board_userled_initialize(void)
+{
+ uint8_t i;
+
+ 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;
+
+ /* Configure LED1-8 GPIOs for output */
+
+ for (i = 0; i < BOARD_NLEDS; i++)
+ {
+ esp32_gpiowrite(g_ledcfg[i], (ledset & (1 << i)) != 0);
+ }
+}
+
diff --git a/boards/xtensa/esp32/common/src/esp32_board_spi.c b/boards/xtensa/esp32/ttgo_t_display_esp32/src/ttgo_t_display_esp32.h
similarity index 53%
copy from boards/xtensa/esp32/common/src/esp32_board_spi.c
copy to boards/xtensa/esp32/ttgo_t_display_esp32/src/ttgo_t_display_esp32.h
index 5a02dd6622..5082ecd956 100644
--- a/boards/xtensa/esp32/common/src/esp32_board_spi.c
+++ b/boards/xtensa/esp32/ttgo_t_display_esp32/src/ttgo_t_display_esp32.h
@@ -1,5 +1,5 @@
/****************************************************************************
- * boards/xtensa/esp32/common/src/esp32_board_spi.c
+ * boards/xtensa/esp32/ttgo_t_display_esp32/src/ttgo_t_display_esp32.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -18,134 +18,127 @@
*
****************************************************************************/
+#ifndef __BOARDS_XTENSA_ESP32_TTGO_T_DISPLAY_ESP32_SRC_TTGO_T_DISPLAY_ESP32_H
+#define __BOARDS_XTENSA_ESP32_TTGO_T_DISPLAY_ESP32_SRC_TTGO_T_DISPLAY_ESP32_H
+
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
-
+#include <nuttx/compiler.h>
#include <stdint.h>
-#include <stdbool.h>
-#include <debug.h>
-
-#include <nuttx/spi/spi.h>
-#include <arch/board/board.h>
-
-#include "esp32_gpio.h"
/****************************************************************************
- * Private Functions
+ * Pre-processor Definitions
****************************************************************************/
-/****************************************************************************
- * Name: spi_status
- ****************************************************************************/
+/* TTGO-T-DISPLAY-ESP32 GPIOs ***********************************************/
-static inline uint8_t spi_status(struct spi_dev_s *dev, uint32_t devid)
-{
- uint8_t status = 0;
+/* BOOT Button */
-#ifdef CONFIG_MMCSD_SPI
- if (devid == SPIDEV_MMCSD(0))
- {
- status |= SPI_STATUS_PRESENT;
- }
-#endif
+#define BUTTON_BOOT 0
-#if defined(CONFIG_LCD_ILI9341) || defined(CONFIG_LCD_SSD1680)
- if (devid == SPIDEV_DISPLAY(0))
- {
- status |= SPI_STATUS_PRESENT;
- }
-#endif
+/* LED
+ *
+ * This is an externally connected LED used for testing.
+ */
- return status;
-}
+#define GPIO_LED1 2
-/****************************************************************************
- * Name: spi_cmddata
- ****************************************************************************/
+/* MCP2515 Interrupt pin */
-#ifdef CONFIG_SPI_CMDDATA
-
-static inline int spi_cmddata(struct spi_dev_s *dev, uint32_t devid,
- bool cmd)
-{
-#if defined(CONFIG_LCD_ILI9341) || defined(CONFIG_LCD_SSD1680)
- if (devid == SPIDEV_DISPLAY(0))
- {
- /* This is the Data/Command control pad which determines whether the
- * data bits are data or a command.
- */
-
- esp32_gpiowrite(DISPLAY_DC, !cmd);
- return OK;
- }
-#endif
+#define GPIO_MCP2515_IRQ 22
- return -ENODEV;
-}
+/* TIMERS */
-#endif
+#define TIMER0 0
+#define TIMER1 1
+#define TIMER2 2
+#define TIMER3 3
+
+/* ONESHOT */
+
+#define ONESHOT_TIMER 1
+#define ONESHOT_RESOLUTION_US 1
/****************************************************************************
- * Public Functions
+ * Public Types
****************************************************************************/
/****************************************************************************
- * Name: esp32_spi2_status
+ * Public Data
****************************************************************************/
-#ifdef CONFIG_ESP32_SPI2
-
-uint8_t esp32_spi2_status(struct spi_dev_s *dev, uint32_t devid)
-{
- return spi_status(dev, devid);
-}
-
-#endif
+#ifndef __ASSEMBLY__
/****************************************************************************
- * Name: esp32_spi2_cmddata
+ * Public Function Prototypes
****************************************************************************/
-#if defined(CONFIG_ESP32_SPI2) && defined(CONFIG_SPI_CMDDATA)
-
-int esp32_spi2_cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
-{
- spiinfo("devid: %" PRIu32 " CMD: %s\n", devid, cmd ? "command" :
- "data");
-
- return spi_cmddata(dev, devid, cmd);
-}
+/****************************************************************************
+ * 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()
+ *
+ ****************************************************************************/
-#endif
+int esp32_bringup(void);
/****************************************************************************
- * Name: esp32_spi3_status
+ * Name: esp32_mmcsd_initialize
+ *
+ * Description:
+ * Initialize SPI-based SD card and card detect thread.
****************************************************************************/
-#ifdef CONFIG_ESP32_SPI3
+int esp32_mmcsd_initialize(int minor);
-uint8_t esp32_spi3_status(struct spi_dev_s *dev, uint32_t devid)
-{
- return spi_status(dev, devid);
-}
+/****************************************************************************
+ * Name: esp32_gpio_init
+ ****************************************************************************/
+#ifdef CONFIG_DEV_GPIO
+int esp32_gpio_init(void);
#endif
/****************************************************************************
- * Name: esp32_spi3_cmddata
+ * Name: esp32_ledc_setup
+ *
+ * Description:
+ * Initialize LEDC PWM and register the PWM device.
+ *
****************************************************************************/
-#if defined(CONFIG_ESP32_SPI3) && defined(CONFIG_SPI_CMDDATA)
-
-int esp32_spi3_cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd)
-{
- spiinfo("devid: %" PRIu32 " CMD: %s\n", devid, cmd ? "command" :
- "data");
+#ifdef CONFIG_ESP32_LEDC
+int esp32_pwm_setup(void);
+#endif
- return spi_cmddata(dev, devid, cmd);
-}
+/****************************************************************************
+ * Name: board_spidev_initialize
+ *
+ * Description:
+ * Initialize SPI driver and register the /dev/spi device.
+ *
+ * Input Parameters:
+ * bus - The SPI bus number, used to build the device path as /dev/spiN
+ *
+ * Returned Value:
+ * Zero (OK) is returned on success; A negated errno value is returned
+ * to indicate the nature of any failure.
+ *
+ ****************************************************************************/
+#ifdef CONFIG_SPI_DRIVER
+int board_spidev_initialize(int bus);
#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __BOARDS_XTENSA_ESP32_TTGO_T_DISPLAY_ESP32_SRC_TTGO_T_DISPLAY_ESP32_H */