diff --git a/components/driver/CMakeLists.txt b/components/driver/CMakeLists.txt index 4671b23e7c..849312ab7f 100644 --- a/components/driver/CMakeLists.txt +++ b/components/driver/CMakeLists.txt @@ -3,23 +3,19 @@ idf_build_get_property(target IDF_TARGET) set(srcs "gpio.c" "i2c.c" - "i2s.c" "ledc.c" "pcnt.c" "periph_ctrl.c" - "rmt.c" "rtc_io.c" "rtc_module.c" "sdspi_crc.c" "sdspi_host.c" "sdspi_transaction.c" - "sigmadelta.c" "spi_common.c" "spi_master.c" "spi_slave.c" "spi_bus_lock.c" "timer.c" - "twai.c" "uart.c") set(includes "include" "${target}/include") @@ -31,11 +27,15 @@ if(${target} STREQUAL "esp32") "mcpwm.c" "sdio_slave.c" "sdmmc_host.c" + "i2s.c" + "rmt.c" + "sigmadelta.c" "sdmmc_transaction.c" "touch_sensor_common.c" "esp32/touch_sensor.c" "esp32/adc.c" - "esp32/dac.c") + "esp32/dac.c" + "twai.c") endif() if(IDF_TARGET STREQUAL "esp32s2") @@ -44,6 +44,10 @@ if(IDF_TARGET STREQUAL "esp32s2") "dedic_gpio.c" "spi_slave_hd.c" "touch_sensor_common.c" + "sigmadelta.c" + "i2s.c" + "rmt.c" + "twai.c" "esp32s2/rtc_tempsensor.c" "esp32s2/touch_sensor.c" "esp32s2/adc.c" @@ -58,11 +62,14 @@ if(${target} STREQUAL "esp32s3") "sdmmc_host.c" "sdmmc_transaction.c" "mcpwm.c" + "rmt.c" + "sigmadelta.c" "usb_serial_jtag.c" "spi_slave_hd.c" "touch_sensor_common.c" "esp32s3/touch_sensor.c" - ) + "i2s.c" + "twai.c") endif() if(IDF_TARGET STREQUAL "esp32c3") @@ -71,9 +78,13 @@ if(IDF_TARGET STREQUAL "esp32c3") "adc_common.c" "dedic_gpio.c" "usb_serial_jtag.c" + "i2s.c" + "rmt.c" + "sigmadelta.c" "esp32c3/adc.c" "esp32c3/adc2_init_cal.c" - "esp32c3/rtc_tempsensor.c") + "esp32c3/rtc_tempsensor.c" + "twai.c") endif() if(IDF_TARGET STREQUAL "esp32h2") @@ -81,9 +92,16 @@ if(IDF_TARGET STREQUAL "esp32h2") "spi_slave_hd.c" "adc_common.c" "dedic_gpio.c" + "i2s.c" + "rmt.c" + "sigmadelta.c" "esp32h2/adc.c" - "esp32h2/adc2_init_cal.c" - "esp32h2/rtc_tempsensor.c") + "esp32h2/rtc_tempsensor.c" + "twai.c") +endif() + +if(IDF_TARGET STREQUAL "esp8684") + list(APPEND srcs "spi_slave_hd.c") endif() idf_component_register(SRCS "${srcs}" diff --git a/components/driver/esp8684/include/driver/adc.h b/components/driver/esp8684/include/driver/adc.h new file mode 100644 index 0000000000..7567c7b2a1 --- /dev/null +++ b/components/driver/esp8684/include/driver/adc.h @@ -0,0 +1,93 @@ +/* + * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "driver/adc_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*--------------------------------------------------------------- + Common setting +---------------------------------------------------------------*/ +/*************************************/ +/* Digital controller filter setting */ +/*************************************/ +/** + * @brief Reset adc digital controller filter. + * + * @param idx Filter index. + * + * @return + * - ESP_OK Success + */ +esp_err_t adc_digi_filter_reset(adc_digi_filter_idx_t idx); + +/** + * @brief Set adc digital controller filter configuration. + * + * @param idx Filter index. + * @param config See ``adc_digi_filter_t``. + * + * @return + * - ESP_OK Success + */ +esp_err_t adc_digi_filter_set_config(adc_digi_filter_idx_t idx, adc_digi_filter_t *config); + +/** + * @brief Get adc digital controller filter configuration. + * + * @param idx Filter index. + * @param config See ``adc_digi_filter_t``. + * + * @return + * - ESP_OK Success + */ +esp_err_t adc_digi_filter_get_config(adc_digi_filter_idx_t idx, adc_digi_filter_t *config); + +/** + * @brief Enable/disable adc digital controller filter. + * Filtering the ADC data to obtain smooth data at higher sampling rates. + * + * @param idx Filter index. + * @param enable Enable/Disable filter. + * + * @return + * - ESP_OK Success + */ +esp_err_t adc_digi_filter_enable(adc_digi_filter_idx_t idx, bool enable); + +/**************************************/ +/* Digital controller monitor setting */ +/**************************************/ + +/** + * @brief Config monitor of adc digital controller. + * + * @param idx Monitor index. + * @param config See ``adc_digi_monitor_t``. + * + * @return + * - ESP_OK Success + */ +esp_err_t adc_digi_monitor_set_config(adc_digi_monitor_idx_t idx, adc_digi_monitor_t *config); + +/** + * @brief Enable/disable monitor of adc digital controller. + * + * @param idx Monitor index. + * @param enable True or false enable monitor. + * + * @return + * - ESP_OK Success + */ +esp_err_t adc_digi_monitor_enable(adc_digi_monitor_idx_t idx, bool enable); + +#ifdef __cplusplus +} +#endif diff --git a/components/driver/esp8684/include/driver/temp_sensor.h b/components/driver/esp8684/include/driver/temp_sensor.h new file mode 100644 index 0000000000..d5d3ee3dd2 --- /dev/null +++ b/components/driver/esp8684/include/driver/temp_sensor.h @@ -0,0 +1,92 @@ +/* + * SPDX-FileCopyrightText: 2010-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + TSENS_DAC_L0 = 0, /*!< offset = -2, measure range: 50℃ ~ 125℃, error < 3℃. */ + TSENS_DAC_L1, /*!< offset = -1, measure range: 20℃ ~ 100℃, error < 2℃. */ + TSENS_DAC_L2, /*!< offset = 0, measure range:-10℃ ~ 80℃, error < 1℃. */ + TSENS_DAC_L3, /*!< offset = 1, measure range:-30℃ ~ 50℃, error < 2℃. */ + TSENS_DAC_L4, /*!< offset = 2, measure range:-40℃ ~ 20℃, error < 3℃. */ + TSENS_DAC_MAX, + TSENS_DAC_DEFAULT = TSENS_DAC_L2, +} temp_sensor_dac_offset_t; + +/** + * @brief Configuration for temperature sensor reading + */ +typedef struct { + temp_sensor_dac_offset_t dac_offset; /*!< The temperature measurement range is configured with a built-in temperature offset DAC. */ + uint8_t clk_div; /*!< Default: 6 */ +} temp_sensor_config_t; + +#define TSENS_CONFIG_DEFAULT() {.dac_offset = TSENS_DAC_L2, \ + .clk_div = 6} + +/** + * @brief Set parameter of temperature sensor. + * @param tsens + * @return + * - ESP_OK Success + */ +esp_err_t temp_sensor_set_config(temp_sensor_config_t tsens); + +/** + * @brief Get parameter of temperature sensor. + * @param tsens + * @return + * - ESP_OK Success + */ +esp_err_t temp_sensor_get_config(temp_sensor_config_t *tsens); + +/** + * @brief Start temperature sensor measure. + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE if temperature sensor is started already. + */ +esp_err_t temp_sensor_start(void); + +/** + * @brief Stop temperature sensor measure. + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_STATE if temperature sensor is stopped already. + */ +esp_err_t temp_sensor_stop(void); + +/** + * @brief Read temperature sensor raw data. + * @param tsens_out Pointer to raw data, Range: 0 ~ 255 + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG `tsens_out` is NULL + * - ESP_ERR_INVALID_STATE temperature sensor dont start + */ +esp_err_t temp_sensor_read_raw(uint32_t *tsens_out); + +/** + * @brief Read temperature sensor data that is converted to degrees Celsius. + * @note Should not be called from interrupt. + * @param celsius The measure output value. + * @return + * - ESP_OK Success + * - ESP_ERR_INVALID_ARG ARG is NULL. + * - ESP_ERR_INVALID_STATE The ambient temperature is out of range. + */ +esp_err_t temp_sensor_read_celsius(float *celsius); + +#ifdef __cplusplus +} +#endif diff --git a/components/driver/include/driver/adc2_wifi_private.h b/components/driver/include/driver/adc2_wifi_private.h index f8b355196b..7330ab1b8e 100644 --- a/components/driver/include/driver/adc2_wifi_private.h +++ b/components/driver/include/driver/adc2_wifi_private.h @@ -11,6 +11,7 @@ extern "C" { #endif #include "esp_err.h" +#include "soc/soc_caps.h" /** * @brief For WIFI module to claim the usage of ADC2. @@ -35,7 +36,7 @@ esp_err_t adc2_wifi_acquire(void); */ esp_err_t adc2_wifi_release(void); -#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 +#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 /** * @brief This API help ADC2 calibration constructor be linked. * diff --git a/components/driver/include/driver/adc_common.h b/components/driver/include/driver/adc_common.h index 392eb8a15d..b6961b6006 100644 --- a/components/driver/include/driver/adc_common.h +++ b/components/driver/include/driver/adc_common.h @@ -45,7 +45,7 @@ typedef enum { ADC1_CHANNEL_9, /*!< ADC1 channel 9 is GPIO10 */ ADC1_CHANNEL_MAX, } adc1_channel_t; -#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 +#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP8684 /**** `adc1_channel_t` will be deprecated functions, combine into `adc_channel_t` ********/ typedef enum { ADC1_CHANNEL_0 = 0, /*!< ADC1 channel 0 is GPIO0 */ @@ -72,7 +72,7 @@ typedef enum { ADC2_CHANNEL_9, /*!< ADC2 channel 9 is GPIO26 (ESP32), GPIO20 (ESP32-S2) */ ADC2_CHANNEL_MAX, } adc2_channel_t; -#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 +#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP8684 /**** `adc2_channel_t` will be deprecated functions, combine into `adc_channel_t` ********/ typedef enum { ADC2_CHANNEL_0 = 0, /*!< ADC2 channel 0 is GPIO5 */ @@ -103,7 +103,7 @@ typedef enum { #define ADC_WIDTH_11Bit ADC_WIDTH_BIT_11 #define ADC_WIDTH_12Bit ADC_WIDTH_BIT_12 -#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP8684 /** * @brief Digital ADC DMA read max timeout value, it may make the ``adc_digi_read_bytes`` block forever if the OS supports */ @@ -121,7 +121,7 @@ typedef enum { ADC_ENCODE_MAX, } adc_i2s_encode_t; -#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP8684 //This feature is currently supported on ESP32C3, will be supported on other chips soon /** * @brief Digital ADC DMA configuration @@ -167,7 +167,7 @@ void adc_power_acquire(void); */ void adc_power_release(void); -#if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2 +#if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2 && !CONFIG_IDF_TARGET_ESP8684 /** * @brief Initialize ADC pad * @param adc_unit ADC unit index @@ -177,7 +177,7 @@ void adc_power_release(void); * - ESP_ERR_INVALID_ARG Parameter error */ esp_err_t adc_gpio_init(adc_unit_t adc_unit, adc_channel_t channel); -#endif //#if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2 +#endif //#if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2 && !CONFIG_IDF_TARGET_ESP8684 /*--------------------------------------------------------------- ADC Single Read Setting @@ -276,7 +276,7 @@ esp_err_t adc1_config_width(adc_bits_width_t width_bit); */ int adc1_get_raw(adc1_channel_t channel); -#if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2 +#if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2 && !CONFIG_IDF_TARGET_ESP8684 /** * @brief Set ADC data invert * @param adc_unit ADC unit index @@ -317,7 +317,7 @@ esp_err_t adc_set_data_width(adc_unit_t adc_unit, adc_bits_width_t width_bit); * to be called to configure ADC1 channels, before ADC1 is used by the ULP. */ void adc1_ulp_enable(void); -#endif //#if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2 +#endif //#if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2 && !CONFIG_IDF_TARGET_ESP8684 /** * @brief Get the GPIO number of a specific ADC2 channel. @@ -477,7 +477,7 @@ esp_err_t adc_digi_deinit(void); */ esp_err_t adc_digi_controller_config(const adc_digi_config_t *config); -#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP8684 //This feature is currently supported on ESP32C3, will be supported on other chips soon /*--------------------------------------------------------------- DMA setting @@ -537,7 +537,7 @@ esp_err_t adc_digi_read_bytes(uint8_t *buf, uint32_t length_max, uint32_t *out_l */ esp_err_t adc_digi_deinitialize(void); -#endif //#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 +#endif //#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP8684 #ifdef __cplusplus } diff --git a/components/driver/include/driver/gpio.h b/components/driver/include/driver/gpio.h index eeb63f74f8..f6249197eb 100644 --- a/components/driver/include/driver/gpio.h +++ b/components/driver/include/driver/gpio.h @@ -35,6 +35,8 @@ #include "esp32s3/rom/gpio.h" #elif CONFIG_IDF_TARGET_ESP32H2 #include "esp32h2/rom/gpio.h" +#elif CONFIG_IDF_TARGET_ESP8684 +#include "esp8684/rom/gpio.h" #endif #ifdef CONFIG_LEGACY_INCLUDE_COMMON_HEADERS diff --git a/components/driver/timer.c b/components/driver/timer.c index f0e58dd05d..fcf2d438f9 100644 --- a/components/driver/timer.c +++ b/components/driver/timer.c @@ -53,7 +53,7 @@ typedef struct { } timer_obj_t; static timer_obj_t *p_timer_obj[TIMER_GROUP_MAX][TIMER_MAX] = {0}; -static portMUX_TYPE timer_spinlock[TIMER_GROUP_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED}; +static portMUX_TYPE timer_spinlock[TIMER_GROUP_MAX] = { [0 ... TIMER_GROUP_MAX - 1] = portMUX_INITIALIZER_UNLOCKED, }; esp_err_t timer_get_counter_value(timer_group_t group_num, timer_idx_t timer_num, uint64_t *timer_val) { diff --git a/components/driver/uart.c b/components/driver/uart.c index 8bc55f25c9..2e9df759d9 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -35,6 +35,8 @@ #include "esp32c3/clk.h" #elif CONFIG_IDF_TARGET_ESP32H2 #include "esp32h2/clk.h" +#elif CONFIG_IDF_TARGET_ESP8684 +#include "esp_private/esp_clk.h" #endif #ifdef CONFIG_UART_ISR_IN_IRAM diff --git a/components/esp_pm/include/esp8684/pm.h b/components/esp_pm/include/esp8684/pm.h new file mode 100644 index 0000000000..1f3757c2c1 --- /dev/null +++ b/components/esp_pm/include/esp8684/pm.h @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + + +#pragma once +#include +#include +#include "esp_err.h" + +#include "soc/rtc.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * @brief Power management config for ESP8684 + * + * Pass a pointer to this structure as an argument to esp_pm_configure function. + */ +typedef struct { + int max_freq_mhz; /*!< Maximum CPU frequency, in MHz */ + int min_freq_mhz; /*!< Minimum CPU frequency to use when no locks are taken, in MHz */ + bool light_sleep_enable; /*!< Enter light sleep when no locks are taken */ +} esp_pm_config_esp8684_t; + + +#ifdef __cplusplus +} +#endif diff --git a/components/esp_pm/include/esp_pm.h b/components/esp_pm/include/esp_pm.h index 5bd2bd1b11..e9d9fbfb4b 100644 --- a/components/esp_pm/include/esp_pm.h +++ b/components/esp_pm/include/esp_pm.h @@ -1,16 +1,8 @@ -// Copyright 2016-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed 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. +/* + * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once #include @@ -27,6 +19,8 @@ #include "esp32c3/pm.h" #elif CONFIG_IDF_TARGET_ESP32H2 #include "esp32h2/pm.h" +#elif CONFIG_IDF_TARGET_ESP8684 +#include "esp8684/pm.h" #endif #ifdef __cplusplus diff --git a/components/esp_pm/pm_impl.c b/components/esp_pm/pm_impl.c index 76f6e6211a..ab16fdb576 100644 --- a/components/esp_pm/pm_impl.c +++ b/components/esp_pm/pm_impl.c @@ -56,6 +56,10 @@ #include "esp32h2/clk.h" #include "esp32h2/pm.h" #include "driver/gpio.h" +#elif CONFIG_IDF_TARGET_ESP8684 +#include "esp_private/esp_clk.h" +#include "esp8684/pm.h" +#include "driver/gpio.h" #endif #define MHZ (1000000) @@ -95,6 +99,9 @@ #elif CONFIG_IDF_TARGET_ESP32H2 #define REF_CLK_DIV_MIN 2 #define DEFAULT_CPU_FREQ CONFIG_ESP32H2_DEFAULT_CPU_FREQ_MHZ +#elif CONFIG_IDF_TARGET_ESP8684 +#define REF_CLK_DIV_MIN 2 +#define DEFAULT_CPU_FREQ CONFIG_ESP8684_DEFAULT_CPU_FREQ_MHZ #endif #ifdef CONFIG_PM_PROFILING @@ -229,6 +236,8 @@ esp_err_t esp_pm_configure(const void* vconfig) const esp_pm_config_esp32c3_t* config = (const esp_pm_config_esp32c3_t*) vconfig; #elif CONFIG_IDF_TARGET_ESP32H2 const esp_pm_config_esp32h2_t* config = (const esp_pm_config_esp32h2_t*) vconfig; +#elif CONFIG_IDF_TARGET_ESP8684 + const esp_pm_config_esp8684_t* config = (const esp_pm_config_esp8684_t*) vconfig; #endif #ifndef CONFIG_FREERTOS_USE_TICKLESS_IDLE @@ -337,6 +346,8 @@ esp_err_t esp_pm_get_configuration(void* vconfig) esp_pm_config_esp32c3_t* config = (esp_pm_config_esp32c3_t*) vconfig; #elif CONFIG_IDF_TARGET_ESP32H2 esp_pm_config_esp32h2_t* config = (esp_pm_config_esp32h2_t*) vconfig; +#elif CONFIG_IDF_TARGET_ESP8684 + esp_pm_config_esp8684_t* config = (esp_pm_config_esp8684_t*) vconfig; #endif portENTER_CRITICAL(&s_switch_lock); @@ -766,6 +777,8 @@ void esp_pm_impl_init(void) esp_pm_config_esp32c3_t cfg = { #elif CONFIG_IDF_TARGET_ESP32H2 esp_pm_config_esp32h2_t cfg = { +#elif CONFIG_IDF_TARGET_ESP8684 + esp_pm_config_esp8684_t cfg = { #endif .max_freq_mhz = DEFAULT_CPU_FREQ, .min_freq_mhz = xtal_freq, diff --git a/components/esp_pm/pm_trace.c b/components/esp_pm/pm_trace.c index 1da9c93f55..f3b2d10e22 100644 --- a/components/esp_pm/pm_trace.c +++ b/components/esp_pm/pm_trace.c @@ -1,16 +1,8 @@ -// Copyright 2016-2017 Espressif Systems (Shanghai) PTE LTD -// -// Licensed 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. +/* + * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include "esp_private/pm_trace.h" @@ -21,7 +13,7 @@ * Feel free to change when debugging. */ static const int DRAM_ATTR s_trace_io[] = { -#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32H2) +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP8684) BIT(4), BIT(5), // ESP_PM_TRACE_IDLE BIT(16), BIT(17), // ESP_PM_TRACE_TICK BIT(18), BIT(18), // ESP_PM_TRACE_FREQ_SWITCH diff --git a/components/heap/CMakeLists.txt b/components/heap/CMakeLists.txt index 40f75860a8..d22fbaaacd 100644 --- a/components/heap/CMakeLists.txt +++ b/components/heap/CMakeLists.txt @@ -20,8 +20,11 @@ if(CONFIG_HEAP_TRACING_STANDALONE) endif() # Add SoC memory layout to the sources -list(APPEND srcs "port/memory_layout_utils.c") -list(APPEND srcs "port/${target}/memory_layout.c") + +if(NOT BOOTLOADER_BUILD) + list(APPEND srcs "port/memory_layout_utils.c") + list(APPEND srcs "port/${target}/memory_layout.c") +endif() idf_component_register(SRCS "${srcs}" diff --git a/components/heap/port/esp32/memory_layout.c b/components/heap/port/esp32/memory_layout.c index d956e5b2b8..633df2c091 100644 --- a/components/heap/port/esp32/memory_layout.c +++ b/components/heap/port/esp32/memory_layout.c @@ -3,7 +3,6 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#ifndef BOOTLOADER_BUILD #include #include @@ -189,5 +188,3 @@ SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_noinit_end, rtcram_d SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_force_fast_end, rtcram_data); #endif #endif - -#endif /* BOOTLOADER_BUILD */ diff --git a/components/heap/port/esp32c3/memory_layout.c b/components/heap/port/esp32c3/memory_layout.c index 4943913f3f..8dac89f96f 100644 --- a/components/heap/port/esp32c3/memory_layout.c +++ b/components/heap/port/esp32c3/memory_layout.c @@ -3,7 +3,6 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#ifndef BOOTLOADER_BUILD #include #include @@ -87,5 +86,3 @@ SOC_RESERVE_MEMORY_REGION((intptr_t)&_iram_start - I_D_OFFSET, (intptr_t)&_iram_ */ SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_force_slow_end, rtcram_data); #endif - -#endif // BOOTLOADER_BUILD diff --git a/components/heap/port/esp32h2/memory_layout.c b/components/heap/port/esp32h2/memory_layout.c index b7e1e50843..abf1efaa09 100644 --- a/components/heap/port/esp32h2/memory_layout.c +++ b/components/heap/port/esp32h2/memory_layout.c @@ -3,7 +3,6 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#ifndef BOOTLOADER_BUILD #include #include @@ -87,5 +86,3 @@ SOC_RESERVE_MEMORY_REGION((intptr_t)&_iram_start - I_D_OFFSET, (intptr_t)&_iram_ */ SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_force_slow_end, rtcram_data); #endif - -#endif // BOOTLOADER_BUILD diff --git a/components/heap/port/esp32s2/memory_layout.c b/components/heap/port/esp32s2/memory_layout.c index b8cb6738c7..ca318cb13d 100644 --- a/components/heap/port/esp32s2/memory_layout.c +++ b/components/heap/port/esp32s2/memory_layout.c @@ -3,7 +3,6 @@ * * SPDX-License-Identifier: Apache-2.0 */ -#ifndef BOOTLOADER_BUILD #include #include @@ -150,5 +149,3 @@ SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_noinit_end, rtcram_d SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_force_fast_end, rtcram_data); #endif #endif - -#endif // BOOTLOADER_BUILD diff --git a/components/heap/port/esp32s3/memory_layout.c b/components/heap/port/esp32s3/memory_layout.c index 3e4450b734..2f44446a20 100644 --- a/components/heap/port/esp32s3/memory_layout.c +++ b/components/heap/port/esp32s3/memory_layout.c @@ -4,8 +4,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -#ifndef BOOTLOADER_BUILD - #include #include #include "sdkconfig.h" @@ -121,5 +119,3 @@ SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_noinit_end, rtcram_d SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_force_fast_end, rtcram_data); #endif #endif - -#endif // BOOTLOADER_BUILD diff --git a/components/heap/port/esp8684/memory_layout.c b/components/heap/port/esp8684/memory_layout.c new file mode 100644 index 0000000000..06d74c7316 --- /dev/null +++ b/components/heap/port/esp8684/memory_layout.c @@ -0,0 +1,80 @@ +/* + * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef BOOTLOADER_BUILD + +#include +#include +#include "esp_attr.h" +#include "sdkconfig.h" +#include "soc/soc.h" +#include "soc/soc_memory_layout.h" +#include "esp_heap_caps.h" + +/** + * @brief Memory type descriptors. These describe the capabilities of a type of memory in the SoC. + * Each type of memory map consists of one or more regions in the address space. + * Each type contains an array of prioritized capabilities. + * Types with later entries are only taken if earlier ones can't fulfill the memory request. + * + * - For a normal malloc (MALLOC_CAP_DEFAULT), give away the DRAM-only memory first, then pass off any dual-use IRAM regions, finally eat into the application memory. + * - For a malloc where 32-bit-aligned-only access is okay, first allocate IRAM, then DRAM, finally application IRAM. + * - Application mallocs (PIDx) will allocate IRAM first, if possible, then DRAM. + * - Most other malloc caps only fit in one region anyway. + * + */ +// IDF-4299 +const soc_memory_type_desc_t soc_memory_types[] = { + // Type 0: DRAM + { "DRAM", { MALLOC_CAP_8BIT | MALLOC_CAP_DEFAULT, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA | MALLOC_CAP_32BIT, 0 }, false, false}, + // Type 1: DRAM used for startup stacks + { "STACK/DRAM", { MALLOC_CAP_8BIT | MALLOC_CAP_DEFAULT, MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA | MALLOC_CAP_32BIT, MALLOC_CAP_RETENTION }, false, true}, + // Type 2: DRAM which has an alias on the I-port + { "D/IRAM", { 0, MALLOC_CAP_DMA | MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL | MALLOC_CAP_DEFAULT, MALLOC_CAP_32BIT | MALLOC_CAP_EXEC }, true, false}, + // Type 3: IRAM + { "IRAM", { MALLOC_CAP_EXEC | MALLOC_CAP_32BIT | MALLOC_CAP_INTERNAL, 0, 0 }, false, false}, +}; + +#ifdef CONFIG_ESP_SYSTEM_MEMPROT_FEATURE +#define SOC_MEMORY_TYPE_DEFAULT 0 +#else +#define SOC_MEMORY_TYPE_DEFAULT 2 +#endif + +const size_t soc_memory_type_count = sizeof(soc_memory_types) / sizeof(soc_memory_type_desc_t); + +/** + * @brief Region descriptors. These describe all regions of memory available, and map them to a type in the above type. + * + * @note Because of requirements in the coalescing code which merges adjacent regions, + * this list should always be sorted from low to high by start address. + * + */ +const soc_memory_region_t soc_memory_regions[] = { + { 0x3FCA0000, 0x10000, SOC_MEMORY_TYPE_DEFAULT, 0x40380000}, //Block 4, can be remapped to ROM, can be used as trace memory + { 0x3FCB0000, 0x10000, SOC_MEMORY_TYPE_DEFAULT, 0x40390000}, //Block 5, can be remapped to ROM, can be used as trace memory + { 0x3FCC0000, 0x20000, 1, 0x403A0000}, //Block 9, can be used as trace memory +}; + +const size_t soc_memory_region_count = sizeof(soc_memory_regions) / sizeof(soc_memory_region_t); + + +extern int _data_start, _heap_start, _iram_start, _iram_end; + +/** + * Reserved memory regions. + * These are removed from the soc_memory_regions array when heaps are created. + * + */ + +// Static data region. DRAM used by data+bss and possibly rodata +SOC_RESERVE_MEMORY_REGION((intptr_t)&_data_start, (intptr_t)&_heap_start, dram_data); + +// Target has a big D/IRAM region, the part used by code is reserved +// The address of the D/I bus are in the same order, directly shift IRAM address to get reserved DRAM address +#define I_D_OFFSET (SOC_DIRAM_IRAM_LOW - SOC_DIRAM_DRAM_LOW) +SOC_RESERVE_MEMORY_REGION((intptr_t)&_iram_start - I_D_OFFSET, (intptr_t)&_iram_end - I_D_OFFSET, iram_code); + +#endif // BOOTLOADER_BUILD diff --git a/components/heap/port/memory_layout_utils.c b/components/heap/port/memory_layout_utils.c index 3ef6d0e9e7..f0d7a76c05 100644 --- a/components/heap/port/memory_layout_utils.c +++ b/components/heap/port/memory_layout_utils.c @@ -1,16 +1,8 @@ -// Copyright 2018 Espressif Systems (Shanghai) PTE LTD -// -// Licensed 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. +/* + * SPDX-FileCopyrightText: 2018-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #include #include #include "sdkconfig.h" @@ -25,6 +17,8 @@ #define ROM_HAS_LAYOUT_TABLE 1 #elif CONFIG_IDF_TARGET_ESP32H2 #include "esp32h2/rom/rom_layout.h" +#elif CONFIG_IDF_TARGET_ESP8684 +#include "esp8684/rom/rom_layout.h" #define ROM_HAS_LAYOUT_TABLE 1 #else #define ROM_HAS_LAYOUT_TABLE 0