Merge branch 'feat/cmakev2_ulp_legacy_shim' into 'master'

feat(ulp): build all legacy ULP projects through CMakev2

See merge request espressif/esp-idf!50143
This commit is contained in:
Renz Christian Bagaporo
2026-07-31 07:10:43 +08:00
44 changed files with 670 additions and 184 deletions
+9
View File
@@ -6,6 +6,15 @@ endif()
set(includes "include" "interface" "${target}/include")
# TODO(IDF-15983): potentially remove __ULP_BUILDV2 handling from esp_adc
if(__ULP_BUILDV2)
# LP-core ADC shared code includes esp_adc/adc_oneshot.h from
# ulp/lp_core/shared/include/ulp_lp_core_lp_adc_shared.h.
idf_component_register(INCLUDE_DIRS ${includes}
REQUIRES esp_hal_ana_conv)
return()
endif()
set(srcs)
if(CONFIG_SOC_ADC_SUPPORTED)
+3 -3
View File
@@ -1,7 +1,7 @@
idf_build_get_property(target IDF_TARGET)
# TODO(IDF-15945): potentially remove __ULP_BUILD handling from esp_common
if(${target} STREQUAL "linux" OR __ULP_BUILD)
# TODO(IDF-15945): potentially remove __ULP_BUILDV2 handling from esp_common
if(${target} STREQUAL "linux" OR __ULP_BUILDV2)
# ULP sources include esp_err.h from components/ulp public and shared headers.
set(ldfragments)
else()
@@ -10,7 +10,7 @@ endif()
set(srcs)
if(NOT __ULP_BUILD)
if(NOT __ULP_BUILDV2)
set(srcs "src/esp_err_to_name.c")
endif()
+9
View File
@@ -8,6 +8,15 @@ set(srcs)
set(include "include")
set(priv_requires esp_driver_gpio esp_driver_dma esp_pm esp_mm esp_hal_clock)
# TODO(IDF-15984): potentially remove __ULP_BUILDV2 handling from esp_driver_i2s
if(__ULP_BUILDV2)
# LP-core VAD shared code includes driver/lp_i2s_vad.h from
# ulp/lp_core/shared/include/ulp_lp_core_lp_vad_shared.h.
idf_component_register(INCLUDE_DIRS ${include}
REQUIRES esp_hal_i2s)
return()
endif()
if(${target} STREQUAL "esp32")
# ADC on esp32 is routed to I2S0, I2S driver needs to operate ADC to ensure the I2S function.
list(APPEND priv_requires esp_hal_ana_conv)
+2 -2
View File
@@ -3,8 +3,8 @@ idf_build_get_property(target IDF_TARGET)
set(srcs)
set(public_include "include")
# TODO(IDF-15946): potentially remove __ULP_BUILD handling from esp_driver_uart
if(__ULP_BUILD)
# TODO(IDF-15946): potentially remove __ULP_BUILDV2 handling from esp_driver_uart
if(__ULP_BUILDV2)
# LP-core UART wakeup shared code includes driver/uart_wakeup.h from
# ulp/lp_core/shared/include/ulp_lp_core_lp_uart_shared.h.
set(ulp_srcs)
+14 -1
View File
@@ -4,7 +4,9 @@ if(${target} STREQUAL "linux")
return() # This component is not supported by the POSIX/Linux simulator
endif()
set(requires soc hal esp_hal_dma)
# Public ADC and temperature sensor HAL headers include hal/regi2c_ctrl.h on
# several targets, so CMake v2 builds need esp_hal_regi2c explicitly.
set(requires soc hal esp_hal_dma esp_hal_regi2c)
if(${target} STREQUAL "esp32")
list(APPEND requires esp_hal_i2s)
endif()
@@ -15,6 +17,17 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${target}/include")
list(APPEND includes "${target}/include")
endif()
# TODO(IDF-15985): potentially remove __ULP_BUILDV2 handling from esp_hal_ana_conv
if(__ULP_BUILDV2)
# ULP ADC code includes ADC HAL headers from
# ulp/ulp_riscv/ulp_core/ulp_riscv_adc.c and
# ulp/lp_core/shared/include/ulp_lp_core_lp_adc_shared.h. Some target
# ADC/temperature sensor headers include hal/regi2c_ctrl.h.
idf_component_register(INCLUDE_DIRS ${includes}
REQUIRES ${requires})
return()
endif()
# ADC related source files
if(CONFIG_SOC_ADC_SUPPORTED)
list(APPEND srcs "${target}/adc_periph.c" "adc_hal_common.c" "adc_oneshot_hal.c")
+2 -2
View File
@@ -14,8 +14,8 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${target}/include")
list(APPEND includes "${target}/include")
endif()
# TODO(IDF-15947): potentially remove __ULP_BUILD handling from esp_hal_clock
if(__ULP_BUILD)
# TODO(IDF-15947): potentially remove __ULP_BUILDV2 handling from esp_hal_clock
if(__ULP_BUILDV2)
# LP-core timer shared code includes hal/clk_tree_ll.h from
# ulp/lp_core/shared/ulp_lp_core_lp_timer_shared.c. Some target
# clk_tree_ll.h headers include hal/regi2c_ctrl.h.
+9
View File
@@ -10,6 +10,15 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${target}/include")
list(APPEND public_include "${target}/include")
endif()
# TODO(IDF-15991): potentially remove __ULP_BUILDV2 handling from esp_hal_dma
if(__ULP_BUILDV2)
# LP-core SPI uses components/esp_hal_gpspi/include/hal/spi_slave_hd_hal.h,
# whose public headers include DMA HAL descriptor types.
idf_component_register(INCLUDE_DIRS ${public_include}
REQUIRES soc hal)
return()
endif()
if(CONFIG_SOC_GDMA_SUPPORTED)
list(APPEND srcs "gdma_hal_top.c" "${target}/gdma_periph.c")
+5 -5
View File
@@ -10,20 +10,20 @@ endif()
# ULP GPIO helpers include GPIO/RTC IO HAL headers from
# ulp/ulp_riscv/ulp_core/include/ulp_riscv_gpio.h and
# ulp/lp_core/lp_core/include/ulp_lp_core_gpio.h.
# TODO(IDF-15948): potentially remove __ULP_BUILD source exclusions from esp_hal_gpio
if(CONFIG_SOC_GPIO_PORT GREATER 0 AND NOT __ULP_BUILD)
# TODO(IDF-15948): potentially remove __ULP_BUILDV2 source exclusions from esp_hal_gpio
if(CONFIG_SOC_GPIO_PORT GREATER 0 AND NOT __ULP_BUILDV2)
list(APPEND srcs "gpio_hal.c")
endif()
if(CONFIG_SOC_RTCIO_PIN_COUNT GREATER 0 AND NOT __ULP_BUILD)
if(CONFIG_SOC_RTCIO_PIN_COUNT GREATER 0 AND NOT __ULP_BUILDV2)
list(APPEND srcs "rtc_io_hal.c" "${target}/rtc_io_periph.c")
endif()
if(CONFIG_SOC_DEDICATED_GPIO_SUPPORTED AND NOT __ULP_BUILD)
if(CONFIG_SOC_DEDICATED_GPIO_SUPPORTED AND NOT __ULP_BUILDV2)
list(APPEND srcs "${target}/dedic_gpio_periph.c")
endif()
if(CONFIG_SOC_SDM_SUPPORTED AND NOT __ULP_BUILD)
if(CONFIG_SOC_SDM_SUPPORTED AND NOT __ULP_BUILDV2)
list(APPEND srcs "sdm_hal.c" "${target}/sdm_periph.c")
endif()
+9
View File
@@ -7,6 +7,15 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${target}/include")
list(APPEND includes "${target}/include")
endif()
# TODO(IDF-15986): potentially remove __ULP_BUILDV2 handling from esp_hal_gpspi
if(__ULP_BUILDV2)
# LP-core SPI code includes SPI HAL headers from
# ulp/lp_core/lp_core/lp_core_spi.c.
idf_component_register(INCLUDE_DIRS ${includes}
REQUIRES soc hal esp_hal_dma)
return()
endif()
if(CONFIG_SOC_GPSPI_SUPPORTED)
list(APPEND srcs
"${target}/spi_periph.c"
+10
View File
@@ -8,6 +8,16 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${target}/include")
endif()
list(APPEND includes "include")
# TODO(IDF-15987): potentially remove __ULP_BUILDV2 handling from esp_hal_i2c
if(__ULP_BUILDV2)
# ULP I2C code includes hal/i2c_ll.h and hal/i2c_types.h from
# ulp/ulp_riscv/ulp_core/ulp_riscv_i2c.c and
# ulp/lp_core/lp_core/lp_core_i2c.c.
idf_component_register(INCLUDE_DIRS ${includes}
REQUIRES soc hal esp_common)
return()
endif()
set(target_folder "${target}")
# I2C related source files
+9
View File
@@ -11,6 +11,15 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${target}/include")
list(APPEND includes "${target}/include")
endif()
# TODO(IDF-15988): potentially remove __ULP_BUILDV2 handling from esp_hal_i2s
if(__ULP_BUILDV2)
# LP-core VAD shared code includes LP I2S HAL headers from
# ulp/lp_core/shared/ulp_lp_core_lp_vad_shared.c.
idf_component_register(INCLUDE_DIRS ${includes}
REQUIRES soc hal)
return()
endif()
# I2S related source files
if(CONFIG_SOC_I2S_SUPPORTED)
list(APPEND srcs "i2s_hal.c" "${target}/i2s_periph.c")
+2 -2
View File
@@ -9,8 +9,8 @@ set(public_include "include" "${target}/include")
# targets, so CMake v2 builds need esp_hal_regi2c explicitly.
set(requires soc hal esp_rom esp_hal_regi2c)
# TODO(IDF-15949): potentially remove __ULP_BUILD handling from esp_hal_pmu
if(__ULP_BUILD)
# TODO(IDF-15949): potentially remove __ULP_BUILDV2 handling from esp_hal_pmu
if(__ULP_BUILDV2)
# LP-core runtime code includes hal/pmu_ll.h from
# ulp/lp_core/lp_core/lp_core_utils.c. Some target brownout/VBAT headers
# include hal/regi2c_ctrl.h.
+2 -2
View File
@@ -11,8 +11,8 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${target}/include")
list(APPEND includes "${target}/include")
endif()
# TODO(IDF-15950): potentially remove __ULP_BUILD handling from esp_hal_regi2c
if(__ULP_BUILD)
# TODO(IDF-15950): potentially remove __ULP_BUILDV2 handling from esp_hal_regi2c
if(__ULP_BUILDV2)
# ULP ADC support reaches REGI2C headers through ADC HAL includes used by
# ulp/ulp_riscv/ulp_core/ulp_riscv_adc.c.
idf_component_register(INCLUDE_DIRS ${includes}
@@ -6,6 +6,15 @@ endif()
set(srcs)
set(public_include "include" "${target}/include")
# TODO(IDF-15992): potentially remove __ULP_BUILDV2 handling from esp_hal_rtc_timer
if(__ULP_BUILDV2)
# LP-core timer shared code includes hal/rtc_timer_ll.h from
# ulp/lp_core/shared/ulp_lp_core_lp_timer_shared.c.
idf_component_register(INCLUDE_DIRS ${public_include}
REQUIRES soc hal esp_rom)
return()
endif()
idf_component_register(SRCS ${srcs}
INCLUDE_DIRS ${public_include}
REQUIRES soc hal esp_rom)
@@ -8,8 +8,5 @@ components/esp_hal_security/test_apps/crypto:
- esp_security
components/esp_hal_security/test_apps/tee:
disable+:
- if: IDF_BUILD_V2 == "1"
reason: Legacy ULP apps are covered by CMake v1; buildv2 covers full_subproject ULP apps.
disable:
- if: IDF_TARGET not in ["esp32c6", "esp32h2", "esp32c5", "esp32c61", "esp32p4"]
@@ -12,6 +12,16 @@ endif()
# "include" should be behind "${target}/include", because `include_next` has sequence requirement
list(APPEND includes "include")
# TODO(IDF-15989): potentially remove __ULP_BUILDV2 handling from esp_hal_touch_sens
if(__ULP_BUILDV2)
# ULP touch support includes touch sensor HAL headers from
# ulp/ulp_riscv/ulp_core/ulp_riscv_touch.c and
# ulp/lp_core/lp_core/lp_core_touch.c.
idf_component_register(INCLUDE_DIRS ${includes}
REQUIRES soc)
return()
endif()
# Touch Sensor related source files
if(CONFIG_SOC_TOUCH_SENSOR_SUPPORTED)
# Source files for the legacy touch hal driver
+16
View File
@@ -8,6 +8,22 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${target}/include")
list(APPEND includes "${target}/include")
endif()
# TODO(IDF-15990): potentially remove __ULP_BUILDV2 handling from esp_hal_uart
if(__ULP_BUILDV2)
# LP-core UART and print code includes UART HAL headers from
# ulp/lp_core/lp_core/lp_core_uart.c and
# ulp/lp_core/lp_core/lp_core_print.c.
set(ulp_srcs)
if(ULP_TYPE STREQUAL "lp_core" AND CONFIG_SOC_UART_SUPPORTED)
list(APPEND ulp_srcs "uart_hal.c" "uart_hal_iram.c")
endif()
idf_component_register(SRCS ${ulp_srcs}
INCLUDE_DIRS ${includes}
REQUIRES esp_common soc hal)
return()
endif()
if(CONFIG_SOC_UART_SUPPORTED)
list(APPEND srcs "uart_hal.c" "uart_hal_iram.c" "${target}/uart_periph.c")
endif()
+2 -2
View File
@@ -30,8 +30,8 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/port/${target}/include")
)
endif()
# TODO(IDF-15951): potentially remove __ULP_BUILD handling from esp_hw_support
if(__ULP_BUILD)
# TODO(IDF-15951): potentially remove __ULP_BUILDV2 handling from esp_hw_support
if(__ULP_BUILDV2)
# ULP headers and LP-core runtime include esp_intr_alloc.h and esp_cpu.h from
# ulp/ulp_riscv/include/ulp_riscv.h and
# ulp/lp_core/lp_core/lp_core_ubsan.c.
@@ -103,8 +103,6 @@ components/esp_hw_support/test_apps/vad_wakeup:
- ulp
- soc
disable:
- if: IDF_BUILD_V2 == "1"
reason: Legacy ULP apps are covered by CMake v1; buildv2 covers full_subproject ULP apps.
- if: SOC_LP_VAD_SUPPORTED != 1
components/esp_hw_support/test_apps/wakeup_tests:
@@ -14,5 +14,4 @@ endif()
idf_component_register(SRCS ${sources}
INCLUDE_DIRS "."
PRIV_REQUIRES unity esp_pm ulp esp_timer esp_psram esp_driver_gptimer vfs esp_hal_gpio
esp_driver_gpio
WHOLE_ARCHIVE)
+2 -2
View File
@@ -7,8 +7,8 @@ set(include_dirs "include"
"${target_folder}/include/${target_folder}"
"${target_folder}")
# TODO(IDF-15952): potentially remove __ULP_BUILD handling from esp_rom
if(__ULP_BUILD)
# TODO(IDF-15952): potentially remove __ULP_BUILDV2 handling from esp_rom
if(__ULP_BUILDV2)
# LP-core runtime and print code include ROM headers from
# ulp/lp_core/lp_core/lp_core_startup.c and
# ulp/lp_core/lp_core/lp_core_print.c.
+2 -2
View File
@@ -14,8 +14,8 @@ list(APPEND includes "include")
# ULP runtime code includes generic HAL headers, for example hal/lp_core_ll.h
# from ulp/lp_core/lp_core/lp_core_interrupt.c.
# TODO(IDF-15953): potentially remove __ULP_BUILD handling from hal
if(__ULP_BUILD)
# TODO(IDF-15953): potentially remove __ULP_BUILDV2 handling from hal
if(__ULP_BUILDV2)
idf_component_register(INCLUDE_DIRS ${includes}
PRIV_INCLUDE_DIRS ${priv_include}
REQUIRES esp_common ${requires})
+2 -2
View File
@@ -1,8 +1,8 @@
idf_build_get_property(target IDF_TARGET)
idf_build_get_property(non_os_build NON_OS_BUILD)
# TODO(IDF-15954): potentially remove __ULP_BUILD handling from log
if(__ULP_BUILD)
# TODO(IDF-15954): potentially remove __ULP_BUILDV2 handling from log
if(__ULP_BUILDV2)
# LP-core UART wakeup support builds components/esp_driver_uart/src/uart_wakeup.c,
# which includes ESP log headers.
idf_component_register(INCLUDE_DIRS "include"
+4 -4
View File
@@ -2,19 +2,19 @@ idf_build_get_property(target IDF_TARGET)
idf_build_get_property(arch IDF_TARGET_ARCH)
idf_build_get_property(esp_tee_build ESP_TEE_BUILD)
# TODO(IDF-15955): potentially remove __ULP_BUILD handling from riscv
if(NOT "${arch}" STREQUAL "riscv" AND NOT (__ULP_BUILD AND "${ULP_TYPE}" STREQUAL "riscv"))
# TODO(IDF-15955): potentially remove __ULP_BUILDV2 handling from riscv
if(NOT "${arch}" STREQUAL "riscv" AND NOT (__ULP_BUILDV2 AND "${ULP_TYPE}" STREQUAL "riscv"))
return()
endif()
if(__ULP_BUILD AND "${ULP_TYPE}" STREQUAL "riscv")
if(__ULP_BUILDV2 AND "${ULP_TYPE}" STREQUAL "riscv")
# RISC-V ULP interrupt support includes riscv/interrupt.h from
# ulp/ulp_riscv/ulp_core/include/ulp_riscv_interrupt.h.
idf_component_register(INCLUDE_DIRS "include")
return()
endif()
# When __ULP_BUILD and ULP_TYPE is lp_core, keep the normal RISC-V helper sources for headers
# When __ULP_BUILDV2 and ULP_TYPE is lp_core, keep the normal RISC-V helper sources for headers
# used by ulp/lp_core/lp_core/lp_core_pmp.c and vector.S.
if(BOOTLOADER_BUILD)
+2 -2
View File
@@ -31,8 +31,8 @@ else()
endif()
endif()
# TODO(IDF-15956): potentially remove __ULP_BUILD handling from soc
if(__ULP_BUILD)
# TODO(IDF-15956): potentially remove __ULP_BUILDV2 handling from soc
if(__ULP_BUILDV2)
idf_component_register(INCLUDE_DIRS ${includes}
REQUIRES esp_common)
+185 -31
View File
@@ -3,20 +3,38 @@ set(includes "")
set(requires "")
set(priv_requires "")
if(__ULP_BUILD)
if(__ULP_BUILDV2)
if(ULP_TYPE STREQUAL "riscv")
list(APPEND includes
ulp_common/include
ulp_riscv/include
ulp_riscv/shared/include
ulp_riscv/ulp_core/include)
list(APPEND srcs
"ulp_riscv/ulp_core/ulp_riscv_vectors.S"
"ulp_riscv/ulp_core/start.S"
"ulp_riscv/ulp_core/ulp_riscv_utils.c")
"ulp_riscv/ulp_core/ulp_riscv_adc.c"
"ulp_riscv/ulp_core/ulp_riscv_lock.c"
"ulp_riscv/ulp_core/ulp_riscv_uart.c"
"ulp_riscv/ulp_core/ulp_riscv_print.c"
"ulp_riscv/ulp_core/ulp_riscv_i2c.c"
"ulp_riscv/ulp_core/ulp_riscv_utils.c"
"ulp_riscv/ulp_core/ulp_riscv_touch.c"
"ulp_riscv/ulp_core/ulp_riscv_gpio.c"
"ulp_riscv/ulp_core/ulp_riscv_interrupt.c")
list(APPEND requires
esp_common
esp_hal_ana_conv
esp_hal_gpio
esp_hal_i2c
esp_hal_touch_sens
esp_hw_support
riscv
soc)
elseif(ULP_TYPE STREQUAL "lp_core")
list(APPEND includes
ulp_common/include
lp_core/include
lp_core/lp_core/include
lp_core/shared/include)
list(APPEND srcs
@@ -27,16 +45,15 @@ if(__ULP_BUILD)
"lp_core/lp_core/lp_core_startup.c"
"lp_core/lp_core/lp_core_pmp.c"
"lp_core/lp_core/lp_core_utils.c"
"lp_core/lp_core/lp_core_print.c"
"lp_core/lp_core/lp_core_panic.c"
"lp_core/lp_core/lp_core_interrupt.c"
"lp_core/shared/ulp_lp_core_lp_uart_shared.c"
"lp_core/lp_core/lp_core_uart.c"
"lp_core/shared/ulp_lp_core_lp_timer_shared.c"
"lp_core/lp_core/lp_core_ubsan.c"
"lp_core/lp_core/lp_core_mailbox.c"
"lp_core/shared/ulp_lp_core_critical_section_shared.c")
list(APPEND requires
esp_common
esp_driver_uart
esp_hal_gpio
esp_hal_uart
esp_rom
@@ -44,12 +61,55 @@ if(__ULP_BUILD)
riscv
soc)
list(APPEND priv_requires
esp_hal_clock
esp_hal_i2s
esp_hal_rtc_timer
esp_hal_pmu
esp_hw_support)
if(CONFIG_SOC_RTC_TIMER_V2 OR CONFIG_SOC_RTC_TIMER_V3)
list(APPEND srcs "lp_core/shared/ulp_lp_core_lp_timer_shared.c")
list(APPEND priv_requires
esp_hal_clock
esp_hal_rtc_timer)
endif()
if(CONFIG_SOC_LP_CORE_SUPPORT_I2C)
list(APPEND srcs "lp_core/lp_core/lp_core_i2c.c")
list(APPEND requires esp_hal_i2c)
endif()
if(CONFIG_SOC_LP_SPI_SUPPORTED)
list(APPEND srcs "lp_core/lp_core/lp_core_spi.c")
list(APPEND priv_requires esp_hal_gpspi)
endif()
if(CONFIG_SOC_ULP_LP_UART_SUPPORTED)
list(APPEND srcs
"lp_core/shared/ulp_lp_core_lp_uart_shared.c"
"lp_core/lp_core/lp_core_uart.c")
list(APPEND requires esp_driver_uart)
endif()
if(CONFIG_SOC_LP_MAILBOX_SUPPORTED)
list(APPEND srcs "lp_core/lp_core/port/lp_core_mailbox_impl_hw.c")
else()
list(APPEND srcs "lp_core/lp_core/port/lp_core_mailbox_impl_sw.c")
endif()
if(CONFIG_SOC_TOUCH_SENSOR_SUPPORTED)
list(APPEND srcs "lp_core/lp_core/lp_core_touch.c")
list(APPEND requires esp_hal_touch_sens)
endif()
if(CONFIG_SOC_LP_ADC_SUPPORTED)
list(APPEND srcs "lp_core/shared/ulp_lp_core_lp_adc_shared.c")
list(APPEND requires
esp_adc
esp_hal_ana_conv)
endif()
if(CONFIG_SOC_LP_VAD_SUPPORTED)
list(APPEND srcs "lp_core/shared/ulp_lp_core_lp_vad_shared.c")
list(APPEND requires esp_driver_i2s)
endif()
elseif(ULP_TYPE STREQUAL "fsm")
list(APPEND includes
ulp_common/include
@@ -57,10 +117,16 @@ if(__ULP_BUILD)
ulp_fsm/include/${target})
list(APPEND requires soc)
else()
message(FATAL_ERROR "__ULP_BUILD requires ULP_TYPE to be one of: riscv, lp_core, fsm.")
message(FATAL_ERROR "__ULP_BUILDV2 requires ULP_TYPE to be one of: riscv, lp_core, fsm.")
endif()
else()
if(CONFIG_ULP_COPROC_ENABLED)
# TODO(IDF-15993): Keep esp_driver_gpio and esp_adc public for compatibility
# with the CMake v1 dependency graph until downstream users are fixed.
list(APPEND requires
esp_adc
esp_driver_gpio)
if(CONFIG_ULP_COPROC_ENABLED OR CONFIG_IDF_DOC_BUILD)
list(APPEND includes
ulp_common/include)
list(APPEND requires
@@ -68,49 +134,127 @@ else()
soc)
endif()
if(CONFIG_ULP_COPROC_TYPE_FSM)
if(CONFIG_ULP_COPROC_TYPE_FSM OR (CONFIG_IDF_DOC_BUILD AND CONFIG_SOC_ULP_FSM_SUPPORTED))
list(APPEND includes
ulp_fsm/include
ulp_fsm/include/${target})
list(APPEND srcs
"ulp_common/ulp_common.c"
"ulp_fsm/ulp.c"
"ulp_fsm/ulp_macro.c")
list(APPEND requires esp_hw_support)
endif()
if(CONFIG_ULP_COPROC_TYPE_RISCV)
if(CONFIG_ULP_COPROC_TYPE_RISCV OR CONFIG_IDF_DOC_BUILD)
list(APPEND includes
ulp_riscv/include
ulp_riscv/shared/include
ulp_riscv/ulp_core/include)
list(APPEND requires esp_hw_support)
endif()
if(CONFIG_ULP_COPROC_TYPE_LP_CORE OR CONFIG_IDF_DOC_BUILD)
list(APPEND includes
lp_core/include
lp_core/lp_core/include
lp_core/shared/include)
endif()
if(CONFIG_ULP_COPROC_TYPE_FSM OR CONFIG_ULP_COPROC_TYPE_RISCV)
list(APPEND srcs
"ulp_common/ulp_common.c"
"ulp_riscv/ulp_riscv.c")
list(APPEND requires
esp_hw_support
esp_hal_pmu)
"ulp_common/ulp_adc.c")
if(CONFIG_ULP_COPROC_TYPE_FSM)
list(APPEND srcs
"ulp_fsm/ulp.c"
"ulp_fsm/ulp_macro.c")
endif()
if(CONFIG_ULP_COPROC_TYPE_RISCV)
list(APPEND srcs
"ulp_riscv/ulp_riscv.c"
"ulp_riscv/ulp_riscv_lock.c"
"ulp_riscv/ulp_riscv_i2c.c")
list(APPEND priv_requires esp_driver_gpio)
list(APPEND requires
# ulp/ulp_riscv/ulp_core/include/ulp_riscv_touch_ulp_core.h
# includes hal/touch_sens_types.h.
esp_hal_touch_sens
esp_hal_i2c
hal)
endif()
endif()
if(CONFIG_ULP_COPROC_TYPE_LP_CORE)
list(APPEND includes
lp_core/include
lp_core/lp_core/include
lp_core/shared/include)
list(APPEND srcs
"lp_core/lp_core.c"
"lp_core/shared/ulp_lp_core_memory_shared.c"
"lp_core/shared/ulp_lp_core_lp_timer_shared.c"
"lp_core/shared/ulp_lp_core_critical_section_shared.c")
list(APPEND requires
esp_hw_support
esp_hal_clock
esp_common
esp_hal_pmu
esp_hal_rtc_timer
esp_rom
hal
riscv
soc)
if(CONFIG_SOC_ULP_LP_UART_SUPPORTED)
list(APPEND srcs
"lp_core/lp_core_uart.c"
"lp_core/shared/ulp_lp_core_lp_uart_shared.c")
list(APPEND requires
esp_driver_gpio
esp_driver_uart)
endif()
if(CONFIG_SOC_LP_CORE_SUPPORT_I2C)
list(APPEND srcs "lp_core/lp_core_i2c.c")
list(APPEND requires
esp_driver_gpio
esp_hal_i2c)
endif()
if(CONFIG_SOC_RTC_TIMER_V2 OR CONFIG_SOC_RTC_TIMER_V3)
list(APPEND srcs "lp_core/shared/ulp_lp_core_lp_timer_shared.c")
list(APPEND requires
esp_hal_clock
esp_hal_rtc_timer)
endif()
if(CONFIG_SOC_LP_SPI_SUPPORTED)
list(APPEND srcs "lp_core/lp_core_spi.c")
list(APPEND requires
esp_driver_gpio
esp_hal_gpspi)
endif()
if(CONFIG_SOC_LP_CORE_SUPPORT_ETM)
list(APPEND srcs "lp_core/lp_core_etm.c")
endif()
if(CONFIG_SOC_TOUCH_SENSOR_SUPPORTED)
list(APPEND requires esp_hal_touch_sens)
endif()
if(CONFIG_SOC_LP_ADC_SUPPORTED)
list(APPEND srcs "lp_core/shared/ulp_lp_core_lp_adc_shared.c")
list(APPEND priv_requires esp_hw_support)
endif()
if(CONFIG_SOC_LP_VAD_SUPPORTED)
list(APPEND srcs "lp_core/shared/ulp_lp_core_lp_vad_shared.c")
list(APPEND requires esp_driver_i2s)
endif()
list(APPEND srcs "lp_core/lp_core_mailbox.c")
if(CONFIG_SOC_LP_MAILBOX_SUPPORTED)
list(APPEND srcs "lp_core/lp_core_mailbox_impl_hw.c")
else()
list(APPEND srcs "lp_core/lp_core_mailbox_impl_sw.c")
endif()
endif()
if(srcs)
list(APPEND priv_requires
bootloader_support
esp_mm)
endif()
endif()
@@ -122,14 +266,24 @@ if(priv_requires)
list(REMOVE_DUPLICATES priv_requires)
endif()
set(whole_archive)
if(__ULP_BUILDV2)
# Legacy ULP child builds added the LP-core runtime sources directly to the
# executable. Preserve that behavior so strong handlers such as
# ulp_lp_core_panic_handler are not dropped in favor of weak defaults from
# other runtime objects.
set(whole_archive WHOLE_ARCHIVE)
endif()
idf_component_register(SRCS ${srcs}
INCLUDE_DIRS ${includes}
REQUIRES ${requires}
PRIV_REQUIRES ${priv_requires})
PRIV_REQUIRES ${priv_requires}
${whole_archive})
# In the parent app build, the ulp component only provides the host-side API.
# The executable/linker setup below is for native ULP child projects.
if(NOT __ULP_BUILD)
if(NOT __ULP_BUILDV2)
idf_define_esp_err_codes(HEADERS ulp_fsm/include/ulp_fsm_common.h)
return()
endif()
+5
View File
@@ -1,5 +1,10 @@
cmake_minimum_required(VERSION 3.22)
if(IDF_BUILD_V2)
include(${CMAKE_CURRENT_LIST_DIR}/CMakeLists_v2.txt)
return()
endif()
include(${IDF_PATH}/tools/cmake/idf.cmake)
project(${ULP_APP_NAME})
add_executable(${ULP_APP_NAME})
+69
View File
@@ -0,0 +1,69 @@
# CMake v2 default ULP project for ulp_embed_binary() callers. The ULP runtime
# is built from the ulp component graph, and the legacy source list is attached
# directly to the executable, matching the CMake v1 link semantics.
include(${CMAKE_CURRENT_LIST_DIR}/ulp_project.cmake)
if("${ULP_TYPE}" STREQUAL "fsm")
project(${ULP_APP_NAME} ASM)
else()
project(${ULP_APP_NAME} C CXX ASM)
endif()
ulp_project_init()
# A single executable is built, so DEFERRED optional-requires resolution is
# safe and keeps the linked component set minimal.
idf_build_set_property(IDF_COMPONENT_OPTIONAL_REQUIRES_MODE DEFERRED)
# CMake v1 linked the ulp_embed_binary() call-site sources before the ULP runtime.
# In CMake v2 the runtime's WHOLE_ARCHIVE is emitted as a link option, before
# executable objects, so attaching these sources directly would reverse that
# order. Keep them in a separate archive that can be placed before the runtime,
# preserving legacy code placement and strong-over-weak symbol resolution.
function(__ulp_embed_binary_add_legacy_sources executable)
set(legacy_sources_lib "${executable}_legacy_sources")
add_library(${legacy_sources_lib} STATIC ${ULP_S_SOURCES})
target_link_libraries(${legacy_sources_lib} PRIVATE "library_${executable}")
if(ADD_PICOLIBC_SPECS)
target_compile_options(${legacy_sources_lib} PRIVATE $<$<COMPILE_LANG_AND_ID:C,GNU>:-specs=picolibc.specs>)
target_compile_options(${legacy_sources_lib} PRIVATE $<$<COMPILE_LANG_AND_ID:CXX,GNU>:-specs=picolibcpp.specs>)
endif()
if(ULP_PARENT_SDKCONFIG_HEADER)
# Legacy ulp_embed_binary() sources are authored against the parent app's
# sdkconfig, including project-local Kconfig.projbuild symbols.
get_filename_component(parent_sdkconfig_dir "${ULP_PARENT_SDKCONFIG_HEADER}" DIRECTORY)
target_include_directories(${legacy_sources_lib} BEFORE PRIVATE "${parent_sdkconfig_dir}")
endif()
if(COMPONENT_INCLUDES)
target_include_directories(${legacy_sources_lib} PRIVATE ${COMPONENT_INCLUDES})
endif()
# CMake v1 exposed COMPONENT_DIR only to the FSM assembly preprocessing, not to
# the compilation of ULP C sources. The v2 FSM toolchain preprocesses inside
# the compile rule, which takes its include flags from the target, so keep the
# directory on the target for FSM builds only.
if(BUILD_FSM AND COMPONENT_DIR)
target_include_directories(${legacy_sources_lib} PRIVATE ${COMPONENT_DIR})
endif()
__idf_build_link_whole_archive(${executable} PRIVATE ${legacy_sources_lib} BEFORE)
endfunction()
set(executable_args COMPONENTS ulp)
if(NOT BUILD_FSM)
list(APPEND executable_args MAPFILE_TARGET ${ULP_APP_NAME}_mapfile)
endif()
ulp_build_executable(${ULP_APP_NAME} ${executable_args})
__ulp_embed_binary_add_legacy_sources(${ULP_APP_NAME})
if(DEFINED ULP_VAR_PREFIX AND NOT "${ULP_VAR_PREFIX}" STREQUAL "")
ulp_build_binary(${ULP_APP_NAME} PREFIX ${ULP_VAR_PREFIX})
else()
ulp_build_binary(${ULP_APP_NAME})
endif()
idf_build_generate_metadata(EXECUTABLE ${ULP_APP_NAME})
if(TARGET "${ULP_APP_NAME}_mapfile")
idf_create_size_report("${ULP_APP_NAME}_mapfile" TARGET size)
endif()
idf_build_generate_depgraph("${ULP_APP_NAME}")
+8
View File
@@ -9,6 +9,14 @@
include(${IDF_PATH}/tools/cmakev2/idf.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/IDFULPProjectCommon.cmake)
# __ULP_BUILDV2 is only set by the IDF_BUILD_V2 ULP child path for now.
if(__ULP_BUILDV2)
set(NON_OS_BUILD 1)
# Clearing common components below only prevents automatic app-component closure.
# Explicitly included ULP dependencies still read NON_OS_BUILD to select their no-OS shape.
idf_build_set_property(NON_OS_BUILD 1)
endif()
# Reset the compile/link state inherited from the parent app build and select
# ULP-specific build behavior. Idempotent within a child configure.
function(__ulp_prepare_build)
+25 -7
View File
@@ -1,4 +1,4 @@
if(IDF_BUILD_V2 AND __ULP_BUILD)
if(IDF_BUILD_V2 AND __ULP_BUILDV2)
return()
endif()
@@ -131,11 +131,15 @@ function(__setup_ulp_project app_name project_path prefix prefix_append_bin_name
# subprojects). Do not warn about the ones a given child ignores.
--no-warn-unused-cli
-DIDF_DEFAULT_PROJECT_NAME=${app_name}
-DULP_APP_NAME=${app_name}
-DIDF_BUILD_V2=y
# Internal marker for the ULP child project component graph.
-D__ULP_BUILD=1
-DCMAKE_MODULE_PATH=${ulp_cmake_dir}
# Internal marker for ULP child component graphs. Only the
# IDF_BUILD_V2 path sets it for now.
-D__ULP_BUILDV2=1
-DIDF_PARENT_BUILD_DIR=${build_dir}
-DULP_PREFIX_APPEND_BIN_NAME=${prefix_append_bin_name}
-DULP_PARENT_SDKCONFIG_HEADER=${SDKCONFIG_HEADER}
-DSDKCONFIG=${sdkconfig}
-DSDKCONFIG_HEADER=${SDKCONFIG_HEADER}
-DSDKCONFIG_CMAKE=${SDKCONFIG_CMAKE}
@@ -196,10 +200,24 @@ function(__setup_ulp_project app_name project_path prefix prefix_append_bin_name
BUILD_ALWAYS 1
)
# Only the CMake v1 path reads this property when passing ULP_S_SOURCES
# to the child project. Leaving it set for v2 is harmless and keeps the
# post-ExternalProject artifact wiring common. Can be dropped when
# v1 support is dropped.
if(IDF_BUILD_V2)
foreach(binary_name IN LISTS binary_names)
set(ulp_compat_dir "${CMAKE_CURRENT_BINARY_DIR}/${binary_name}")
foreach(extension IN ITEMS bin ld h map sym elf)
set(ulp_compat_artifact "${ulp_compat_dir}/${binary_name}.${extension}")
set(ulp_source_artifact "${ulp_binary_dir}/${binary_name}.${extension}")
add_custom_command(OUTPUT "${ulp_compat_artifact}"
COMMAND ${CMAKE_COMMAND} -E make_directory "${ulp_compat_dir}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${ulp_source_artifact}" "${ulp_compat_artifact}"
DEPENDS "${ulp_source_artifact}"
VERBATIM)
endforeach()
endforeach()
endif()
# Both build system versions pass ULP_S_SOURCES to the child project
# through this property; see the generator expression above.
set_property(TARGET ${app_name} PROPERTY ULP_SOURCES "${sources}")
spaces2list(exp_dep_srcs)
@@ -1,12 +1,6 @@
# Documentation: .gitlab/ci/README.md#manifest-file-to-control-the-buildtest-apps
.ulp_legacy_buildv2_disable: &ulp_legacy_buildv2_disable
if: IDF_BUILD_V2 == "1"
reason: Legacy ULP apps are covered by CMake v1; buildv2 covers full_subproject ULP apps.
components/ulp/test_apps/lp_core/lp_core_basic_tests:
disable+:
- *ulp_legacy_buildv2_disable
disable:
- if: SOC_LP_CORE_SUPPORTED != 1
- if: CONFIG_NAME == "xtal" and SOC_CLK_LP_FAST_SUPPORT_XTAL != 1
@@ -26,8 +20,6 @@ components/ulp/test_apps/lp_core/lp_core_basic_tests:
components/ulp/test_apps/lp_core/lp_core_gpio_wakeup_tests:
disable:
- *ulp_legacy_buildv2_disable
enable:
- if: (SOC_LP_CORE_SUPPORTED == 1) and (SOC_RTCIO_PIN_COUNT > 0) and (SOC_DEEP_SLEEP_SUPPORTED == 1) and (SOC_RTC_GPIO_EDGE_WAKEUP_SUPPORTED == 1)
depends_components:
@@ -39,8 +31,6 @@ components/ulp/test_apps/lp_core/lp_core_gpio_wakeup_tests:
components/ulp/test_apps/lp_core/lp_core_hp_mem:
disable+:
- *ulp_legacy_buildv2_disable
disable:
- if: SOC_LP_CORE_SUPPORTED != 1
depends_components:
@@ -51,8 +41,6 @@ components/ulp/test_apps/lp_core/lp_core_hp_mem:
components/ulp/test_apps/lp_core/lp_core_hp_uart:
disable+:
- *ulp_legacy_buildv2_disable
disable:
- if: SOC_LP_CORE_SUPPORTED != 1
depends_components:
@@ -63,8 +51,6 @@ components/ulp/test_apps/lp_core/lp_core_hp_uart:
components/ulp/test_apps/ulp_fsm:
disable:
- *ulp_legacy_buildv2_disable
enable:
- if: SOC_ULP_FSM_SUPPORTED == 1
depends_components:
@@ -75,8 +61,6 @@ components/ulp/test_apps/ulp_fsm:
components/ulp/test_apps/ulp_riscv:
disable+:
- *ulp_legacy_buildv2_disable
disable:
- if: SOC_RISCV_COPROC_SUPPORTED != 1
depends_components:
@@ -72,7 +72,7 @@ idf_component_register(SRCS ${app_sources}
INCLUDE_DIRS "lp_core"
REQUIRES ulp unity esp_timer test_utils
PRIV_REQUIRES esp_driver_gptimer esp_driver_i2c esp_driver_tsens esp_hal_rtc_timer
esp_driver_gpio hal
esp_driver_gpio esp_hal_pmu hal
WHOLE_ARCHIVE
EMBED_FILES "test_vad_8k.pcm")