diff --git a/components/ulp/cmake/CMakeLists.txt b/components/ulp/cmake/CMakeLists.txt index db665973fe..8b39a30126 100644 --- a/components/ulp/cmake/CMakeLists.txt +++ b/components/ulp/cmake/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.16) include(${IDF_PATH}/tools/cmake/utilities.cmake) project(${ULP_APP_NAME} ASM C) +add_executable(${ULP_APP_NAME}) option(ULP_COCPU_IS_RISCV "Use RISC-V based ULP" OFF) @@ -19,26 +20,16 @@ set(as_version ${CMAKE_MATCH_1}) message(STATUS "Building ULP app ${ULP_APP_NAME}") -if(ULP_COCPU_IS_RISCV) - set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_riscv.ld) -else() +# Check the supported assembler version +if(NOT ULP_COCPU_IS_RISCV) message(STATUS "ULP assembler version: ${as_version}") - - # Check the supported assembler version - file(STRINGS ${IDF_PATH}/components/ulp/toolchain_ulp_version.mk version_file_contents) - string(REGEX MATCH - "SUPPORTED_ULP_ASSEMBLER_VERSION = (${version_pattern})" - as_supported_version - ${version_file_contents}) - set(as_supported_version ${CMAKE_MATCH_1}) + set(as_supported_version 2.28.51-esp-20191205) if(NOT as_version STREQUAL as_supported_version) message(WARNING "WARNING: ULP assembler version ${as_version} is not supported. Expected to see version: \ ${as_supported_version}. Please check ESP-IDF ULP setup instructions and update \ the toolchain, or proceed at your own risk.") endif() - - set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_fsm.ld) endif() @@ -53,20 +44,27 @@ list(APPEND ULP_PREPROCESSOR_ARGS ${component_includes}) list(APPEND ULP_PREPROCESSOR_ARGS -I${COMPONENT_DIR}) list(APPEND ULP_PREPROCESSOR_ARGS -I${sdkconfig_dir}) -include_directories(${COMPONENT_INCLUDES}) +target_include_directories(${ULP_APP_NAME} PRIVATE ${COMPONENT_INCLUDES}) list(APPEND ULP_PREPROCESSOR_ARGS -D__ASSEMBLER__) -# Preprocess linker script, pre-linking +# Pre-process the linker script +if(ULP_COCPU_IS_RISCV) + set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_riscv.ld) +else() + set(ULP_LD_TEMPLATE ${IDF_PATH}/components/ulp/ld/ulp_fsm.ld) +endif() get_filename_component(ULP_LD_SCRIPT ${ULP_LD_TEMPLATE} NAME) add_custom_command(OUTPUT ${ULP_LD_SCRIPT} COMMAND ${CMAKE_C_COMPILER} -E -P -xc -o ${ULP_LD_SCRIPT} ${ULP_PREPROCESSOR_ARGS} ${ULP_LD_TEMPLATE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${ULP_LD_TEMPLATE} ${SDKCONFIG_HEADER} + MAIN_DEPENDENCY ${ULP_LD_TEMPLATE} + DEPENDS ${SDKCONFIG_HEADER} + COMMENT "Generating ${ULP_LD_SCRIPT} linker script..." VERBATIM) -add_custom_target(${ULP_APP_NAME}_ld_script - DEPENDS ${ULP_LD_SCRIPT} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +add_custom_target(ld_script DEPENDS ${ULP_LD_SCRIPT}) +add_dependencies(${ULP_APP_NAME} ld_script) +target_link_options(${ULP_APP_NAME} PRIVATE SHELL:-T ${CMAKE_CURRENT_BINARY_DIR}/${ULP_LD_SCRIPT}) # To avoid warning "Manually-specified variables were not used by the project" set(bypassWarning "${IDF_TARGET}") @@ -80,30 +78,14 @@ if(ULP_COCPU_IS_RISCV) "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c" "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/ulp_riscv_utils.c") - #dummy loop to force pre-processed linker file generation: - foreach(ulp_s_source ${ULP_S_SOURCES}) - set(noop ${ulp_s_source}) - - add_custom_command(OUTPUT ${noop} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMAND cmake -E echo - DEPENDS ${ULP_LD_SCRIPT} - ) - - set_source_files_properties(${noop} PROPERTIES NOOP_PROPERTY ${ULP_LD_SCRIPT}) - endforeach() - - #creates the executable: - add_executable(${ULP_APP_NAME} ${ULP_S_SOURCES}) - set(DUMP_SYMBOL_ARGS -g) - set(MAP_GEN_EXTRA_ARGS --riscv) - set(EXTRA_LINKER_ARGS "-nostartfiles") - list(APPEND EXTRA_LINKER_ARGS "-Wl,--gc-sections") - list(APPEND EXTRA_LINKER_ARGS "-Wl,-Map=\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map\"") + target_link_options(${ULP_APP_NAME} PRIVATE "-nostartfiles") + target_link_options(${ULP_APP_NAME} PRIVATE -Wl,--gc-sections) + target_link_options(${ULP_APP_NAME} PRIVATE -Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map) + target_sources(${ULP_APP_NAME} PRIVATE ${ULP_S_SOURCES}) #Makes the csr utillies for riscv visible: target_include_directories(${ULP_APP_NAME} PRIVATE "${IDF_PATH}/components/ulp/ulp_riscv/ulp_core/include" "${IDF_PATH}/components/ulp/ulp_riscv/shared/include") - target_link_libraries(${ULP_APP_NAME} "-T \"${IDF_PATH}/components/ulp/ld/${IDF_TARGET}.periperals.ld\"") + target_link_options(${ULP_APP_NAME} PRIVATE SHELL:-T ${IDF_PATH}/components/ulp/ld/${IDF_TARGET}.peripherals.ld) target_compile_definitions(${ULP_APP_NAME} PRIVATE IS_ULP_COCPU) else() @@ -116,7 +98,7 @@ else() WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_C_COMPILER} -E -P -xc ${ULP_PREPROCESSOR_ARGS} -o ${ulp_ps_output} ${ulp_s_source} - DEPENDS ${ulp_s_source} ${ULP_LD_SCRIPT} + DEPENDS ${ulp_s_source} VERBATIM) # During assembly file compilation, output listing files as well. set_source_files_properties(${ulp_ps_output} @@ -125,17 +107,18 @@ else() list(APPEND ULP_PS_SOURCES ${ulp_ps_output}) endforeach() - # Create an executable - add_executable(${ULP_APP_NAME} ${ULP_PS_SOURCES}) - set(DUMP_SYMBOL_ARGS -g -f posix) - set(MAP_GEN_EXTRA_ARGS .) - set(EXTRA_LINKER_ARGS "-Map=\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map\"") + target_link_options(${ULP_APP_NAME} PRIVATE -Map=${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.map) + target_sources(${ULP_APP_NAME} PRIVATE ${ULP_PS_SOURCES}) endif() +# Currently all the supported targets have the same base address of the ULP memory in the CPU address space. +# Modify this or pull this out of some SoC header file, if that becomes necessary. +set(ULP_BASE_ADDR "0x50000000") + # Dump the list of global symbols in a convenient format add_custom_command(OUTPUT ${ULP_APP_NAME}.sym - COMMAND ${CMAKE_NM} ${DUMP_SYMBOL_ARGS} $ > ${ULP_APP_NAME}.sym + COMMAND ${CMAKE_NM} -f posix -g $ > ${ULP_APP_NAME}.sym DEPENDS ${ULP_APP_NAME} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) @@ -146,7 +129,7 @@ add_custom_command(OUTPUT ${ULP_APP_NAME}.bin WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_custom_command(OUTPUT ${ULP_APP_NAME}.ld ${ULP_APP_NAME}.h - COMMAND ${ULP_MAP_GEN} ${MAP_GEN_EXTRA_ARGS} -s ${ULP_APP_NAME}.sym -o ${ULP_APP_NAME} + COMMAND ${ULP_MAP_GEN} -s ${ULP_APP_NAME}.sym -o ${ULP_APP_NAME} --base ${ULP_BASE_ADDR} DEPENDS ${ULP_APP_NAME}.sym WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) @@ -157,7 +140,3 @@ add_custom_target(build ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.ld ${CMAKE_CURRENT_BINARY_DIR}/${ULP_APP_NAME}.h WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - -target_link_libraries(${ULP_APP_NAME} "-T\"${CMAKE_CURRENT_BINARY_DIR}/${ULP_LD_SCRIPT}\"") -target_link_libraries(${ULP_APP_NAME} ${EXTRA_LINKER_ARGS}) -set_target_properties(${ULP_APP_NAME} PROPERTIES LINK_DEPENDS ${ULP_LD_SCRIPT}) diff --git a/components/ulp/esp32ulp_mapgen.py b/components/ulp/esp32ulp_mapgen.py index bc36737b63..382752269c 100755 --- a/components/ulp/esp32ulp_mapgen.py +++ b/components/ulp/esp32ulp_mapgen.py @@ -2,77 +2,72 @@ # esp32ulp_mapgen utility converts a symbol list provided by nm into an export script # for the linker and a header file. # -# Copyright (c) 2016-2017 Espressif Systems (Shanghai) PTE LTD. -# Distributed under the terms of Apache License v2.0 found in the top-level LICENSE file. +# SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 from __future__ import print_function -from optparse import OptionParser +import argparse +import os +import textwrap +import typing -BASE_ADDR = 0x50000000 +UTIL = os.path.basename(__file__) -def gen_ld_h_from_sym(f_sym, f_ld, f_h): - f_ld.write('/* Variable definitions for ESP32ULP linker\n') - f_ld.write(' * This file is generated automatically by esp32ulp_mapgen.py utility.\n') - f_ld.write(' */\n\n') - f_h.write('// Variable definitions for ESP32ULP\n') - f_h.write('// This file is generated automatically by esp32ulp_mapgen.py utility\n\n') - f_h.write('#pragma once\n\n') +def gen_ld_h_from_sym(f_sym: typing.TextIO, f_ld: typing.TextIO, f_h: typing.TextIO, base_addr: int) -> None: + f_ld.write(textwrap.dedent( + f""" + /* ULP variable definitions for the linker. + * This file is generated automatically by {UTIL} utility. + */ + """ + )) + f_h.write(textwrap.dedent( + f""" + /* ULP variable definitions for the compiler. + * This file is generated automatically by {UTIL} utility. + */ + #pragma once + #ifdef __cplusplus + extern "C" {{ + #endif + """ + )) for line in f_sym: - name, _, addr_str = line.split(' ', 2) - addr = int(addr_str, 16) + BASE_ADDR + # NM "posix" format output has the following structure: + # symbol_name symbol_type addr_hex [size_hex] + parts = line.split() + name = parts[0] + addr = int(parts[2], 16) + base_addr f_h.write('extern uint32_t ulp_{0};\n'.format(name)) f_ld.write('PROVIDE ( ulp_{0} = 0x{1:08x} );\n'.format(name, addr)) - -def gen_ld_h_from_sym_riscv(f_sym, f_ld, f_h): - f_ld.write('/* Variable definitions for ESP32ULP linker\n') - f_ld.write(' * This file is generated automatically by esp32ulp_mapgen.py utility.\n') - f_ld.write(' */\n\n') - f_h.write('// Variable definitions for ESP32ULP\n') - f_h.write('// This file is generated automatically by esp32ulp_mapgen.py utility\n\n') - f_h.write('#pragma once\n\n') - - for line in f_sym: - addr_str, _, name = line.split() - addr = int(addr_str, 16) + BASE_ADDR - f_h.write('extern uint32_t ulp_{0};\n'.format(name)) - f_ld.write('PROVIDE ( ulp_{0} = 0x{1:08x} );\n'.format(name, addr)) + f_h.write(textwrap.dedent( + """ + #ifdef __cplusplus + } + #endif + """ + )) -def main(): +def main() -> None: description = ('This application generates .h and .ld files for symbols defined in input file. ' 'The input symbols file can be generated using nm utility like this: ' - 'esp32-ulp-nm -g -f posix > ') + 'nm -g -f posix > ') - parser = OptionParser(description=description) - parser.add_option('-s', '--symfile', dest='symfile', - help='symbols file name', metavar='SYMFILE') - parser.add_option('-o', '--outputfile', dest='outputfile', - help='destination .h and .ld files name prefix', metavar='OUTFILE') + parser = argparse.ArgumentParser(description=description) + parser.add_argument('-s', '--symfile', required=True, help='symbols file name', metavar='SYMFILE', type=argparse.FileType('r')) + parser.add_argument('-o', '--outputfile', required=True, help='destination .h and .ld files name prefix', metavar='OUTFILE') + parser.add_argument('--base-addr', required=True, help='base address of the ULP memory, to be added to each symbol') - parser.add_option('--riscv', action='store_true', help='use format for ulp riscv .sym file') + args = parser.parse_args() - (options, args) = parser.parse_args() - if options.symfile is None: - parser.print_help() - return 1 - - if options.outputfile is None: - parser.print_help() - return 1 - - if options.riscv: - with open(options.outputfile + '.h', 'w') as f_h, open(options.outputfile + '.ld', 'w') as f_ld, open(options.symfile) as f_sym: - gen_ld_h_from_sym_riscv(f_sym, f_ld, f_h) - return 0 - - with open(options.outputfile + '.h', 'w') as f_h, open(options.outputfile + '.ld', 'w') as f_ld, open(options.symfile) as f_sym: - gen_ld_h_from_sym(f_sym, f_ld, f_h) - return 0 + with open(args.outputfile + '.h', 'w') as f_h, open(args.outputfile + '.ld', 'w') as f_ld: + gen_ld_h_from_sym(args.symfile, f_ld, f_h, int(args.base_addr, 0)) if __name__ == '__main__': - exit(main()) + main() diff --git a/components/ulp/ld/esp32s2.periperals.ld b/components/ulp/ld/esp32s2.peripherals.ld similarity index 100% rename from components/ulp/ld/esp32s2.periperals.ld rename to components/ulp/ld/esp32s2.peripherals.ld diff --git a/components/ulp/ld/esp32s3.periperals.ld b/components/ulp/ld/esp32s3.peripherals.ld similarity index 100% rename from components/ulp/ld/esp32s3.periperals.ld rename to components/ulp/ld/esp32s3.peripherals.ld diff --git a/components/ulp/toolchain_ulp_version.mk b/components/ulp/toolchain_ulp_version.mk deleted file mode 100644 index d835600e43..0000000000 --- a/components/ulp/toolchain_ulp_version.mk +++ /dev/null @@ -1 +0,0 @@ -SUPPORTED_ULP_ASSEMBLER_VERSION = 2.28.51-esp-20191205 diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 0faa058673..45ae5099b9 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -1284,7 +1284,6 @@ components/tcp_transport/test/test_transport_connect.c components/tcp_transport/test/test_transport_fixtures.c components/tcp_transport/transport_utils.c components/tinyusb/additions/include/tusb_config.h -components/ulp/esp32ulp_mapgen.py components/ulp/test/esp32/test_ulp_as.c components/unity/include/priv/setjmp.h components/unity/include/unity_config.h diff --git a/tools/ci/mypy_ignore_list.txt b/tools/ci/mypy_ignore_list.txt index 29c0bf8b7f..a50adee500 100644 --- a/tools/ci/mypy_ignore_list.txt +++ b/tools/ci/mypy_ignore_list.txt @@ -18,7 +18,6 @@ components/protocomm/python/constants_pb2.py components/protocomm/python/sec0_pb2.py components/protocomm/python/sec1_pb2.py components/protocomm/python/session_pb2.py -components/ulp/esp32ulp_mapgen.py components/wifi_provisioning/python/wifi_config_pb2.py components/wifi_provisioning/python/wifi_constants_pb2.py components/wifi_provisioning/python/wifi_scan_pb2.py