1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-01-17 04:52:59 +01:00

cpu/esp32: changes for ESP-IDF v4.4

This commit is contained in:
Gunar Schorcht 2022-02-01 22:11:43 +01:00
parent 61bf3d2384
commit e8b4a4feb2
5 changed files with 202 additions and 97 deletions

View File

@ -1,5 +1,5 @@
# Copyright (c) 2020 HAW Hamburg
# 2021 Gunar Schorcht
# 2022 Gunar Schorcht
#
# This file is subject to the terms and conditions of the GNU Lesser
# General Public License v2.1. See the file LICENSE in the top level
@ -20,17 +20,12 @@ config CPU_FAM_ESP32
select HAS_PUF_SRAM
select PACKAGE_ESP32_SDK if TEST_KCONFIG
select PACKAGE_ESP32_SDK_LIBS if TEST_KCONFIG
select MODULE_ESP_IDF_DRIVER if TEST_KCONFIG
select MODULE_ESP_IDF_ESP32 if TEST_KCONFIG
select MODULE_ESP_IDF_SOC if TEST_KCONFIG
select MODULE_PERIPH_RTT if HAS_PERIPH_RTT && MODULE_PM_LAYERED
select MODULE_RTT_RTC if HAS_PERIPH_RTT && MODULE_PERIPH_RTC
select MODULE_PS if MODULE_SHELL
select MODULE_PTHREAD if MODULE_CPP && TEST_KCONFIG
select MODULE_LIBC_GETTIMEOFDAY if TEST_KCONFIG
select MODULE_RTT_RTC if HAS_PERIPH_RTT && MODULE_PERIPH_RTC
select MODULE_PERIPH_RTT if HAS_PERIPH_RTT && MODULE_PM_LAYERED
select MODULE_PS if MODULE_SHELL
select MODULE_PTHREAD if MODULE_CPP
imply MODULE_NEWLIB_NANO
## CPU Models
@ -125,7 +120,11 @@ menu "ESP32 specific configurations"
config MODULE_ESP_SPI_RAM
bool "SPI RAM support"
depends on HAS_ESP_SPI_RAM
select MODULE_ESP_IDF_EFUSE
select MODULE_ESP_IDF_GPIO
select MODULE_ESP_IDF_HEAP
select MODULE_ESP_IDF_SPI_FLASH
select MODULE_ESP_IDF_SPI_RAM
help
Say y to use external SPI RAM connected through the FSPI interface.
@ -135,6 +134,7 @@ menu "ESP32 specific configurations"
endmenu
rsource "bootloader/Kconfig"
rsource "esp-idf/Kconfig"
rsource "periph/Kconfig"
rsource "vendor/esp-idf/Kconfig"
source "$(RIOTCPU)/esp_common/Kconfig"

View File

@ -6,7 +6,11 @@ SRC = irq_arch.c startup.c syscalls.c
# Add a list of subdirectories, that should also be built:
DIRS += $(RIOTCPU)/esp_common
DIRS += periph
DIRS += vendor
DIRS += esp-idf
ifneq (, $(filter esp_bootloader, $(USEMODULE)))
DIRS += bootloader
endif
ifneq (, $(filter esp_eth, $(USEMODULE)))
DIRS += esp-eth

View File

@ -3,11 +3,9 @@
include $(RIOTCPU)/esp_common/Makefile.dep
USEPKG += esp32_sdk
USEPKG += esp32_sdk_libs
USEMODULE += esp_idf_driver
USEMODULE += esp_idf_esp32
USEMODULE += esp_idf_soc
USEMODULE += esp_idf_common
USEMODULE += esp_bootloader
ifneq (,$(filter newlib,$(USEMODULE)))
DEFAULT_MODULE += newlib_nano
@ -18,28 +16,38 @@ ifneq (,$(filter cpp,$(USEMODULE)))
endif
ifneq (,$(filter esp_eth,$(USEMODULE)))
USEMODULE += esp_freertos
USEMODULE += esp_idf_efuse
USEMODULE += esp_idf_eth
USEMODULE += esp_idf_eth_phy
USEMODULE += esp_idf_event
USEMODULE += esp_idf_gpio
USEMODULE += esp_idf_spi_flash
USEMODULE += netdev_eth
USEMODULE += netopt
USEMODULE += ztimer_msec
endif
ifneq (,$(filter esp_wifi_any,$(USEMODULE)))
# add additional modules used for any WiFi interface
USEMODULE += esp_freertos
# add additional modules and packages used for any WiFi interface
USEPKG += esp32_sdk_lib_phy
USEPKG += esp32_sdk_lib_wifi
USEMODULE += esp_idf_efuse
USEMODULE += esp_idf_event
USEMODULE += esp_idf_heap
USEMODULE += esp_idf_nvs_flash
USEMODULE += esp_idf_wpa_supplicant_crypto
USEMODULE += esp_idf_wpa_supplicant_port
USEMODULE += esp_idf_spi_flash
USEMODULE += esp_idf_wifi
USEMODULE += esp_idf_wpa_supplicant
USEMODULE += pthread
endif
ifneq (,$(filter esp_wifi_enterprise,$(USEMODULE)))
# add additional modules used for WPA2 Enterprise mode
USEMODULE += esp_idf_wpa_supplicant_wpa2_eap_peer
USEMODULE += esp_idf_wpa_supplicant_wpa2_tls
USEMODULE += esp_idf_wpa_supplicant_wpa2_utils
ifneq (,$(filter esp_idf_heap,$(USEMODULE)))
# The ESP-IDF heap component uses the TLSF implementation that is part of
# the component. To avoid conflicts with modules and packages that use the
# RIOT package `tlsf`, this package is also used for the ESP-IDF heap instead
# of its own implementation. There does not seem to be any differences in
# the implementations of TLSF with the exception of heap poisoning, which
# is not configured.
USEPKG += tlsf
endif
ifneq (,$(filter esp_idf_nvs_flash,$(USEMODULE)))
@ -74,13 +82,13 @@ ifneq (,$(filter periph_i2c,$(USEMODULE)))
endif
endif
ifneq (,$(filter esp_now esp_wifi esp_spi_ram,$(USEMODULE)))
# the ESP-IDF heap has to be used if SPI RAM is used
USEMODULE += esp_idf_heap
endif
ifneq (,$(filter esp_spi_ram,$(USEMODULE)))
FEATURES_REQUIRED += esp_spi_ram
USEMODULE += esp_idf_efuse
USEMODULE += esp_idf_gpio
USEMODULE += esp_idf_heap
USEMODULE += esp_idf_spi_flash
USEMODULE += esp_idf_spi_ram
endif
ifneq (,$(filter mtd,$(USEMODULE)))

View File

@ -1,5 +1,5 @@
# ESP32 specific flashing options
FLASH_CHIP = esp32
FLASH_CHIP = $(CPU)
FLASH_MODE ?= dout
FLASH_FREQ = 40m # DO NOT CHANGE
FLASH_SIZE ?= 4
@ -11,9 +11,12 @@ include $(RIOTCPU)/esp_common/Makefile.include
# regular Makefile
TARGET_ARCH_ESP32 ?= xtensa-esp32-elf
TARGET_ARCH ?= $(TARGET_ARCH_ESP32)
TARGET_ARCH_$(CPU) ?= xtensa-$(CPU)-elf
TARGET_ARCH ?= $(TARGET_ARCH_$(CPU))
CPU_UC = $(shell echo '$(CPU)' | tr '[:lower:]' '[:upper:]')
PSEUDOMODULES += esp_bootloader
PSEUDOMODULES += esp_gdbstub
PSEUDOMODULES += esp_hw_counter
PSEUDOMODULES += esp_i2c_hw
@ -22,34 +25,94 @@ PSEUDOMODULES += esp_rtc_timer_32k
PSEUDOMODULES += esp_spi_ram
PSEUDOMODULES += esp_wifi_enterprise
INCLUDES += -I$(RIOTCPU)/$(CPU)/vendor/
INCLUDES += -I$(RIOTCPU)/$(CPU)/vendor/esp-idf/include
INCLUDES += -I$(RIOTCPU)/$(CPU)/vendor/esp-idf/include/esp32
INCLUDES += -I$(RIOTCPU)/$(CPU)/vendor/esp-idf/include/heap
INCLUDES += -I$(RIOTCPU)/$(CPU)/vendor/esp-idf/include/spi_flash
INCLUDES += -I$(RIOTCPU)/$(CPU)/vendor/esp-idf/include/tcpip_adapter
INCLUDES += -I$(RIOTCPU)/$(CPU)
INCLUDES += -I$(RIOTCPU)/$(CPU)/esp-idf/include
INCLUDES += -I$(RIOTCPU)/$(CPU)/esp-idf/include/log
INCLUDES += -I$(ESP32_SDK_DIR)/components/
INCLUDES += -I$(ESP32_SDK_DIR)/components/driver/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_common/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_hw_support/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_hw_support/include/soc
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_rom/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_rom/include/$(CPU)
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_timer/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/hal/$(CPU)/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/hal/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/heap/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/log/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/newlib/platform_include
INCLUDES += -I$(ESP32_SDK_DIR)/components/soc/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/soc/$(CPU)/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/xtensa/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/xtensa/$(CPU)/include
ifneq (,$(filter esp_spi_ram,$(USEMODULE)))
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_hw_support/include/soc/$(CPU)
endif
ifneq (,$(filter esp_idf_spi_flash,$(USEMODULE)))
INCLUDES += -I$(ESP32_SDK_DIR)/components/bootloader_support/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/spi_flash/include
endif
ifneq (,$(filter esp_wifi_any,$(USEMODULE)))
INCLUDES += -I$(ESP32_SDK_DIR)/components/bootloader_support/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_eth/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_event/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_netif/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_system/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_wifi/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/nvs_flash/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/spi_flash/include
endif
ifneq (,$(filter esp_wifi_enterprise,$(USEMODULE)))
INCLUDES += -I$(ESP32_SDK_DIR)/components/wpa_supplicant/esp_supplicant/include
endif
ifneq (,$(filter esp_eth,$(USEMODULE)))
INCLUDES += -I$(RIOTCPU)/$(CPU)/esp-eth
INCLUDES += -I$(RIOTCPU)/$(CPU)/vendor/esp-idf/include/ethernet
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_eth/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_event/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_netif/include
INCLUDES += -I$(ESP32_SDK_DIR)/components/esp_wifi/include
endif
CFLAGS += -DSDK_NOT_USED -DCONFIG_FREERTOS_UNICORE=1 -DESP_PLATFORM
# we use ESP32 only in single core mode
CFLAGS += -DCONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
CFLAGS += -DCONFIG_FREERTOS_UNICORE
# other ESP-IDF configurations
CFLAGS += -DCONFIG_IDF_TARGET_$(CPU_UC)
CFLAGS += -DESP_PLATFORM
CFLAGS += -DLOG_TAG_IN_BRACKETS
# shortcuts used by ESP-IDF
CFLAGS += -Dasm=__asm
CFLAGS += -Dtypeof=__typeof__
CFLAGS += -D_CONST=const
LINKFLAGS += -L$(ESP32_SDK_DIR)/components/xtensa/$(CPU)
ARCHIVES += -lxt_hal
LINKFLAGS += -L$(RIOTCPU)/$(CPU)/ld/
LINKFLAGS += -T$(RIOTCPU)/$(CPU)/ld/esp32.ld
LINKFLAGS += -T$(RIOTCPU)/$(CPU)/ld/esp32.common.ld
LINKFLAGS += -T$(RIOTCPU)/$(CPU)/ld/esp32.peripherals.ld
LINKFLAGS += -T$(RIOTCPU)/$(CPU)/ld/esp32.rom.ld
LINKFLAGS += -T$(RIOTCPU)/$(CPU)/ld/esp32.rom.nanofmt.ld
LINKFLAGS += -T$(ESP32_SDK_DIR)/components/soc/$(CPU)/ld/$(CPU).peripherals.ld
LINKFLAGS += -T$(ESP32_SDK_DIR)/components/esp_rom/$(CPU)/ld/$(CPU).rom.api.ld
LINKFLAGS += -T$(ESP32_SDK_DIR)/components/esp_rom/$(CPU)/ld/$(CPU).rom.ld
LINKFLAGS += -T$(ESP32_SDK_DIR)/components/esp_rom/$(CPU)/ld/$(CPU).rom.newlib-data.ld
LINKFLAGS += -T$(ESP32_SDK_DIR)/components/esp_rom/$(CPU)/ld/$(CPU).rom.newlib-funcs.ld
LINKFLAGS += -T$(ESP32_SDK_DIR)/components/esp_rom/$(CPU)/ld/$(CPU).rom.newlib-time.ld
LINKFLAGS += -T$(ESP32_SDK_DIR)/components/esp_rom/$(CPU)/ld/$(CPU).rom.spiflash.ld
LINKFLAGS += -T$(ESP32_SDK_DIR)/components/esp_rom/$(CPU)/ld/$(CPU).rom.redefined.ld
LINKFLAGS += -T$(RIOTCPU)/$(CPU)/ld/memory.ld
LINKFLAGS += -T$(RIOTCPU)/$(CPU)/ld/sections.ld
LINKFLAGS += -nostdlib -lgcc -Wl,-gc-sections
# Libraries needed when using esp_wifi_any pseudomodule
ifneq (,$(filter esp_wifi_any,$(USEMODULE)))
ARCHIVES += -lcore -lrtc -lnet80211 -lpp -lcoexist -lwps -lwpa -lwpa2
LINKFLAGS += -L$(ESP32_SDK_LIB_WIFI_DIR)/$(CPU)
LINKFLAGS += -L$(ESP32_SDK_LIB_PHY_DIR)/$(CPU)
ARCHIVES += -lcore -lrtc -lnet80211 -lpp -lcoexist
ARCHIVES += -lphy -lstdc++
endif
@ -62,11 +125,16 @@ ifneq (,$(filter cpp,$(USEMODULE)))
ARCHIVES += -lstdc++
endif
ifneq (,$(filter esp_bootloader,$(USEMODULE)))
# Bootloader file used by esptool.inc.mk
BOOTLOADER_BIN ?= $(BINDIR)/esp_bootloader/bootloader.bin
endif
ifneq (,$(filter esp_jtag,$(USEMODULE)))
PROGRAMMERS_SUPPORTED += openocd
PARTITION_POS = 0x8000
OPENOCD_PRE_FLASH_CMDS = -c 'echo "Installing Bootloader at $(BOOTLOADER_POS)"' \
-c 'flash write_image erase "$(RIOTCPU)/$(CPU)/bin/bootloader.bin" $(BOOTLOADER_POS) bin' \
-c 'flash write_image erase "$(BOOTLOADER_BIN)" $(BOOTLOADER_POS) bin' \
-c 'echo "Installing partition table at $(PARTITION_POS)"' \
-c 'flash write_image erase "$(BINDIR)/partitions.bin" $(PARTITION_POS) bin'
IMAGE_OFFSET = 0x10000
@ -75,3 +143,5 @@ ifneq (,$(filter esp_jtag,$(USEMODULE)))
# Without resets debug target fails with 'Target not examined yet'
OPENOCD_DBG_EXTRA_CMD += -c 'reset halt'
endif
$(BOOTLOADER_BIN):

View File

@ -24,27 +24,31 @@
#include <string.h>
#include <sys/reent.h>
#include "macros/units.h"
/* RIOT headers have to be included before ESP-IDF headers! */
#include "board.h"
#include "esp_attr.h"
#include "esp/common_macros.h"
#include "exceptions.h"
#include "irq_arch.h"
#include "kernel_defines.h"
#include "kernel_init.h"
#include "log.h"
#include "periph_cpu.h"
#include "stdio_base.h"
#include "syscalls.h"
#include "thread_arch.h"
#include "tools.h"
#include "periph/cpuid.h"
#include "periph/init.h"
#include "periph/rtc.h"
/* ESP-IDF headers */
#include "driver/periph_ctrl.h"
#include "esp/common_macros.h"
#include "esp32/esp_sleep.h"
#include "heap/esp_heap_caps_init.h"
#include "log/esp_log.h"
#include "esp_attr.h"
#include "esp_heap_caps_init.h"
#include "esp_log.h"
#include "esp_sleep.h"
#include "esp_timer.h"
#include "rom/cache.h"
#include "rom/ets_sys.h"
#include "rom/rtc.h"
@ -60,14 +64,15 @@
#include "xtensa/core-macros.h"
#include "xtensa/xtensa_api.h"
#include "periph_cpu.h"
#include "tools.h"
#if IS_USED(MODULE_ESP_SPI_RAM)
#include "spiram.h"
#endif
#ifdef MODULE_PUF_SRAM
#if IS_USED(MODULE_PUF_SRAM)
#include "puf_sram.h"
#endif
#ifdef MODULE_STDIO_UART
#if IS_USED(MODULE_STDIO_UART)
#include "stdio_uart.h"
#endif
@ -77,7 +82,7 @@
#define STRINGIFY(s) STRINGIFY2(s)
#define STRINGIFY2(s) #s
#if MODULE_ESP_LOG_STARTUP
#if IS_USED(MODULE_ESP_LOG_STARTUP)
#define LOG_STARTUP(format, ...) LOG_TAG_EARLY(LOG_INFO, D, __func__, format, ##__VA_ARGS__)
#else
#define LOG_STARTUP(format, ...)
@ -93,24 +98,35 @@ extern uint8_t _rtc_bss_start;
extern uint8_t _rtc_bss_end;
extern uint8_t _rtc_bss_rtc_start;
extern uint8_t _rtc_bss_rtc_end;
extern uint8_t _init_start;
extern uint8_t _iram_start;
/* external esp function declarations */
extern void esp_clk_init(void);
extern void esp_perip_clk_init(void);
extern void esp_reent_init(struct _reent* r);
extern void esp_panic_wdt_stop (void);
extern void spi_ram_init(void);
extern void spi_ram_heap_init(void);
extern uint32_t hwrand (void);
extern void bootloader_clock_configure(void);
/* external RTC function declarations since they are not declared in headers */
/* components/esp_hw_support/include/esp_private/esp_clk.h */
extern int esp_clk_apb_freq(void);
extern int esp_clk_cpu_freq(void);
extern int esp_clk_xtal_freq(void);
extern uint32_t esp_clk_slowclk_cal_get(void);
/* components/esp_hw_support/include/soc/esp32/rtc.h */
extern uint64_t esp_rtc_get_time_us(void);
/* components/esp_system/port/include/esp_clk_internal.h */
extern void IRAM_ATTR rtc_clk_select_rtc_slow_clk(rtc_slow_freq_t slow_clk);
/* forward declarations */
static void system_init(void);
static void intr_matrix_clear(void);
typedef int32_t esp_err_t;
uint64_t g_startup_time = 0;
/**
* @brief CPU startup function
*
@ -121,16 +137,16 @@ NORETURN void IRAM call_start_cpu0 (void)
{
register uint32_t *sp __asm__ ("a1"); (void)sp;
cpu_configure_region_protection();
esp_cpu_configure_region_protection();
/* move exception vectors to IRAM */
asm volatile ("wsr %0, vecbase\n" ::"r"(&_init_start));
asm volatile ("wsr %0, vecbase\n" ::"r"(&_iram_start));
RESET_REASON reset_reason = rtc_get_reset_reason(PRO_CPU_NUM);
/* reset from panic handler by RWDT or TG0WDT */
if (reset_reason == RTCWDT_SYS_RESET || reset_reason == TG0WDT_SYS_RESET) {
esp_panic_wdt_stop();
/* TODO esp_panic_wdt_stop was called here in former versions */
}
#ifdef MODULE_PUF_SRAM
@ -157,7 +173,7 @@ NORETURN void IRAM call_start_cpu0 (void)
uint8_t cpu_id[CPUID_LEN];
cpuid_get ((void*)cpu_id);
#ifdef MODULE_ESP_LOG_STARTUP
#if IS_USED(MODULE_ESP_LOG_STARTUP)
ets_printf("\n");
LOG_STARTUP("Starting ESP32 with ID: ");
for (unsigned i = 0; i < CPUID_LEN; i++) {
@ -177,8 +193,8 @@ NORETURN void IRAM call_start_cpu0 (void)
}
LOG_STARTUP("Current clocks in Hz: CPU=%d APB=%d XTAL=%d SLOW=%d\n",
rtc_clk_cpu_freq_value(rtc_clk_cpu_freq_get()),
rtc_clk_apb_freq_get(), MHZ(rtc_clk_xtal_freq_get()),
esp_clk_cpu_freq(),
esp_clk_apb_freq(), esp_clk_xtal_freq(),
rtc_clk_slow_freq_get_hz());
if (IS_ACTIVE(ENABLE_DEBUG)) {
@ -207,9 +223,12 @@ NORETURN void IRAM call_start_cpu0 (void)
}
/* init SPI RAM if enabled */
#if CONFIG_SPIRAM_SUPPORT && CONFIG_SPIRAM_BOOT_INIT
spi_ram_init();
#endif
#if CONFIG_SPIRAM_SUPPORT && CONFIG_SPIRAM_BOOT_INIT
if (esp_spiram_init() != ESP_OK) {
LOG_STARTUP("Failed to initialize SPI RAM\n");
exit(1);
}
#endif
LOG_STARTUP("PRO cpu starts user code\n");
system_init();
@ -217,12 +236,6 @@ NORETURN void IRAM call_start_cpu0 (void)
UNREACHABLE();
}
#define RTC_FAST_FREQ_8M_MHZ 8000000
#define rtc_select_slow_clk select_rtc_slow_clk
extern uint32_t esp_clk_slowclk_cal_get(void);
extern void IRAM_ATTR rtc_select_slow_clk(rtc_slow_freq_t slow_clk);
static void IRAM system_clk_init (void)
{
/* first initialize RTC with default configuration */
@ -238,13 +251,13 @@ static void IRAM system_clk_init (void)
/* set FAST_CLK to internal low power clock of 8 MHz */
rtc_clk_fast_freq_set(RTC_FAST_FREQ_8M);
#if MODULE_ESP_RTC_TIMER_32K
#if IS_USED(MODULE_ESP_RTC_TIMER_32K)
/* set SLOW_CLK to external 32.768 kHz crystal clock */
rtc_select_slow_clk(RTC_SLOW_FREQ_32K_XTAL);
rtc_clk_select_rtc_slow_clk(RTC_SLOW_FREQ_32K_XTAL);
#else
/* set SLOW_CLK to internal low power clock of 150 kHz */
rtc_clk_32k_enable(false);
rtc_select_slow_clk(RTC_SLOW_FREQ_RTC);
rtc_clk_select_rtc_slow_clk(RTC_SLOW_FREQ_RTC);
#endif
LOG_STARTUP("Switching system clocks can lead to some unreadable characters\n");
@ -267,11 +280,14 @@ static void IRAM system_clk_init (void)
set to 2 MHz and handled later */
}
uint32_t freq_before = rtc_clk_cpu_freq_value(rtc_clk_cpu_freq_get()) / MHZ(1);
uint32_t freq_before = esp_clk_cpu_freq() / MHZ;
if (freq_before != CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ) {
rtc_cpu_freq_config_t clk_cfg;
rtc_clk_cpu_freq_to_config(freq, &clk_cfg);
/* set configured CPU frequency */
rtc_clk_cpu_freq_set(freq);
rtc_clk_cpu_freq_set_config(&clk_cfg);
/* Recalculate the ccount to make time calculation correct. */
uint32_t freq_after = CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ;
@ -294,6 +310,7 @@ static NORETURN void IRAM system_init (void)
/* disable clocks of peripherals that are not needed at startup */
esp_perip_clk_init();
g_startup_time = esp_rtc_get_time_us();
/* set configured console UART baudrate */
const int uart_clk_freq = rtc_clk_apb_freq_get();
@ -328,15 +345,18 @@ static NORETURN void IRAM system_init (void)
srand(hwrand());
/* add SPI RAM to heap if enabled */
#if CONFIG_SPIRAM_SUPPORT && CONFIG_SPIRAM_BOOT_INIT
spi_ram_heap_init();
#endif
#if CONFIG_SPIRAM_SUPPORT && CONFIG_SPIRAM_BOOT_INIT
esp_spiram_init_cache();
esp_spiram_add_to_heapalloc();
#endif
/* print some infos */
LOG_STARTUP("Used clocks in Hz: CPU=%d APB=%d XTAL=%d FAST=%d SLOW=%d\n",
rtc_clk_cpu_freq_value(rtc_clk_cpu_freq_get()),
rtc_clk_apb_freq_get(), MHZ(rtc_clk_xtal_freq_get()),
RTC_FAST_FREQ_8M_MHZ, rtc_clk_slow_freq_get_hz());
esp_clk_cpu_freq(),
esp_clk_apb_freq(), esp_clk_xtal_freq(),
rtc_clk_fast_freq_get() == RTC_FAST_FREQ_8M ? 8 * MHZ
: esp_clk_xtal_freq()/4,
rtc_clk_slow_freq_get_hz());
LOG_STARTUP("XTAL calibration value: %d\n", esp_clk_slowclk_cal_get());
LOG_STARTUP("Heap free: %u bytes\n", get_free_heap_size());
uart_tx_wait_idle(CONFIG_CONSOLE_UART_NUM);
@ -352,7 +372,7 @@ static NORETURN void IRAM system_init (void)
periph_init();
/* print system time */
#ifdef MODULE_PERIPH_RTC
#if IS_USED(MODULE_PERIPH_RTC)
struct tm _sys_time;
rtc_get_time(&_sys_time);
LOG_STARTUP("System time: %04d-%02d-%02d %02d:%02d:%02d\n",
@ -361,15 +381,15 @@ static NORETURN void IRAM system_init (void)
#endif
/* print the board config */
#ifdef MODULE_ESP_LOG_STARTUP
#if IS_USED(MODULE_ESP_LOG_STARTUP)
print_board_config();
#endif
#if MODULE_MTD
#if IS_USED(MODULE_MTD)
/* init flash drive */
extern void spi_flash_drive_init (void);
spi_flash_drive_init();
#endif
#endif
/* initialize the board */
extern void board_init(void);
@ -385,8 +405,11 @@ static NORETURN void IRAM system_init (void)
extern void esp_event_handler_init(void);
esp_event_handler_init();
/* initialize ESP-IDF timer task */
esp_timer_init();
/* starting RIOT */
#ifdef MODULE_ESP_LOG_STARTUP
#if IS_USED(MODULE_ESP_LOG_STARTUP)
LOG_STARTUP("Starting RIOT kernel on PRO cpu\n");
uart_tx_wait_idle(CONFIG_CONSOLE_UART_NUM);
#else