diff --git a/arch/risc-v/src/common/espressif/CMakeLists.txt b/arch/risc-v/src/common/espressif/CMakeLists.txt index 7a347b2ea13..81f658556d2 100644 --- a/arch/risc-v/src/common/espressif/CMakeLists.txt +++ b/arch/risc-v/src/common/espressif/CMakeLists.txt @@ -199,11 +199,11 @@ if(CONFIG_COMP) endif() if(CONFIG_ESPRESSIF_USE_LP_CORE) - message( - WARNING - "LP Core is not supported on CMake. Use Make to build the image instead.") + list(APPEND SRCS esp_ulp.c) endif() +# if(CONFIG_ESPRESSIF_LP_MAILBOX) list(APPEND SRCS esp_lp_mailbox.c) endif() + if(CONFIG_PM) if(NOT CONFIG_ARCH_CUSTOM_PMINIT) list(APPEND SRCS esp_pm_initialize.c) @@ -468,14 +468,6 @@ add_custom_target( COMMENT "Flashing firmware via esptool to $ENV{ESPTOOL_PORT}" VERBATIM) -# ############################################################################## -# ULP Support (TODO) -# ############################################################################## - -if(CONFIG_ESPRESSIF_USE_LP_CORE) - list(APPEND ESP_CLEAN_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../chip/ulp) -endif() - # ############################################################################## # Clean hook - replicate Make.defs distclean behavior # ############################################################################## @@ -485,6 +477,15 @@ set(ESP_CLEAN_FILES ${NUTTX_DIR}/arch/${CONFIG_ARCH}/include/${CONFIG_ARCH_CHIP}/irq.h ${NUTTX_DIR}/vefuse.bin) +if(CONFIG_ESPRESSIF_USE_LP_CORE) + list( + APPEND + ESP_CLEAN_FILES + ${NUTTX_CHIP_ABS_DIR}/ulp + ${NUTTX_DIR}/boards/${CONFIG_ARCH}/${CHIP_SERIES}/common/scripts/ulp_aliases.ld + ) +endif() + set_property( DIRECTORY ${CMAKE_SOURCE_DIR} APPEND diff --git a/arch/risc-v/src/common/espressif/esp_ulp.cmake b/arch/risc-v/src/common/espressif/esp_ulp.cmake new file mode 100644 index 00000000000..610bcd5a1c2 --- /dev/null +++ b/arch/risc-v/src/common/espressif/esp_ulp.cmake @@ -0,0 +1,494 @@ +# ############################################################################## +# arch/risc-v/src/common/espressif/esp_ulp.cmake +# +# SPDX-License-Identifier: Apache-2.0 +# +# 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. +# +# ############################################################################## + +if(CONFIG_ESPRESSIF_USE_LP_CORE) + + # ############################################################################ + # Path variables for ULP build + # ############################################################################ + + if(NOT CHIP_SERIES) + string(REPLACE "\"" "" CHIP_SERIES "${CONFIG_ESPRESSIF_CHIP_SERIES}") + endif() + + set(ARCH_SRCDIR ${NUTTX_DIR}/arch/${CONFIG_ARCH}/src) + set(CHIP_DIR ${NUTTX_CHIP_ABS_DIR}) + set(ULP_ARCH_FOLDER ${CHIP_DIR}/ulp) + set(ULP_FOLDER ${ULP_APP_FOLDER}/ulp) + + if(NOT ULP_APP_NAME) + set(ULP_APP_NAME ${ULP_APP_FOLDER}) + endif() + + string(MAKE_C_IDENTIFIER "${ULP_APP_NAME}" _ulp_app_id) + set(ULP_BIN_TARGET ${_ulp_app_id}_ulp_bin) + set(ULP_PREPARE_TARGET ${_ulp_app_id}_ulp_prepare) + set(ULP_FIRMWARE_TARGET ${_ulp_app_id}_ulp_firmware) + + if(DEFINED NUTTX_BOARD_DIR) + set(ULP_BOARD_SCRIPTS_DIR ${NUTTX_BOARD_DIR}/../common/scripts) + else() + set(ULP_BOARD_SCRIPTS_DIR + ${NUTTX_DIR}/boards/${CONFIG_ARCH}/${CHIP_SERIES}/common/scripts) + endif() + get_filename_component(ULP_BOARD_SCRIPTS_DIR ${ULP_BOARD_SCRIPTS_DIR} + ABSOLUTE) + + set(ULP_CODE_HEADER ${ULP_FOLDER}/ulp_code.h) + set(ULP_VAR_MAP_HEADER ${ULP_ARCH_FOLDER}/ulp_var_map.h) + set(ULP_VARS_HEADER ${ULP_ARCH_FOLDER}/ulp_vars.h) + set(ULP_ALIASES_LD ${ULP_BOARD_SCRIPTS_DIR}/ulp_aliases.ld) + set(ULP_MAIN_HEADER ${ULP_FOLDER}/ulp_main.h) + set(ULP_MAIN_LD ${ULP_FOLDER}/ulp_main.ld) + set(ULP_LOCKFILE ${ULP_VAR_MAP_HEADER}.lock) + set(ULP_PREFIX ${ULP_APP_NAME}_) + set(ULP_BASE 0) + + if(NOT ESP_HAL_3RDPARTY_REPO) + get_filename_component( + ESP_HAL_3RDPARTY_REPO + "${CMAKE_BINARY_DIR}/arch/${CONFIG_ARCH}/src/common/espressif/esp-hal-3rdparty" + REALPATH) + endif() + + set(HAL ${ESP_HAL_3RDPARTY_REPO}) + + set(ULP_LPCORE_SECTIONS_LD + ${ULP_BOARD_SCRIPTS_DIR}/${CHIP_SERIES}_lpcore_sections.ld) + set(ULP_SECTIONS_LD ${ULP_FOLDER}/ulp_sections.ld) + set(ULP_MAPGEN_TOOL ${HAL}/components/ulp/esp32ulp_mapgen.py) + + find_program(XXD_PROGRAM xxd REQUIRED) + find_package(Python3 REQUIRED COMPONENTS Interpreter) + get_filename_component(_ulp_toolchain_bin ${CMAKE_OBJCOPY} DIRECTORY) + find_program(ULP_READELF readelf HINTS ${_ulp_toolchain_bin} REQUIRED) + + # ############################################################################ + # Include paths + # ############################################################################ + + set(ULP_INCLUDE_DIRS + ${HAL} + ${ULP_ARCH_FOLDER} + ${HAL}/components/esp_common/include + ${HAL}/components/esp_hal_ana_conv/include + ${HAL}/components/esp_hal_ana_conv/${CHIP_SERIES}/include + ${HAL}/components/esp_hal_clock/include + ${HAL}/components/esp_hal_clock/${CHIP_SERIES}/include + ${HAL}/components/esp_hal_gpio/include + ${HAL}/components/esp_hal_gpio/${CHIP_SERIES}/include + ${HAL}/components/esp_hal_gpspi/include + ${HAL}/components/esp_hal_gpspi/${CHIP_SERIES}/include + ${HAL}/components/esp_hal_i2c/include + ${HAL}/components/esp_hal_i2c/${CHIP_SERIES}/include + ${HAL}/components/esp_hal_pmu/include + ${HAL}/components/esp_hal_pmu/${CHIP_SERIES}/include + ${HAL}/components/esp_hal_rtc_timer/include + ${HAL}/components/esp_hal_rtc_timer/${CHIP_SERIES}/include + ${HAL}/components/esp_hal_uart/include + ${HAL}/components/esp_hal_uart/${CHIP_SERIES}/include + ${HAL}/components/esp_hw_support/include + ${HAL}/components/esp_hw_support/port/${CHIP_SERIES}/include + ${HAL}/components/esp_hw_support/port/${CHIP_SERIES}/private_include + ${HAL}/components/esp_rom + ${HAL}/components/esp_rom/include + ${HAL}/components/esp_rom/${CHIP_SERIES} + ${HAL}/components/esp_rom/${CHIP_SERIES}/include + ${HAL}/components/esp_rom/${CHIP_SERIES}/include/${CHIP_SERIES} + ${HAL}/components/hal/include + ${HAL}/components/hal/platform_port/include + ${HAL}/components/log + ${HAL}/components/log/include + ${HAL}/components/riscv/include + ${HAL}/components/soc + ${HAL}/components/soc/include + ${HAL}/components/soc/${CHIP_SERIES} + ${HAL}/components/soc/${CHIP_SERIES}/include + ${HAL}/components/hal/${CHIP_SERIES}/include + ${HAL}/components/soc/${CHIP_SERIES}/register + ${HAL}/components/soc/${CHIP_SERIES}/register/soc + ${HAL}/components/ulp + ${HAL}/components/ulp/ulp_common + ${HAL}/components/ulp/ulp_common/include + ${HAL}/components/ulp/lp_core + ${HAL}/components/ulp/lp_core/lp_core + ${HAL}/components/ulp/lp_core/include + ${HAL}/components/ulp/lp_core/shared + ${HAL}/components/ulp/lp_core/lp_core/include + ${HAL}/components/ulp/lp_core/shared/include + ${HAL}/components/upper_hal_uart/include + ${HAL}/nuttx/include + ${HAL}/nuttx/${CHIP_SERIES}/include + ${HAL}/nuttx/src/components/esp_driver_uart/include) + + if(CONFIG_ARCH_CHIP_ESP32P4) + if(NOT CONFIG_ESP32P4_SELECTS_REV_LESS_V3) + list(APPEND ULP_INCLUDE_DIRS + ${HAL}/components/soc/${CHIP_SERIES}/register/hw_ver3 + ${HAL}/components/soc/${CHIP_SERIES}/register/soc/) + else() + list(APPEND ULP_INCLUDE_DIRS + ${HAL}/components/soc/${CHIP_SERIES}/register/hw_ver1 + ${HAL}/components/soc/${CHIP_SERIES}/register/soc/) + endif() + list( + APPEND + ULP_INCLUDE_DIRS + ${HAL}/components/esp_adc/include + ${HAL}/components/esp_adc/${CHIP_SERIES}/include + ${HAL}/components/esp_hal_i2s/include + ${HAL}/components/esp_hal_i2s/${CHIP_SERIES}/include + ${HAL}/components/esp_hal_touch_sens/include + ${HAL}/components/esp_hal_touch_sens/${CHIP_SERIES}/include + ${HAL}/components/esp_system/ld + ${HAL}/components/upper_hal_i2s/include) + endif() + + # ############################################################################ + # Linker scripts + # ############################################################################ + + set(ULP_LDSCRIPTS + -T${HAL}/components/soc/${CHIP_SERIES}/ld/${CHIP_SERIES}.peripherals.ld + -T${ULP_SECTIONS_LD}) + + if(CONFIG_ARCH_CHIP_ESP32P4) + list( + APPEND + ULP_LDSCRIPTS + -T${HAL}/components/esp_rom/${CHIP_SERIES}/ld/${CHIP_SERIES}lp.rom.ld + -T${HAL}/components/esp_rom/${CHIP_SERIES}/ld/${CHIP_SERIES}lp.rom.newlib.ld + -T${HAL}/components/esp_rom/${CHIP_SERIES}/ld/${CHIP_SERIES}lp.rom.version.ld + -T${HAL}/components/esp_rom/${CHIP_SERIES}/ld/${CHIP_SERIES}lp.rom.api.ld) + endif() + + # ############################################################################ + # HAL / LP-core sources + # ############################################################################ + + set(ULP_ASOURCES + ${HAL}/components/ulp/lp_core/lp_core/port/${CHIP_SERIES}/vector_table.S + ${HAL}/components/ulp/lp_core/lp_core/start.S + ${HAL}/components/ulp/lp_core/lp_core/vector.S) + + set(ULP_CSOURCES + ${HAL}/components/ulp/lp_core/lp_core/lp_core_spi.c + ${HAL}/components/ulp/lp_core/shared/ulp_lp_core_memory_shared.c + ${HAL}/components/ulp/lp_core/shared/ulp_lp_core_lp_uart_shared.c + ${HAL}/components/ulp/lp_core/shared/ulp_lp_core_lp_timer_shared.c + ${HAL}/components/esp_hal_uart/uart_hal_iram.c + ${HAL}/components/esp_hal_uart/uart_hal.c + ${HAL}/components/ulp/lp_core/lp_core/lp_core_i2c.c + ${HAL}/components/ulp/lp_core/lp_core/lp_core_startup.c + ${HAL}/components/ulp/lp_core/lp_core/lp_core_utils.c + ${HAL}/components/ulp/lp_core/lp_core/lp_core_uart.c + ${HAL}/components/ulp/lp_core/lp_core/lp_core_print.c + ${HAL}/components/ulp/lp_core/lp_core/lp_core_panic.c + ${HAL}/components/ulp/lp_core/lp_core/lp_core_interrupt.c + ${HAL}/components/ulp/lp_core/lp_core/lp_core_ubsan.c + ${HAL}/components/ulp/lp_core/shared/ulp_lp_core_lp_adc_shared.c + ${HAL}/components/ulp/lp_core/shared/ulp_lp_core_lp_vad_shared.c + ${HAL}/components/ulp/lp_core/shared/ulp_lp_core_critical_section_shared.c + ) + + if(CONFIG_ARCH_CHIP_ESP32P4) + list( + APPEND ULP_CSOURCES ${HAL}/components/ulp/lp_core/lp_core/lp_core_touch.c + ${HAL}/components/ulp/lp_core/lp_core/port/lp_core_mailbox_impl_hw.c + ${HAL}/components/ulp/lp_core/lp_core/lp_core_mailbox.c) + endif() + + # ############################################################################ + # Shared chip-level stubs + # ############################################################################ + + if(NOT TARGET esp_ulp_shared_stubs) + set(_ESP_ULP_BASH_WRITE_VAR_MAP_INIT + [=[printf '%s\n' '#include "nuttx/symtab.h"' '#include "ulp/ulp_vars.h"' '' 'struct ulp_var_map_s' '{' ' struct symtab_s sym;' ' size_t size;' '};' '' 'struct ulp_var_map_s ulp_var_map[] =' '{ };' > "@ULP_VAR_MAP_HEADER@"]=] + ) + string(REPLACE "@ULP_VAR_MAP_HEADER@" "${ULP_VAR_MAP_HEADER}" + _ESP_ULP_BASH_WRITE_VAR_MAP_INIT + "${_ESP_ULP_BASH_WRITE_VAR_MAP_INIT}") + + add_custom_command( + OUTPUT ${ULP_VARS_HEADER} ${ULP_VAR_MAP_HEADER} ${ULP_ALIASES_LD} + COMMAND ${CMAKE_COMMAND} -E make_directory ${ULP_ARCH_FOLDER} + COMMAND ${CMAKE_COMMAND} -E make_directory ${ULP_BOARD_SCRIPTS_DIR} + COMMAND ${CMAKE_COMMAND} -E touch ${ULP_VARS_HEADER} + COMMAND ${CMAKE_COMMAND} -E touch ${ULP_ALIASES_LD} + COMMAND bash -c "${_ESP_ULP_BASH_WRITE_VAR_MAP_INIT}" + COMMENT "Creating shared ULP stub files" + VERBATIM) + + add_custom_target(esp_ulp_shared_stubs DEPENDS ${ULP_VARS_HEADER}) + add_dependencies(arch esp_ulp_shared_stubs) + endif() + + # ############################################################################ + # Compiler / linker flags + # ############################################################################ + + set(ULP_COMPILE_OPTS -Os -ggdb -march=rv32imac_zicsr_zifencei -mdiv + -fdata-sections -ffunction-sections) + set(ULP_ASM_OPTS -Os -ggdb -march=rv32imac_zicsr_zifencei -x + assembler-with-cpp -D__ASSEMBLER__) + set(ULP_LINK_OPTS + -march=rv32imac_zicsr_zifencei --specs=nano.specs --specs=nosys.specs + -nostartfiles -Wl,--no-warn-rwx-segments -Wl,--gc-sections) + + if(CONFIG_DEBUG_SYMBOLS) + set(ULP_COMPILE_OPTS -O0 -ggdb -march=rv32imac_zicsr_zifencei -mdiv + -fdata-sections -ffunction-sections) + set(ULP_ASM_OPTS -O0 -ggdb -march=rv32imac_zicsr_zifencei -x + assembler-with-cpp -D__ASSEMBLER__) + if(CONFIG_ESPRESSIF_ULP_ENABLE_UBSAN) + list(APPEND ULP_COMPILE_OPTS -fno-sanitize=shift-base + -fsanitize=undefined) + list(APPEND ULP_ASM_OPTS -fno-sanitize=shift-base -fsanitize=undefined) + endif() + endif() + + foreach(_ulp_inc ${ULP_INCLUDE_DIRS}) + list(APPEND ULP_INCLUDE_FLAGS -I${_ulp_inc}) + endforeach() + + # ############################################################################ + # Build + # ############################################################################ + + if(DEFINED ULP_APP_BIN AND ULP_APP_BIN MATCHES "\\.bin$") + set(ULP_BIN_FILE_PATH ${ULP_APP_BIN}) + + if(NOT EXISTS "${ULP_BIN_FILE_PATH}") + message(FATAL_ERROR "ULP prebuilt binary not found: ${ULP_BIN_FILE_PATH}") + endif() + + add_custom_command( + OUTPUT ${ULP_CODE_HEADER} + COMMAND ${CMAKE_COMMAND} -E make_directory ${ULP_FOLDER} + COMMAND ${XXD_PROGRAM} -i ${ULP_BIN_FILE_PATH} ${ULP_CODE_HEADER} + COMMAND + sed -i + "s/unsigned char[^[]*\\[[^]]*\\]/unsigned char ${ULP_APP_NAME}_bin[]/g" + ${ULP_CODE_HEADER} + COMMAND + sed -i "s/unsigned int[^=]* =/unsigned int ${ULP_APP_NAME}_bin_len =/g" + ${ULP_CODE_HEADER} + DEPENDS ${ULP_BIN_FILE_PATH} ${ULP_VAR_MAP_HEADER} + COMMENT "Converting ULP prebuilt binary into header file" + VERBATIM) + else() + if(NOT ULP_APP_C_SRCS AND NOT ULP_APP_ASM_SRCS) + message( + FATAL_ERROR + "ULP source build requires ULP_APP_C_SRCS and/or ULP_APP_ASM_SRCS") + endif() + + set(ULP_BIN_FILE ${ULP_FOLDER}/ulp.bin) + set(ULP_BIN_FILE_PATH ${ULP_BIN_FILE}) + set(ULP_ELF_FILE ${ULP_FOLDER}/ulp.elf) + set(ULP_MAP_FILE ${ULP_FOLDER}/ulp.map) + set(ULP_SYM_FILE ${ULP_FOLDER}/ulp.sym) + set(ULP_NUTTX_CONFIG_COPY ${ULP_FOLDER}/nuttx/config.h) + + foreach(_ulp_csrc ${ULP_APP_C_SRCS}) + list(APPEND ULP_APP_C_SOURCES ${ULP_APP_FOLDER}/${_ulp_csrc}) + endforeach() + + foreach(_ulp_asrc ${ULP_APP_ASM_SRCS}) + list(APPEND ULP_APP_ASM_SOURCES ${ULP_APP_FOLDER}/${_ulp_asrc}) + endforeach() + + if(ULP_APP_INCLUDES) + foreach(_ulp_incl ${ULP_APP_INCLUDES}) + get_filename_component(_ulp_incl_dir ${_ulp_incl} DIRECTORY) + list(APPEND ULP_APP_INCLUDE_DIRS ${_ulp_incl_dir}) + endforeach() + list(REMOVE_DUPLICATES ULP_APP_INCLUDE_DIRS) + list(APPEND ULP_INCLUDE_DIRS ${ULP_APP_INCLUDE_DIRS}) + set(ULP_INCLUDE_FLAGS) + foreach(_ulp_inc ${ULP_INCLUDE_DIRS}) + list(APPEND ULP_INCLUDE_FLAGS -I${_ulp_inc}) + endforeach() + endif() + + list(APPEND ULP_INCLUDE_DIRS ${ULP_FOLDER}) + list(APPEND ULP_INCLUDE_FLAGS -I${ULP_FOLDER}) + list(APPEND ULP_CSOURCES ${ULP_APP_C_SOURCES}) + list(APPEND ULP_ASOURCES ${ULP_APP_ASM_SOURCES}) + + if(NOT EXISTS ${ULP_LPCORE_SECTIONS_LD}) + message( + FATAL_ERROR "ULP linker template not found: ${ULP_LPCORE_SECTIONS_LD}") + endif() + + add_custom_command( + OUTPUT ${ULP_NUTTX_CONFIG_COPY} + COMMAND ${CMAKE_COMMAND} -E make_directory ${ULP_FOLDER}/nuttx + COMMAND + ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/include/nuttx/config.h + ${ULP_NUTTX_CONFIG_COPY} + DEPENDS nuttx_context ${ULP_VAR_MAP_HEADER} + COMMENT "Copying nuttx/config.h for ULP build" + VERBATIM) + + add_custom_command( + OUTPUT ${ULP_SECTIONS_LD} + COMMAND ${CMAKE_C_COMPILER} ${ULP_INCLUDE_FLAGS} -E -P -xc -o + ${ULP_SECTIONS_LD} ${ULP_LPCORE_SECTIONS_LD} + DEPENDS ${ULP_NUTTX_CONFIG_COPY} ${ULP_LPCORE_SECTIONS_LD} + COMMENT "Preprocessing ULP linker sections" + VERBATIM) + + add_custom_target(${ULP_PREPARE_TARGET} DEPENDS ${ULP_NUTTX_CONFIG_COPY} + ${ULP_SECTIONS_LD}) + + add_library(${ULP_FIRMWARE_TARGET} OBJECT ${ULP_CSOURCES} ${ULP_ASOURCES}) + add_dependencies(${ULP_FIRMWARE_TARGET} ${ULP_PREPARE_TARGET}) + if(TARGET copy_esp3rdparty_headers) + add_dependencies(${ULP_FIRMWARE_TARGET} copy_esp3rdparty_headers) + endif() + + set_source_files_properties( + ${ULP_CSOURCES} ${ULP_ASOURCES} PROPERTIES OBJECT_DEPENDS + "${ULP_NUTTX_CONFIG_COPY}") + + target_include_directories(${ULP_FIRMWARE_TARGET} + PRIVATE ${ULP_INCLUDE_DIRS}) + target_compile_definitions(${ULP_FIRMWARE_TARGET} PRIVATE IS_ULP_COCPU) + target_compile_options( + ${ULP_FIRMWARE_TARGET} + PRIVATE ${ULP_COMPILE_OPTS} + -include + ${HAL}/nuttx/${CHIP_SERIES}/include/sdkconfig.h + -Wno-shadow + -Wno-undef + -Wno-unused-variable + -Wno-strict-prototypes + -Wno-deprecated-declarations + $<$:${ULP_ASM_OPTS}>) + + add_custom_command( + OUTPUT ${ULP_ELF_FILE} + COMMAND + ${CMAKE_C_COMPILER} ${ULP_LINK_OPTS} ${ULP_LDSCRIPTS} -Xlinker + -Map=${ULP_MAP_FILE} "$" -o + ${ULP_ELF_FILE} + COMMAND_EXPAND_LISTS + DEPENDS ${ULP_FIRMWARE_TARGET} ${ULP_SECTIONS_LD} + COMMENT "Linking ULP firmware" + VERBATIM) + + set(_ulp_postprocess_aliases + [=[grep -E '^[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*=[[:space:]]*[0x]*[0-9a-fA-F]+;' "@ULP_MAIN_LD@" | while IFS= read -r line; do var_name=$(echo "$line" | sed -E 's/^[[:space:]]*([a-zA-Z_][a-zA-Z0-9_]*).*/\1/'); existing_line=$(grep -E "^[[:space:]]*${var_name}[[:space:]]*=" "@ULP_ALIASES_LD@" 2>/dev/null || true); if [ -n "$existing_line" ]; then if [ "$existing_line" != "$line" ]; then sed -i "/${existing_line}/c\\${line}" "@ULP_ALIASES_LD@"; fi; else echo "$line" >> "@ULP_ALIASES_LD@"; fi; done]=] + ) + string(REPLACE "@ULP_MAIN_LD@" "${ULP_MAIN_LD}" _ulp_postprocess_aliases + "${_ulp_postprocess_aliases}") + string(REPLACE "@ULP_ALIASES_LD@" "${ULP_ALIASES_LD}" + _ulp_postprocess_aliases "${_ulp_postprocess_aliases}") + + set(_ulp_postprocess_var_map + [=[if ! grep -q "struct ulp_var_map_s ulp_var_map" "@ULP_VAR_MAP_HEADER@"; then printf '%s\n' '#include "nuttx/symtab.h"' '#include "ulp/ulp_vars.h"' '' 'struct ulp_var_map_s' '{' ' struct symtab_s sym;' ' size_t size;' '};' '' 'struct ulp_var_map_s ulp_var_map[] =' '{ };' > "@ULP_VAR_MAP_HEADER@"; fi; sed -i "/@ULP_PREFIX@/d" "@ULP_VAR_MAP_HEADER@"; flock -x "@ULP_LOCKFILE@" -c 'grep "@ULP_PREFIX@" "@ULP_MAIN_HEADER@" | while IFS= read -r line; do var=$(echo "$line" | grep -oP "@ULP_PREFIX@\w+(?=[;\[])" ); if [ -n "$var" ]; then size=$(echo "$line" | grep -oP "\[\d+\]" | grep -oP "\d+"); if [ -n "$size" ]; then size=$(( size * 4 )); else size=4; fi; sed -i "s/ };//" "@ULP_VAR_MAP_HEADER@"; echo -ne " { .sym.sym_name = \"${var}\", .sym.sym_value = &${var}, .size = ${size}},\n };" >> "@ULP_VAR_MAP_HEADER@"; fi; done']=] + ) + string(REPLACE "@ULP_VAR_MAP_HEADER@" "${ULP_VAR_MAP_HEADER}" + _ulp_postprocess_var_map "${_ulp_postprocess_var_map}") + string(REPLACE "@ULP_LOCKFILE@" "${ULP_LOCKFILE}" _ulp_postprocess_var_map + "${_ulp_postprocess_var_map}") + string(REPLACE "@ULP_MAIN_HEADER@" "${ULP_MAIN_HEADER}" + _ulp_postprocess_var_map "${_ulp_postprocess_var_map}") + string(REPLACE "@ULP_PREFIX@" "${ULP_PREFIX}" _ulp_postprocess_var_map + "${_ulp_postprocess_var_map}") + + add_custom_command( + OUTPUT ${ULP_CODE_HEADER} ${ULP_BIN_FILE} ${ULP_SYM_FILE} + ${ULP_MAIN_HEADER} ${ULP_MAIN_LD} + COMMAND ${CMAKE_COMMAND} -E make_directory ${ULP_FOLDER} + COMMAND ${CMAKE_OBJCOPY} -O binary ${ULP_ELF_FILE} ${ULP_BIN_FILE} + COMMAND ${ULP_READELF} -sW ${ULP_ELF_FILE} > ${ULP_SYM_FILE} + COMMAND ${Python3_EXECUTABLE} ${ULP_MAPGEN_TOOL} -s ${ULP_SYM_FILE} -o + ${ULP_FOLDER}/ulp_main --base ${ULP_BASE} --prefix ${ULP_PREFIX} + COMMAND bash -c "${_ulp_postprocess_aliases}" + COMMAND sed -i "/${ULP_PREFIX}/d" ${ULP_VARS_HEADER} + COMMAND + bash -c + "grep \"extern uint32_t\" \"${ULP_MAIN_HEADER}\" >> \"${ULP_VARS_HEADER}\"" + COMMAND bash -c "${_ulp_postprocess_var_map}" + COMMAND ${XXD_PROGRAM} -i ${ULP_BIN_FILE_PATH} ${ULP_CODE_HEADER} + COMMAND + sed -i + "s/unsigned char[^[]*\\[[^]]*\\]/unsigned char ${ULP_APP_NAME}_bin[]/g" + ${ULP_CODE_HEADER} + COMMAND + sed -i "s/unsigned int[^=]* =/unsigned int ${ULP_APP_NAME}_bin_len =/g" + ${ULP_CODE_HEADER} + DEPENDS ${ULP_ELF_FILE} ${ULP_VAR_MAP_HEADER} + COMMENT "Generating ULP binary, symbol map, and headers" + VERBATIM) + endif() + + add_custom_target(${ULP_BIN_TARGET} DEPENDS ${ULP_CODE_HEADER}) + if(TARGET ${ULP_PREPARE_TARGET}) + add_dependencies(${ULP_BIN_TARGET} ${ULP_PREPARE_TARGET}) + endif() + add_dependencies(board ${ULP_BIN_TARGET}) + add_dependencies(arch ${ULP_BIN_TARGET}) + + set_property(GLOBAL APPEND PROPERTY ESP_ULP_BIN_TARGETS ${ULP_BIN_TARGET}) + + function(_esp_ulp_add_nuttx_link_deps) + get_property(_esp_ulp_bins GLOBAL PROPERTY ESP_ULP_BIN_TARGETS) + if(NOT _esp_ulp_bins) + return() + endif() + + foreach(_esp_ulp_bin_target ${_esp_ulp_bins}) + if(TARGET ${_esp_ulp_bin_target}) + add_dependencies(nuttx ${_esp_ulp_bin_target}) + if(TARGET ldscript_tmp_ulp_aliases.ld) + add_dependencies(ldscript_tmp_ulp_aliases.ld ${_esp_ulp_bin_target}) + endif() + endif() + endforeach() + + if(TARGET ldscript_tmp_ulp_aliases.ld AND TARGET esp_ulp_shared_stubs) + add_dependencies(ldscript_tmp_ulp_aliases.ld esp_ulp_shared_stubs) + endif() + endfunction() + + get_property(_esp_ulp_defer GLOBAL PROPERTY ESP_ULP_LINK_DEFER_REGISTERED) + if(NOT _esp_ulp_defer) + set_property(GLOBAL PROPERTY ESP_ULP_LINK_DEFER_REGISTERED TRUE) + cmake_language(DEFER DIRECTORY ${CMAKE_SOURCE_DIR} CALL + _esp_ulp_add_nuttx_link_deps) + endif() + + # ############################################################################ + # Clean hook + # ############################################################################ + + set_property( + DIRECTORY ${CMAKE_SOURCE_DIR} + APPEND + PROPERTY ADDITIONAL_CLEAN_FILES ${ULP_FOLDER} ${ULP_ARCH_FOLDER} + ${ULP_ALIASES_LD} ${ULP_ARCH_FOLDER}/.ulp_shared_stubs_stamp) + +endif() diff --git a/arch/risc-v/src/common/espressif/ulp.cmake b/arch/risc-v/src/common/espressif/ulp.cmake new file mode 100644 index 00000000000..fd315997a1b --- /dev/null +++ b/arch/risc-v/src/common/espressif/ulp.cmake @@ -0,0 +1,31 @@ +# ############################################################################## +# arch/risc-v/src/common/espressif/ulp.cmake +# +# SPDX-License-Identifier: Apache-2.0 +# +# 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. +# +# ############################################################################## + +set(ULP_APP_USE_TEST_BIN TRUE) + +set(ULP_APP_NAME esp_ulp) +set(ULP_APP_FOLDER ${NUTTX_CHIP_ABS_DIR}) +set(ULP_APP_BIN + ${NUTTX_DIR}/Documentation/platforms/risc-v/${CONFIG_ARCH_CHIP}/boards/${CONFIG_ARCH_BOARD}/ulp_blink.bin +) + +include(${NUTTX_DIR}/arch/risc-v/src/common/espressif/esp_ulp.cmake) diff --git a/arch/risc-v/src/esp32c6/hal_esp32c6.cmake b/arch/risc-v/src/esp32c6/hal_esp32c6.cmake index 76e8a64e592..897a290a7e5 100644 --- a/arch/risc-v/src/esp32c6/hal_esp32c6.cmake +++ b/arch/risc-v/src/esp32c6/hal_esp32c6.cmake @@ -199,8 +199,11 @@ set(_esp32c6_rom_ld_files ${ESP_SOC_LD_DIR}/${CHIP_SERIES}.peripherals.ld) if(CONFIG_ESPRESSIF_USE_LP_CORE) - list(APPEND _esp32c6_rom_ld_files - ${NUTTX_DIR}/arch/${CONFIG_ARCH}/src/board/scripts/ulp_aliases.ld) + list( + APPEND + _esp32c6_rom_ld_files + ${NUTTX_DIR}/boards/${CONFIG_ARCH}/${CHIP_SERIES}/common/scripts/ulp_aliases.ld + ) endif() if(CONFIG_ESPRESSIF_SPI_FLASH_USE_ROM_CODE) diff --git a/arch/risc-v/src/esp32h2/hal_esp32h2.cmake b/arch/risc-v/src/esp32h2/hal_esp32h2.cmake index 15aa30e8297..dd9db692347 100644 --- a/arch/risc-v/src/esp32h2/hal_esp32h2.cmake +++ b/arch/risc-v/src/esp32h2/hal_esp32h2.cmake @@ -197,11 +197,6 @@ set(_esp32h2_rom_ld_files ${ESP_RISCV_LD_DIR}/rom.api.ld ${ESP_SOC_LD_DIR}/${CHIP_SERIES}.peripherals.ld) -if(CONFIG_ESPRESSIF_USE_LP_CORE) - list(APPEND _esp32h2_rom_ld_files - ${NUTTX_DIR}/arch/${CONFIG_ARCH}/src/board/scripts/ulp_aliases.ld) -endif() - if(CONFIG_ESPRESSIF_SPI_FLASH_USE_ROM_CODE) list(APPEND _esp32h2_rom_ld_files ${ESP_ROM_LD_DIR}/${CHIP_SERIES}.rom.spiflash.ld) diff --git a/arch/risc-v/src/esp32p4/hal_esp32p4.cmake b/arch/risc-v/src/esp32p4/hal_esp32p4.cmake index eb0e8e65929..18df08eb17c 100644 --- a/arch/risc-v/src/esp32p4/hal_esp32p4.cmake +++ b/arch/risc-v/src/esp32p4/hal_esp32p4.cmake @@ -225,10 +225,12 @@ list( ${ESP_SOC_LD_DIR}/${CHIP_SERIES}.peripherals.ld ${ESP_RISCV_LD_DIR}/rom.api.ld) -# Review the path below when ULP core is implemented on CMake if(CONFIG_ESPRESSIF_USE_LP_CORE) - list(APPEND _esp32p4_rom_ld_files - ${TOPDIR}/arch/${CONFIG_ARCH}/src/board/scripts/ulp_aliases.ld) + list( + APPEND + _esp32p4_rom_ld_files + ${NUTTX_DIR}/boards/${CONFIG_ARCH}/${CHIP_SERIES}/common/scripts/ulp_aliases.ld + ) endif() # Add these files to the GLOBAL PROPERTY LD_SCRIPT