diff --git a/arch/risc-v/src/common/espressif/esp_ulp.cmake b/arch/risc-v/src/common/espressif/esp_ulp.cmake index 95a1de95933..cc9961b8acc 100644 --- a/arch/risc-v/src/common/espressif/esp_ulp.cmake +++ b/arch/risc-v/src/common/espressif/esp_ulp.cmake @@ -74,6 +74,9 @@ if(CONFIG_ESPRESSIF_USE_LP_CORE) set(ULP_LPCORE_SECTIONS_LD ${ULP_BOARD_SCRIPTS_DIR}/${CHIP_SERIES}_lpcore_sections.ld) + if(ULP_CUSTOM_SECTIONS_LD) + set(ULP_LPCORE_SECTIONS_LD ${ULP_CUSTOM_SECTIONS_LD}) + endif() set(ULP_SECTIONS_LD ${ULP_FOLDER}/ulp_sections.ld) set(ULP_MAPGEN_TOOL ${HAL}/components/ulp/esp32ulp_mapgen.py) @@ -116,6 +119,8 @@ if(CONFIG_ESPRESSIF_USE_LP_CORE) ${HAL}/components/esp_rom/${CHIP_SERIES}/include/${CHIP_SERIES} ${HAL}/components/hal/include ${HAL}/components/hal/platform_port/include + ${HAL}/components/esp_hal_wdt/include + ${HAL}/components/esp_hal_wdt/${CHIP_SERIES}/include ${HAL}/components/log ${HAL}/components/log/include ${HAL}/components/riscv/include @@ -311,17 +316,29 @@ if(CONFIG_ESPRESSIF_USE_LP_CORE) 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}) + if(IS_ABSOLUTE "${_ulp_csrc}") + list(APPEND ULP_APP_C_SOURCES ${_ulp_csrc}) + else() + list(APPEND ULP_APP_C_SOURCES ${ULP_APP_FOLDER}/${_ulp_csrc}) + endif() endforeach() foreach(_ulp_asrc ${ULP_APP_ASM_SRCS}) - list(APPEND ULP_APP_ASM_SOURCES ${ULP_APP_FOLDER}/${_ulp_asrc}) + if(IS_ABSOLUTE "${_ulp_asrc}") + list(APPEND ULP_APP_ASM_SOURCES ${_ulp_asrc}) + else() + list(APPEND ULP_APP_ASM_SOURCES ${ULP_APP_FOLDER}/${_ulp_asrc}) + endif() 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}) + if(IS_DIRECTORY "${_ulp_incl}") + list(APPEND ULP_APP_INCLUDE_DIRS ${_ulp_incl}) + else() + get_filename_component(_ulp_incl_dir ${_ulp_incl} DIRECTORY) + list(APPEND ULP_APP_INCLUDE_DIRS ${_ulp_incl_dir}) + endif() endforeach() list(REMOVE_DUPLICATES ULP_APP_INCLUDE_DIRS) list(APPEND ULP_INCLUDE_DIRS ${ULP_APP_INCLUDE_DIRS}) @@ -375,6 +392,10 @@ if(CONFIG_ESPRESSIF_USE_LP_CORE) target_include_directories(${ULP_FIRMWARE_TARGET} PRIVATE ${ULP_INCLUDE_DIRS}) target_compile_definitions(${ULP_FIRMWARE_TARGET} PRIVATE IS_ULP_COCPU) + if(ULP_EXTRA_DEFINES) + target_compile_definitions(${ULP_FIRMWARE_TARGET} + PRIVATE ${ULP_EXTRA_DEFINES}) + endif() target_compile_options( ${ULP_FIRMWARE_TARGET} PRIVATE ${ULP_COMPILE_OPTS} @@ -408,7 +429,7 @@ if(CONFIG_ESPRESSIF_USE_LP_CORE) _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']=] + [=[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@"; printf " { .sym.sym_name = \"%s\", .sym.sym_value = &%s, .size = %s},\n };" "${var}" "${var}" "${size}" >> "@ULP_VAR_MAP_HEADER@"; fi; done']=] ) string(REPLACE "@ULP_VAR_MAP_HEADER@" "${ULP_VAR_MAP_HEADER}" _ulp_postprocess_var_map "${_ulp_postprocess_var_map}") diff --git a/arch/risc-v/src/common/espressif/esp_ulp.mk b/arch/risc-v/src/common/espressif/esp_ulp.mk index 26db0f2d42b..4095b0c13fa 100644 --- a/arch/risc-v/src/common/espressif/esp_ulp.mk +++ b/arch/risc-v/src/common/espressif/esp_ulp.mk @@ -63,6 +63,8 @@ ULP_INCLUDES += $(INCDIR_PREFIX)$(CHIP)$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)c ULP_INCLUDES += $(INCDIR_PREFIX)$(CHIP)$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)include ULP_INCLUDES += $(INCDIR_PREFIX)$(CHIP)$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)include ULP_INCLUDES += $(INCDIR_PREFIX)$(CHIP)$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)platform_port$(DELIM)include +ULP_INCLUDES += $(INCDIR_PREFIX)$(CHIP)$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_hal_wdt$(DELIM)include +ULP_INCLUDES += $(INCDIR_PREFIX)$(CHIP)$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_hal_wdt$(DELIM)$(CHIP_SERIES)$(DELIM)include ULP_INCLUDES += $(INCDIR_PREFIX)$(CHIP)$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)log ULP_INCLUDES += $(INCDIR_PREFIX)$(CHIP)$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)log$(DELIM)include ULP_INCLUDES += $(INCDIR_PREFIX)$(CHIP)$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)riscv$(DELIM)include @@ -159,8 +161,8 @@ else ULP_BIN_FILE = $(ULP_FOLDER)$(DELIM)ulp.bin ULP_BIN_FILE_PATH = $(ULP_BIN_FILE) - ULP_C_SRCS = $(addprefix $(ULP_APP_FOLDER)/,$(sort $(ULP_APP_C_SRCS))) - ULP_ASM_SRCS = $(addprefix $(ULP_APP_FOLDER)/,$(sort $(ULP_APP_ASM_SRCS))) + ULP_C_SRCS = $(foreach s,$(sort $(ULP_APP_C_SRCS)),$(if $(filter /%,$(s)),$(s),$(ULP_APP_FOLDER)/$(s))) + ULP_ASM_SRCS = $(foreach s,$(sort $(ULP_APP_ASM_SRCS)),$(if $(filter /%,$(s)),$(s),$(ULP_APP_FOLDER)/$(s))) ULP_APP_OBJS = $(ULP_ASM_SRCS:.S=_ulp.o) ULP_APP_OBJS += $(ULP_C_SRCS:.c=_ulp.o) @@ -250,6 +252,17 @@ ULP_LDFLAGS := \ -Xlinker -Map=$(ULP_MAP_FILE) \ $(ULP_LDINCLUDES) +# Optional compile defines (e.g. -DNUTTX_ESP_BIST_MODULE) — after := above +ULP_CFLAGS += $(ULP_EXTRA_DEFINES) +ULP_ASFLAGS += $(ULP_EXTRA_DEFINES) + +# Default LP sections linker template; apps may override with ULP_CUSTOM_SECTIONS_LD +ifeq ($(ULP_CUSTOM_SECTIONS_LD),) + ULP_SECTIONS_TEMPLATE = $(BOARD)$(DELIM)scripts$(DELIM)${CHIP_SERIES}_lpcore_sections.ld +else + ULP_SECTIONS_TEMPLATE = $(ULP_CUSTOM_SECTIONS_LD) +endif + # Build rules .PHONY: context depend @@ -261,15 +274,18 @@ checkpython3: exit 1; \ fi -%_ulp.o: %.c $(ULP_NUTTX_CONFIG) +%_ulp.o: %.c $(ULP_NUTTX_CONFIG) $(ULP_FOLDER)$(DELIM)ulp_sections.ld $(Q) echo "Compiling $< for ULP" $(Q) $(CC) $(ULP_CFLAGS) -c $< -o $@ - $(Q) $(CC) $(ULP_INCLUDES) -E -P -xc -o $(ULP_FOLDER)$(DELIM)ulp_sections.ld $(BOARD)$(DELIM)scripts$(DELIM)${CHIP_SERIES}_lpcore_sections.ld %_ulp.o: %.S $(ULP_NUTTX_CONFIG) $(Q) echo "Compiling $< for ULP" $(Q) $(CC) $(ULP_ASFLAGS) -c $< -o $@ +$(ULP_FOLDER)$(DELIM)ulp_sections.ld: $(ULP_NUTTX_CONFIG) $(ULP_SECTIONS_TEMPLATE) + $(Q) echo "Preprocessing ULP linker sections from $(ULP_SECTIONS_TEMPLATE)" + $(Q) $(CC) $(ULP_INCLUDES) -E -P -xc -o $@ $(ULP_SECTIONS_TEMPLATE) + $(ULP_NUTTX_CONFIG): $(ULP_FOLDER) $(Q) echo "Copying nuttx$(DELIM)config.h into $(ULP_FOLDER)$(DELIM)nuttx" $(Q) cp $(TOPDIR)$(DELIM)include$(DELIM)nuttx$(DELIM)config.h $(ULP_FOLDER)$(DELIM)nuttx @@ -277,6 +293,7 @@ $(ULP_NUTTX_CONFIG): $(ULP_FOLDER) $(ULP_ELF_FILE): $(ULP_OBJS) $(Q) echo "Linking for ULP" $(Q) $(CC) $(ULP_LDFLAGS) $(ULP_OBJS) -o $@ + $(ULP_POST_LINK) $(ULP_BIN_FILE): $(ULP_ELF_FILE) checkpython3 $(Q) \ @@ -317,7 +334,7 @@ ifneq ($(suffix $(ULP_APP_BIN)),.bin) 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); \ + printf " { .sym.sym_name = \"%s\", .sym.sym_value = &%s, .size = %s},\n };" "$${var}" "$${var}" "$${size}" >> $(ULP_VAR_MAP_HEADER); \ fi; \ done' endif