From fa7aa656d3ac2d364a44116e654def88a8f7f4df Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 1 Feb 2021 16:53:13 +0800 Subject: [PATCH] build-system: add loadable elf support for ESP32-S2 and C3 --- Kconfig | 6 ++++-- components/esp32s2/ld/esp32s2_fragments.lf | 8 ++++++-- .../test_apps/system/gdb_loadable_elf/app_test.py | 6 +++--- .../gdb_loadable_elf/{gdbinit => gdbinit_esp32} | 0 .../system/gdb_loadable_elf/gdbinit_esp32c3 | 14 ++++++++++++++ .../system/gdb_loadable_elf/gdbinit_esp32s2 | 14 ++++++++++++++ 6 files changed, 41 insertions(+), 7 deletions(-) rename tools/test_apps/system/gdb_loadable_elf/{gdbinit => gdbinit_esp32} (100%) create mode 100644 tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32c3 create mode 100644 tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32s2 diff --git a/Kconfig b/Kconfig index 0646ca29d2..1d498baf59 100644 --- a/Kconfig +++ b/Kconfig @@ -134,7 +134,7 @@ mainmenu "Espressif IoT Development Framework Configuration" Select the way the application is built. By default, the application is built as a binary file in a format compatible with - the ESP32 bootloader. In addition to this application, 2nd stage bootloader is + the ESP-IDF bootloader. In addition to this application, 2nd stage bootloader is also built. Application and bootloader binaries can be written into flash and loaded/executed from there. @@ -146,7 +146,7 @@ mainmenu "Espressif IoT Development Framework Configuration" written into flash. Note that at the moment, ESP-IDF does not contain all the startup code required to initialize the CPUs and ROM memory (data/bss). Therefore it is necessary to execute - a bit of ROM code prior to executing the application. A gdbinit file may look as follows: + a bit of ROM code prior to executing the application. A gdbinit file may look as follows (for ESP32): # Connect to a running instance of OpenOCD target remote :3333 @@ -166,6 +166,8 @@ mainmenu "Espressif IoT Development Framework Configuration" xtensa-esp32-elf-gdb build/app-name.elf -x gdbinit + Example gdbinit files for other targets can be found in tools/test_apps/system/gdb_loadable_elf/ + Recommended sdkconfig.defaults for building loadable ELF files is as follows. CONFIG_APP_BUILD_TYPE_ELF_RAM is required, other options help reduce application memory footprint. diff --git a/components/esp32s2/ld/esp32s2_fragments.lf b/components/esp32s2/ld/esp32s2_fragments.lf index ac231cf123..5747f62765 100644 --- a/components/esp32s2/ld/esp32s2_fragments.lf +++ b/components/esp32s2/ld/esp32s2_fragments.lf @@ -78,8 +78,12 @@ entries: [scheme:default] entries: - text -> flash_text - rodata -> flash_rodata + if APP_BUILD_USE_FLASH_SECTIONS = y: + text -> flash_text + rodata -> flash_rodata + else: + text -> iram0_text + rodata -> dram0_data data -> dram0_data bss -> dram0_bss common -> dram0_bss diff --git a/tools/test_apps/system/gdb_loadable_elf/app_test.py b/tools/test_apps/system/gdb_loadable_elf/app_test.py index bca4822e45..68347b0c20 100644 --- a/tools/test_apps/system/gdb_loadable_elf/app_test.py +++ b/tools/test_apps/system/gdb_loadable_elf/app_test.py @@ -37,10 +37,10 @@ class SerialThread(object): @ttfw_idf.idf_custom_test(env_tag='test_jtag_arm', group='test-apps') def test_app_loadable_elf(env, extra_data): - rel_project_path = os.path.join('tools', 'test_apps', 'system', 'gdb_loadable_elf') app_files = ['gdb_loadable_elf.elf'] - app = ttfw_idf.LoadableElfTestApp(rel_project_path, app_files, target='esp32') + target = 'esp32' + app = ttfw_idf.LoadableElfTestApp(rel_project_path, app_files, target=target) idf_path = app.get_sdk_path() proj_path = os.path.join(idf_path, rel_project_path) elf_path = os.path.join(app.binary_path, 'gdb_loadable_elf.elf') @@ -49,7 +49,7 @@ def test_app_loadable_elf(env, extra_data): with SerialThread(esp_log_path): openocd_log = os.path.join(proj_path, 'openocd.log') gdb_log = os.path.join(proj_path, 'gdb.log') - gdb_init = os.path.join(proj_path, 'gdbinit') + gdb_init = os.path.join(proj_path, 'gdbinit_' + target) gdb_dir = os.path.join(proj_path, 'main') with ttfw_idf.OCDBackend(openocd_log, app.target): diff --git a/tools/test_apps/system/gdb_loadable_elf/gdbinit b/tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32 similarity index 100% rename from tools/test_apps/system/gdb_loadable_elf/gdbinit rename to tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32 diff --git a/tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32c3 b/tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32c3 new file mode 100644 index 0000000000..59633b9739 --- /dev/null +++ b/tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32c3 @@ -0,0 +1,14 @@ +set pagination off +# Connect to a running instance of OpenOCD +target remote 127.0.0.1:3333 +# Reset and halt the target +mon reset halt +# Run to a specific point in ROM code, +# where most of initialization is complete. +thb *0x40047654 +c +# Load the application into RAM +load +# Run till app_main +tb app_main +c diff --git a/tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32s2 b/tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32s2 new file mode 100644 index 0000000000..84d38f5cb1 --- /dev/null +++ b/tools/test_apps/system/gdb_loadable_elf/gdbinit_esp32s2 @@ -0,0 +1,14 @@ +set pagination off +# Connect to a running instance of OpenOCD +target remote 127.0.0.1:3333 +# Reset and halt the target +mon reset halt +# Run to a specific point in ROM code, +# where most of initialization is complete. +thb *0x4000f6e2 +c +# Load the application into RAM +load +# Run till app_main +tb app_main +c