Eps32 Lilygo t5v2 BSP

E-ink display is working
This commit is contained in:
Adam Kaliszan 2022-06-13 08:11:28 +02:00 committed by Petro Karashchenko
parent e87a20e648
commit 615a296b30
23 changed files with 2706 additions and 0 deletions

View File

@ -267,6 +267,24 @@ config ARCH_BOARD_TTGO_LORA_ESP32
display. This port is for board version 1.0, more info:
https://github.com/Xinyuan-LilyGO/TTGO-LoRa-Series
config ARCH_BOARD_TTGO_T5V2_ESP32
bool "TTGO e-ink T5v2.2"
depends on ARCH_CHIP_ESP32WROOM32 || ARCH_CHIP_ESP32WROOM32_8MB || ARCH_CHIP_ESP32WROOM32_16MB || ARCH_CHIP_ESP32WROVER || ARCH_CHIP_ESP32SOLO1
select ARCH_HAVE_BUTTONS
select DRIVERS_VIDEO
select VIDEO_FB
select FB_MODULEINFO
select LCD
select LCD_DEV
select LCD_FRAMEBUFFER
select LCD_PORTRAIT
select LCD_SSD1680
select LCD_SSD1680_2_9
---help---
TTGO T5v2 is an ESP32 board with e-ink 2.9 inch display.
Display resolution 128/296. More info:
https://github.com/Xinyuan-LilyGO/LilyGo-T5-Epaper-Series
config ARCH_BOARD_ESP32C3_DEVKIT
bool "Espressif ESP32-C3 DevKit"
depends on ARCH_CHIP_ESP32C3MINI1 || ARCH_CHIP_ESP32C3WROOM02
@ -2454,6 +2472,7 @@ config ARCH_BOARD
default "emw3162" if ARCH_BOARD_EMW3162
default "quickfeather" if ARCH_BOARD_QUICKFEATHER
default "esp32-devkitc" if ARCH_BOARD_ESP32_DEVKITC
default "ttgo_eink5_v2" if ARCH_BOARD_TTGO_T5V2_ESP32
default "esp32-ethernet-kit" if ARCH_BOARD_ESP32_ETHERNETKIT
default "esp32-wrover-kit" if ARCH_BOARD_ESP32_WROVERKIT
default "esp32c3-devkit" if ARCH_BOARD_ESP32C3_DEVKIT
@ -3377,6 +3396,9 @@ endif
if ARCH_BOARD_ESP32_DEVKITC
source "boards/xtensa/esp32/esp32-devkitc/Kconfig"
endif
if ARCH_BOARD_TTGO_T5V2_ESP32
source "boards/xtensa/esp32/ttgo_eink5_v2/Kconfig"
endif
if ARCH_BOARD_ESP32_ETHERNETKIT
source "boards/xtensa/esp32/esp32-ethernet-kit/Kconfig"
endif

View File

@ -60,6 +60,35 @@ choice ESP32_SPIFLASH_FS
endchoice
if LCD_SSD1680
config SSD1680_GPIO_PIN_RST
int "Pin that handles the reset line (output)"
default "12" if ARCH_BOARD_TTGO_T5V2_ESP32
config SSD1680_GPIO_PIN_BUSY
int "Pin that handles the busy line (input)"
default "4" if ARCH_BOARD_TTGO_T5V2_ESP32
config SSD1680_GPIO_PIN_PWR
int "Pin that handles the pwr on/off line (output)"
default "-1" if ARCH_BOARD_TTGO_T5V2_ESP32
config SSD1680_GPIO_PIN_CS
int "Pin that select the chip on SPI bus"
default "5" if ARCH_BOARD_TTGO_T5V2_ESP32
config SSD1680_GPIO_PIN_DTA_CMD
int "Pin that switch between command and data on 4-wire SPI bus"
default "19" if ARCH_BOARD_TTGO_T5V2_ESP32
config SSD1680_SPI_BUS
int "Spi Bus Number"
range 2 3
default "3"
depends on ESP32_SPI
endif #LCD_SSD1680
config ESP32_LCD_OVERCLOCK
bool "Run LCD at higher clock speed than allowed"
default n

View File

@ -0,0 +1,64 @@
/****************************************************************************
* boards/xtensa/esp32/common/include/esp32_ssd1680.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_SSD1680_H
#define __BOARDS_XTENSA_ESP32_COMMON_INCLUDE_ESP32_SSD1680_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
/****************************************************************************
* Public Data
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: board_ssd1680_getdev
*
* Description:
* Get the SSD1680 device driver instance
*
* Returned Value:
* Pointer to the instance
*
****************************************************************************/
struct lcd_dev_s *board_ssd1680_getdev(void);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __BOARDS_XTENSA_ESP32_COMMON_INCLUDE_ESP32_SSD1680_H */

View File

@ -84,6 +84,10 @@ ifeq ($(CONFIG_LCD_SSD1306_I2C),y)
CSRCS += esp32_ssd1306.c
endif
ifeq ($(CONFIG_LCD_SSD1680),y)
CSRCS += esp32_ssd1680.c
endif
DEPPATH += --dep-path src
VPATH += :src
CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)src)

View File

@ -0,0 +1,189 @@
/****************************************************************************
* boards/xtensa/esp32/common/src/esp32_ssd1680.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/lcd/lcd.h>
#include <nuttx/lcd/ssd1680.h>
#include <nuttx/spi/spi.h>
#if defined(CONFIG_VIDEO_FB) && defined(CONFIG_LCD_FRAMEBUFFER)
# include <nuttx/video/fb.h>
#endif
#include "esp32_gpio.h"
#include "esp32_spi.h"
#ifdef CONFIG_LCD_SSD1680
/****************************************************************************
* Private Functions
****************************************************************************/
#if defined(CONFIG_SSD1680_GPIO_PIN_PWR) && (CONFIG_SSD1680_GPIO_PIN_PWR>=0)
static bool ssd1680_set_vcc(bool state)
{
esp32_gpiowrite(CONFIG_SSD1680_GPIO_PIN_PWR, state);
return true;
}
#endif
#if defined(CONFIG_SSD1680_GPIO_PIN_RST) && (CONFIG_SSD1680_GPIO_PIN_RST>=0)
static bool ssd1680_set_rst(bool state)
{
esp32_gpiowrite(CONFIG_SSD1680_GPIO_PIN_RST, state);
return true;
}
#endif
#if defined(CONFIG_SSD1680_GPIO_PIN_BUSY) && (CONFIG_SSD1680_GPIO_PIN_BUSY>=0)
static bool ssd1680_check_busy(void)
{
return esp32_gpioread(CONFIG_SSD1680_GPIO_PIN_BUSY);
}
#endif
/****************************************************************************
* Private Data
****************************************************************************/
static struct lcd_dev_s *g_lcddev;
struct ssd1680_priv_s g_ssd1680_priv =
{
#if defined(CONFIG_SSD1680_GPIO_PIN_PWR) && (CONFIG_SSD1680_GPIO_PIN_PWR >= 0)
.set_vcc = ssd1680_set_vcc,
#else
.set_vcc = NULL,
#endif
#if defined(CONFIG_SSD1680_GPIO_PIN_RST) && (CONFIG_SSD1680_GPIO_PIN_RST >= 0)
.set_rst = ssd1680_set_rst,
#else
.set_rst = NULL,
#endif
#if defined(CONFIG_SSD1680_GPIO_PIN_BUSY) && (CONFIG_SSD1680_GPIO_PIN_BUSY >= 0)
.check_busy = ssd1680_check_busy,
#else
.check_busy = NULL,
#endif
};
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: board_lcd_initialize
****************************************************************************/
int board_lcd_initialize(void)
{
struct spi_dev_s *spi;
/* Initialize additional I/O for e-ink display */
#if defined(CONFIG_SSD1680_GPIO_PIN_DTA_CMD) && \
(CONFIG_SSD1680_GPIO_PIN_DTA_CMD >= 0)
esp32_configgpio(CONFIG_SSD1680_GPIO_PIN_DTA_CMD, OUTPUT);
#endif
#if defined(CONFIG_SSD1680_GPIO_PIN_PWR) && (CONFIG_SSD1680_GPIO_PIN_PWR >= 0)
esp32_configgpio(CONFIG_SSD1680_GPIO_PIN_PWR, OUTPUT);
lcdinfo("Using pin %d as PWR control\n", CONFIG_SSD1680_GPIO_PIN_PWR);
#else
lcdinfo("PWR control line is disabled\n");
#endif
#if defined(CONFIG_SSD1680_GPIO_PIN_RST) && (CONFIG_SSD1680_GPIO_PIN_RST >= 0)
esp32_configgpio(CONFIG_SSD1680_GPIO_PIN_RST, OUTPUT);
lcdinfo("Using pin %d as RESET\n", CONFIG_SSD1680_GPIO_PIN_RST);
#elif
lcdinfo("RESET line is disabled\n");
#endif
#if defined(CONFIG_SSD1680_GPIO_PIN_BUSY) && \
(CONFIG_SSD1680_GPIO_PIN_BUSY >= 0)
esp32_configgpio(CONFIG_SSD1680_GPIO_PIN_BUSY, INPUT | PULLUP);
lcdinfo("Using pin %d for reading busy state\n",
CONFIG_SSD1680_GPIO_PIN_BUSY);
#elif
lcdinfo("Read busy line is disabled\n");
#endif
/* Initialize SPI */
spi = esp32_spibus_initialize(CONFIG_SSD1680_SPI_BUS);
if (!spi)
{
lcderr("ERROR: Failed to initialize SPI port %d\n",
CONFIG_SSD1680_SPI_BUS);
return -ENODEV;
}
else
{
lcdinfo("Using SPI bus %d. SPI is initialized\n",
CONFIG_SSD1680_SPI_BUS);
}
/* Bind the SPI port to the E-PAPER display */
g_lcddev = ssd1680_initialize(spi, &g_ssd1680_priv);
if (!g_lcddev)
{
lcderr("ERROR: Failed to bind SPI port %d to E-paper display\n",
CONFIG_SSD1680_SPI_BUS);
return -ENODEV;
}
else
{
lcdinfo("Bound SPI port %d to E-PAPER\n", CONFIG_SSD1680_SPI_BUS);
/* And turn the OLED on.
* Must be because setpower(1) function invokes the chip configuration
*/
g_lcddev->setpower(g_lcddev, CONFIG_LCD_MAXPOWER);
}
return OK;
}
#endif
/****************************************************************************
* Name: board_ssd1680_getdev
*
* Description:
* Get the SSD1680 device driver instance
*
* Returned Value:
* Pointer to the instance
*
****************************************************************************/
struct lcd_dev_s *board_ssd1680_getdev(void)
{
return g_lcddev;
}

View File

@ -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_T5V2_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_T5V2_ESP32

View File

@ -0,0 +1,50 @@
#
# 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_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_eink5_v2"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_TTGO_T5V2_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_LATE_INITIALIZE=y
CONFIG_BOARD_LOOPSPERMSEC=16717
CONFIG_BUILTIN=y
CONFIG_ESP32_SPI3=y
CONFIG_ESP32_SPI3_MISOPIN=2
CONFIG_ESP32_UART0=y
CONFIG_EXAMPLES_FB=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_LCD_PORTRAIT=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_RAW_BINARY=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=24
CONFIG_START_MONTH=5
CONFIG_START_YEAR=2022
CONFIG_SYSTEM_NSH=y
CONFIG_UART0_SERIAL_CONSOLE=y

View File

@ -0,0 +1,85 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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_EINK_5_V2_INCLUDE_BOARD_H
#define __BOARDS_XTENSA_ESP32_TTGO_EINK_5_V2_INCLUDE_BOARD_H
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Clocking *****************************************************************/
/* The ESP32 Core board V2 is fitted with either a 26 a 40MHz crystal */
#ifdef CONFIG_ESP32_XTAL_26MHz
# define BOARD_XTAL_FREQUENCY 26000000
#else
# define BOARD_XTAL_FREQUENCY 40000000
#endif
/* Clock reconfiguration is currently disabled, so the CPU will be running
* at the XTAL frequency or at two times the XTAL frequency, depending upon
* how we load the code:
*
* - If we load the code into FLASH at address 0x1000 where it is started by
* the second level bootloader, then the frequency is the crystal
* frequency.
* - If we load the code into IRAM after the second level bootloader has run
* this frequency will be twice the crystal frequency.
*
* Don't ask me for an explanation.
*/
/* Note: The bootloader (esp-idf bootloader.bin) configures:
*
* - CPU frequency to 80MHz
* - The XTAL frequency according to the SDK config CONFIG_ESP32_XTAL_FREQ,
* which is 40MHz by default.
*
* Reference:
* https://github.com/espressif/esp-idf/blob
* /6fd855ab8d00d23bad4660216bc2122c2285d5be/components
* /bootloader_support/src/bootloader_clock.c#L38-L62
*/
#ifdef CONFIG_ESP32_RUN_IRAM
# define BOARD_CLOCK_FREQUENCY (2 * BOARD_XTAL_FREQUENCY)
#else
#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
#endif
/* 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_EINK_5_V2_INCLUDE_BOARD_H */

View File

@ -0,0 +1 @@
/esp32_out.ld

View File

@ -0,0 +1,84 @@
############################################################################
# boards/xtensa/esp32/ttgo_eink5_v2/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_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
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
LDSCRIPT_TEMPLATE = $(BOARD_COMMON_DIR)$(DELIM)scripts$(DELIM)esp32.template.ld
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)

View File

@ -0,0 +1,77 @@
############################################################################
# boards/xtensa/esp32/ttgo_eink5_v2/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_VIDEO_FB),y)
CSRCS += esp32_lcd_ssd1680.c
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)

View File

@ -0,0 +1,80 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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_eink5_v2.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 */

View File

@ -0,0 +1,96 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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_eink5_v2.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

View File

@ -0,0 +1,538 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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_VIDEO_FB) && defined(CONFIG_LCD_FRAMEBUFFER)
# include <nuttx/video/fb.h>
#endif
#if defined(CONFIG_ESP32_EFUSE)
# include <nuttx/efuse/efuse.h>
# include "esp32_efuse.h"
#endif
#include <nuttx/fs/fs.h>
#include <nuttx/himem/himem.h>
#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_WIRELESS
# 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_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_BACKPACK
# include "esp32_lcd_backpack.h"
#endif
#include "ttgo_eink5_v2.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 */
syslog(LOG_INFO, "Mounting /proc... ");
ret = nx_mount(NULL, "/proc", "procfs", 0, NULL);
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: Failed to mount procfs at /proc: %d\n", ret);
}
else
{
syslog(LOG_INFO, "OK\n");
}
#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_WIRELESS
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_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_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 defined(CONFIG_VIDEO_FB) && defined(CONFIG_LCD_FRAMEBUFFER)
syslog(LOG_INFO, "Bringing Up Frame buffer... ");
ret = fb_register(0, 0);
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: fb_register() failed: %d\n", ret);
}
else
{
syslog(LOG_INFO, "OK\n");
}
#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;
}

View File

@ -0,0 +1,168 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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_eink5_v2.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(BUTN1, INPUT_FUNCTION_3 | PULLUP);
esp32_configgpio(BUTN2, INPUT_FUNCTION_3 | PULLUP);
esp32_configgpio(BUTN3, 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

View File

@ -0,0 +1,391 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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_eink5_v2.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 15
/* Input pins. GPIO18 is used as an example, any other inputs could be
* used.
*/
#define GPIO_IN1 18
/* 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 */

View File

@ -0,0 +1,65 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/src/esp32_lcd_ssd1680.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/lcd/lcd.h>
#include <nuttx/lcd/ssd1680.h>
#include "esp32_ssd1680.h"
#include "ttgo_eink5_v2.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: board_lcd_getdev
****************************************************************************/
struct lcd_dev_s *board_lcd_getdev(int devno)
{
return board_ssd1680_getdev();
}
/****************************************************************************
* Name: board_lcd_uninitialize
****************************************************************************/
void board_lcd_uninitialize(void)
{
/* TO-FIX */
}

View File

@ -0,0 +1,134 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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;
}

View File

@ -0,0 +1,84 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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_eink5_v2.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(2);
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;
}

View File

@ -0,0 +1,87 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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 */

View File

@ -0,0 +1,93 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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 "arm_arch.h" */
#include "esp32_twai.h"
#include "ttgo_eink5_v2.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 */

View File

@ -0,0 +1,95 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/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_eink5_v2.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);
}
}

View File

@ -0,0 +1,152 @@
/****************************************************************************
* boards/xtensa/esp32/ttgo_eink5_v2/src/ttgo_eink5_v2.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_EINK5_V2_SRC_TTGO_EINK5_V2_H
#define __BOARDS_XTENSA_ESP32_TTGO_EINK5_V2_SRC_TTGO_EINK5_V2_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/compiler.h>
#include <stdint.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* ESP32-DevKitC GPIOs ******************************************************/
/* BOOT Button */
#define BUTN1 37
#define BUTN2 38
#define BUTN3 39
/* Sound PWM Out */
#define SND 25
/* E-INK SSD1680 Out */
/* LED
*
* This is an externally connected LED used for testing.
*/
#define GPIO_LED1 26
/* MCP2515 Interrupt pin */
#define GPIO_MCP2515_IRQ 22
/* 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_gpio_init
****************************************************************************/
#ifdef CONFIG_DEV_GPIO
int esp32_gpio_init(void);
#endif
/****************************************************************************
* Name: esp32_ledc_setup
*
* Description:
* Initialize LEDC PWM and register the PWM device.
*
****************************************************************************/
#ifdef CONFIG_ESP32_LEDC
int esp32_pwm_setup(void);
#endif
/****************************************************************************
* 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_EINK5_V2_SRC_TTGO_EINK5_V2_H*/