mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-17 22:32:44 +01:00
149cee491e
19760: cpu/sam0_common/periph: add low-level SDMMC peripheral driver for SDHC r=benpicco a=gschorcht ### Contribution description This PR implements the low-level SDIO/SDMMC peripheral driver for SAM0 SDHC according to the definition in #19539. ### Testing procedure ``` BOARD=same54-xpro make -C tests/drivers/sdmmc ``` ``` BOARD=same54-xpro make -C tests/sys/vfs_default ``` ### Issues/PRs references ~Depends on PR #19539~ Depends on PR #19899 19946: posix_sockets.c: Fix 2 byte int compilation errors r=benpicco a=mrdeep1 19956: cpu/esp32: fix heap definition for ESP32-S2 and ESP32-S3 r=benpicco a=gschorcht ### Contribution description For ESP32-S2 and ESP32-S3 the symbol `_heap_end` must not be used as `_eheap` for the newlibc `malloc` and function `sbrk`. `_heap_end` is used by the ESP-IDF heap implementation `esp-idf-heap` and points to the highest possible address (0x40000000) that could be used for the heap in ESP-IDF. It doesn't point to the top address of the unused SRAM area that can be used in newlibc `malloc` and function `sbrk`. Instead, the origin and the length of `dram0_0_seg` must be used to calculate the end of the heap `_eheap`. The problem only occurs for the newlibc `malloc` when the `sbrk` function is used but not for the ESP-IDF heap implementation `esp_idf_heap`. ### Testing procedure Use any ESP32-S2 or ESP32-S3 board and flash `tests/sys/malloc`, e.g. ``` CFLAGS='-DCHUNK_SIZE=16384' USEMODULE='stdio_uart' BOARD=esp32s3-pros3 make -j8 -C tests/sys/malloc flash ``` Without the PR the `nm` command will give the wrong address ``` nm -s tests/sys/malloc/bin/esp32s3-pros3/tests_malloc.elf | grep _eheap 40000000 A _eheap ``` The test will stuck, i.e. the allocation of memory stops when the top of unused SRAM is reached and the board restarts when the watchdog timer expires. With the PR it should work as expected ``` Help: Press s to start test, r to print it is ready START main(): This is RIOT! (Version: 2023.10-devel-309-g4669e) calloc(zu, zu) = 0x10000000 CHUNK_SIZE: 16384 NUMBER_OF_TESTS: 3 Allocated 16384 Bytes at 0x3fc8c4b0, total 16384 ... Allocated 16384 Bytes at 0x3fcec6f0, total 409792 ESP-ROM:esp32s3-20210327 Build:Mar 27 2021 rst:0x7 (TG0WDT_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT) Saved PC:0x403763e3 ``` With this PR the `nm` command should give a address in unused SRAM address space ``` nm -s tests/sys/malloc/bin/esp32s3-pros3/tests_malloc.elf | grep _eheap 3fcca000 A _eheap ``` and the test should pass. ### Issues/PRs references 19957: cpu/esp32: fix Octal SPI RAM for ESP32-S3 r=benpicco a=gschorcht ### Contribution description This PR fixes Octal SPI RAM handling for ESP32-S3. Functions that are used during the initialization of the Octal SPI RAM must reside in IRAM instead of Flash. Otherwise, the system stucks during boot once the Octal SPI RAM is enabled. The reason is that the Flash is not available during the initialization of the Octal SPI RAM and the functions that are called during that initialization can't be accessed in Flash. As a result the call of such a function leads to code that is messed up and the system crashes. The PR also includes the documentation fixe for the `esp32s3-box`. It also includes a small documentation fix regarding the SPI RAM for the `esp32s3-pros3` board. ### Testing procedure Use a board that has Octal SPI RAM and flash `tests/sys/malloc`, e.g.: ``` CFLAGS='-DCHUNK_SIZE=16384' USEMODULE='stdio_uart esp_spi_ram esp_log_startup' \ BOARD=esp32s3-box make -C tests/sys/malloc ``` Without the PR, the system stuck during boot once the information for the Octal SPI RAM is print ``` ESP-ROM:esp32s3-20210327 ... I (133) boot: Loaded app from partition at offset 0x10000 I (134) boot: Disabling RNG early entropy source... vendor id : 0x0d (AP) dev id : 0x02 (generation 3) density : 0x03 (64 Mbit) good-die : 0x01 (Pass) Latency : 0x01 (Fixed) VCC : 0x01 (3V) SRF : 0x01 (Fast Refresh) BurstType : 0x01 (Hybrid Wrap) BurstLen : 0x01 (32 Byte) Readlatency : 0x02 (10 cycles@Fixed) DriveStrength: 0x00 (1/1) ``` and the board restarts when the watchdog timer expires. With this PR, the system starts as expected. ``` ESP-ROM:esp32s3-20210327 ... I (132) boot: Loaded app from partition at offset 0x10000 I (133) boot: Disabling RNG early entropy source... vendor id : 0x0d (AP) dev id : 0x02 (generation 3) density : 0x03 (64 Mbit) good-die : 0x01 (Pass) Latency : 0x01 (Fixed) VCC : 0x01 (3V) SRF : 0x01 (Fast Refresh) BurstType : 0x01 (Hybrid Wrap) BurstLen : 0x01 (32 Byte) Readlatency : 0x02 (10 cycles@Fixed) DriveStrength: 0x00 (1/1) Found 64MBit SPI RAM device SPI RAM mode: sram 40m PSRAM initialized, cache is in normal (1-core) mode. Pro cpu up. Single core mode SPI SRAM memory test OK Initializing. RAM available for dynamic allocation: At 3FC8C150 len 00053EB0 (335 KiB): D/IRAM At 3FCE0000 len 0000EE34 (59 KiB): STACK/DRAM At 3FCF0000 len 00008000 (32 KiB): DRAM Starting ESP32x with ID: f412fafd0f8c ESP-IDF SDK Version v4.4.1 Current clocks in Hz: CPU=80000000 APB=80000000 XTAL=40000000 SLOW=150000 PRO cpu is up (single core mode, only PRO cpu is used) PRO cpu starts user code Adding pool of 8192K of external SPI memory to heap allocator Used clocks in Hz: CPU=80000000 APB=80000000 XTAL=40000000 FAST=8000000 SLOW=150000 XTAL calibration value: 3643448 Heap free: 8754851 bytes Board configuration: UART_DEV(0) txd=43 rxd=44 LED pins=[ ] BUTTONS pins=[ 0 ] Starting RIOT kernel on PRO cpu Help: Press s to start test, r to print it is ready ``` ### Issues/PRs references Co-authored-by: Gunar Schorcht <gunar@schorcht.net> Co-authored-by: Jon Shallow <supjps-libcoap@jpshallow.com>
656 lines
22 KiB
Plaintext
656 lines
22 KiB
Plaintext
/* Automatically generated file; DO NOT EDIT */
|
|
/* Espressif IoT Development Framework Linker Script */
|
|
/* Generated from: esp-idf/components/esp_system/ld/esp32s3/sections.ld.in */
|
|
|
|
/*
|
|
* SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/* Default entry point */
|
|
ENTRY(call_start_cpu0);
|
|
|
|
_diram_i_start = 0x40378000;
|
|
|
|
SECTIONS
|
|
{
|
|
/**
|
|
* RTC fast memory holds RTC wake stub code,
|
|
* including from any source file named rtc_wake_stub*.c
|
|
*/
|
|
.rtc.text :
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_text_start = ABSOLUTE(.);
|
|
*(.rtc.entry.text)
|
|
|
|
*(.rtc.literal .rtc.text .rtc.text.*)
|
|
|
|
*rtc_wake_stub*.*(.literal .text .literal.* .text.*)
|
|
_rtc_text_end = ABSOLUTE(.);
|
|
} > rtc_iram_seg
|
|
|
|
/**
|
|
* This section is required to skip rtc.text area because rtc_iram_seg and
|
|
* rtc_data_seg are reflect the same address space on different buses.
|
|
*/
|
|
.rtc.dummy :
|
|
{
|
|
_rtc_dummy_start = ABSOLUTE(.);
|
|
_rtc_fast_start = ABSOLUTE(.);
|
|
. = SIZEOF(.rtc.text);
|
|
_rtc_dummy_end = ABSOLUTE(.);
|
|
} > rtc_data_seg
|
|
|
|
/**
|
|
* This section located in RTC FAST Memory area.
|
|
* It holds data marked with RTC_FAST_ATTR attribute.
|
|
* See the file "esp_attr.h" for more information.
|
|
*/
|
|
.rtc.force_fast :
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_force_fast_start = ABSOLUTE(.);
|
|
|
|
_coredump_rtc_fast_start = ABSOLUTE(.);
|
|
*(.rtc.fast.coredump .rtc.fast.coredump.*)
|
|
_coredump_rtc_fast_end = ABSOLUTE(.);
|
|
|
|
*(.rtc.force_fast .rtc.force_fast.*)
|
|
. = ALIGN(4) ;
|
|
_rtc_force_fast_end = ABSOLUTE(.);
|
|
} > rtc_data_seg
|
|
|
|
/**
|
|
* RTC data section holds RTC wake stub
|
|
* data/rodata, including from any source file
|
|
* named rtc_wake_stub*.c and the data marked with
|
|
* RTC_DATA_ATTR, RTC_RODATA_ATTR attributes.
|
|
* The memory location of the data is dependent on
|
|
* CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM option.
|
|
*/
|
|
.rtc.data :
|
|
{
|
|
_rtc_data_start = ABSOLUTE(.);
|
|
|
|
_coredump_rtc_start = ABSOLUTE(.);
|
|
*(.rtc.coredump .rtc.coredump.*)
|
|
_coredump_rtc_end = ABSOLUTE(.);
|
|
*(.rtc.data .rtc.data.*)
|
|
*(.rtc.rodata .rtc.rodata.*)
|
|
|
|
*rtc_wake_stub*.*(.data .rodata .data.* .rodata.* .bss .bss.*)
|
|
_rtc_data_end = ABSOLUTE(.);
|
|
} > rtc_data_location
|
|
|
|
/* RTC bss, from any source file named rtc_wake_stub*.c */
|
|
.rtc.bss (NOLOAD) :
|
|
{
|
|
/* part that is initialized if not waking up from deep sleep */
|
|
_rtc_bss_start = ABSOLUTE(.);
|
|
*rtc_wake_stub*.*(.bss .bss.*)
|
|
*rtc_wake_stub*.*(COMMON)
|
|
_rtc_bss_end = ABSOLUTE(.);
|
|
/* part that saves some data for rtc periph module, this part is
|
|
only initialized at power on reset */
|
|
_rtc_bss_rtc_start = ABSOLUTE(.);
|
|
*(.rtc.bss .rtc.bss.*)
|
|
_rtc_bss_rtc_end = ABSOLUTE(.);
|
|
} > rtc_data_location
|
|
|
|
/**
|
|
* This section holds data that should not be initialized at power up
|
|
* and will be retained during deep sleep.
|
|
* User data marked with RTC_NOINIT_ATTR will be placed
|
|
* into this section. See the file "esp_attr.h" for more information.
|
|
* The memory location of the data is dependent on CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM option.
|
|
*/
|
|
.rtc_noinit (NOLOAD):
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_noinit_start = ABSOLUTE(.);
|
|
*(.rtc_noinit .rtc_noinit.*)
|
|
. = ALIGN(4) ;
|
|
_rtc_noinit_end = ABSOLUTE(.);
|
|
} > rtc_data_location
|
|
|
|
/**
|
|
* This section located in RTC SLOW Memory area.
|
|
* It holds data marked with RTC_SLOW_ATTR attribute.
|
|
* See the file "esp_attr.h" for more information.
|
|
*/
|
|
.rtc.force_slow :
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_force_slow_start = ABSOLUTE(.);
|
|
*(.rtc.force_slow .rtc.force_slow.*)
|
|
. = ALIGN(4) ;
|
|
_rtc_force_slow_end = ABSOLUTE(.);
|
|
} > rtc_slow_seg
|
|
|
|
/* Get size of rtc slow data based on rtc_data_location alias */
|
|
_rtc_slow_length = (ORIGIN(rtc_slow_seg) == ORIGIN(rtc_data_location))
|
|
? (_rtc_force_slow_end - _rtc_data_start)
|
|
: (_rtc_force_slow_end - _rtc_force_slow_start);
|
|
|
|
_rtc_fast_length = (ORIGIN(rtc_slow_seg) == ORIGIN(rtc_data_location))
|
|
? (_rtc_force_fast_end - _rtc_fast_start)
|
|
: (_rtc_noinit_end - _rtc_fast_start);
|
|
|
|
ASSERT((_rtc_slow_length <= LENGTH(rtc_slow_seg)),
|
|
"RTC_SLOW segment data does not fit.")
|
|
|
|
ASSERT((_rtc_fast_length <= LENGTH(rtc_data_seg)),
|
|
"RTC_FAST segment data does not fit.")
|
|
|
|
/* Send .iram0 code to iram */
|
|
.iram0.vectors :
|
|
{
|
|
_iram_start = ABSOLUTE(.);
|
|
/* Vectors go to IRAM */
|
|
_vector_table = ABSOLUTE(.);
|
|
. = 0x0;
|
|
KEEP(*(.WindowVectors.text));
|
|
. = 0x180;
|
|
KEEP(*(.Level2InterruptVector.text));
|
|
. = 0x1c0;
|
|
KEEP(*(.Level3InterruptVector.text));
|
|
. = 0x200;
|
|
KEEP(*(.Level4InterruptVector.text));
|
|
. = 0x240;
|
|
KEEP(*(.Level5InterruptVector.text));
|
|
. = 0x280;
|
|
KEEP(*(.DebugExceptionVector.text));
|
|
. = 0x2c0;
|
|
KEEP(*(.NMIExceptionVector.text));
|
|
. = 0x300;
|
|
KEEP(*(.KernelExceptionVector.text));
|
|
. = 0x340;
|
|
KEEP(*(.UserExceptionVector.text));
|
|
. = 0x3C0;
|
|
KEEP(*(.DoubleExceptionVector.text));
|
|
. = 0x400;
|
|
_invalid_pc_placeholder = ABSOLUTE(.);
|
|
*(.*Vector.literal)
|
|
|
|
*(.UserEnter.literal);
|
|
*(.UserEnter.text);
|
|
. = ALIGN (16);
|
|
*(.entry.text)
|
|
*(.init.literal)
|
|
*(.init)
|
|
_init_end = ABSOLUTE(.);
|
|
} > iram0_0_seg
|
|
|
|
.iram0.text :
|
|
{
|
|
/* Code marked as running out of IRAM */
|
|
_iram_text_start = ABSOLUTE(.);
|
|
|
|
*(.iram1 .iram1.*)
|
|
|
|
/* Xtensa basic functionality written in assembler should be placed in IRAM */
|
|
*xtensa/*(.literal .text .literal.* .text.*)
|
|
/* parts of RIOT that should run in IRAM */
|
|
|
|
*core/*(.literal .text .literal.* .text.*)
|
|
*esp_common_periph/flash.*(.literal .text .literal.* .text.*)
|
|
*esp_common/thread_arch.*(.literal .text .literal.* .text.*)
|
|
*esp_freertos_common/*(.literal .text .literal.* .text.*)
|
|
|
|
/* parts of ESP-IDF that should run in IRAM */
|
|
/* find components/ -type f -name linker.lf -exec grep "(noflash)" {} \; -print */
|
|
/* find components/ -type f -name linker.lf -exec grep "(noflash_text)" {} \; -print */
|
|
*components/app_trace/app_trace.*(.literal .literal.* .text .text.*)
|
|
*components/app_trace/app_trace_util.*(.literal .literal.* .text .text.*)
|
|
*components/esp_event/default_event_loop.*(.literal.esp_event_isr_post .text.esp_event_isr_post)
|
|
*components/esp_event/esp_event.*(.literal.esp_event_isr_post_to .text.esp_event_isr_post_to)
|
|
*components/esp_hw_support/cpu_util.*(.literal .literal.* .text .text.*)
|
|
*components/esp_hw_support/*/rtc_clk.*(.literal .literal.* .text .text.*)
|
|
*components/esp_hw_support/*/rtc_init.*(.literal.rtc_vddsdio_set_config .text.rtc_vddsdio_set_config)
|
|
*components/esp_hw_support/*/rtc_pm.*(.literal .literal.* .text .text.*)
|
|
*components/esp_hw_support/*/rtc_sleep.*(.literal .literal.* .text .text.*)
|
|
*components/esp_hw_support/*/rtc_time.*(.literal .literal.* .text .text.*)
|
|
*components/esp_hw_support/*/rtc_wdt.*(.literal .literal.* .text .text.*)
|
|
*components/esp_hw_support/*/spiram_psram.*(.literal .literal.* .text .text.*)
|
|
*components/esp_hw_support/*/opiram_psram.*(.literal .literal.* .text .text.*)
|
|
*components/esp_ringbuf/*(.literal .literal.* .text .text.*)
|
|
*components/esp_rom/esp_rom_spiflash.*(.literal .literal.* .text .text.*)
|
|
*components/esp_system/esp_err.*(.literal .literal.* .text .text.*)
|
|
*components/esp_system/esp_system.*(.literal.esp_system_abort .text.esp_system_abort)
|
|
*components/esp_system/ubsan.*(.literal .literal.* .text .text.*)
|
|
|
|
*libgcc.a:_divsf3.*(.literal .literal.* .text .text.*)
|
|
*libgcc.a:lib2funcs.*(.literal .literal.* .text .text.*)
|
|
*libgcc.a:save-restore.*(.literal .literal.* .text .text.*)
|
|
*libgcov.a:(.literal .literal.* .text .text.*)
|
|
|
|
*components/hal/cpu_hal.*(.literal .literal.* .text .text.*)
|
|
*components/hal/i2c_hal_iram.*(.literal .literal.* .text .text.*)
|
|
*components/hal/ledc_hal_iram.*(.literal .literal.* .text .text.*)
|
|
*components/hal/soc_hal.*(.literal .literal.* .text .text.*)
|
|
*components/hal/spi_flash_encrypt_hal_iram.*(.literal .literal.* .text .text.*)
|
|
*components/hal/spi_flash_hal_gpspi.*(.literal .literal.* .text .text.*)
|
|
*components/hal/spi_flash_hal_iram.*(.literal .literal.* .text .text.*)
|
|
*components/hal/spi_hal_iram.*(.literal .literal.* .text .text.*)
|
|
*components/hal/spi_slave_hal_iram.*(.literal .literal.* .text .text.*)
|
|
*components/hal/systimer_hal.*(.literal .literal.* .text .text.*)
|
|
*components/hal/twai_hal.*(.literal .literal.* .text .text.*)
|
|
*components/hal/uart_hal.*(.literal .literal.* .text .text.*)
|
|
*components/hal/wdt_hal_iram.*(.literal .literal.* .text .text.*)
|
|
*components/heap/heap_tlsf.*(.literal .literal.* .text .text.*)
|
|
*components/heap/multi_heap.*(.literal .literal.* .text .text.*)
|
|
|
|
*esp-idf/esp_idf_support.*(.literal.esp_log_write .text.esp_log_write)
|
|
|
|
*libnet80211.a:(.wifi0iram .wifi0iram.*)
|
|
*libnet80211.a:(.wifirxiram .wifirxiram.*)
|
|
*libnet80211.a:(.wifislprxiram .wifislprxiram.*)
|
|
|
|
*components/newlib/abort.*(.literal .literal.* .text .text.*)
|
|
*components/newlib/assert.*(.literal .literal.* .text .text.*)
|
|
*components/newlib/heap.*(.literal .literal.* .text .text.*)
|
|
*components/newlib/stdatomic.*(.literal .literal.* .text .text.*)
|
|
|
|
*libpp.a:(.wifi0iram .wifi0iram.*)
|
|
*libpp.a:(.wifiorslpiram .wifiorslpiram.*)
|
|
*libpp.a:(.wifirxiram .wifirxiram.*)
|
|
*libpp.a:(.wifislprxiram .wifislprxiram.*)
|
|
*librtc.a:(.literal .literal.* .text .text.*)
|
|
|
|
*components/soc/lldesc.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/memspi_host_driver.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/spi_flash_chip_boya.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/spi_flash_chip_gd.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/spi_flash_chip_generic.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/spi_flash_chip_issi.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/spi_flash_chip_mxic.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/spi_flash_chip_mxic_opi.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/spi_flash_chip_th.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/spi_flash_chip_winbond.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/*/spi_flash_rom_patch.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/spi_flash_timing_tuning.*(.literal .literal.* .text .text.*)
|
|
*components/spi_flash/*/spi_timing_config.*(.literal .literal.* .text .text.*)
|
|
|
|
*libxt_hal.a:(.literal .literal.* .text .text.*)
|
|
*libxtensa.a:eri.*(.literal .literal.* .text .text.*)
|
|
*libxtensa.a:xtensa_intr_asm.*(.literal .literal.* .text .text.*)
|
|
|
|
} > iram0_0_seg
|
|
|
|
/**
|
|
* This section is required to skip .iram0.text area because iram0_0_seg and
|
|
* dram0_0_seg reflect the same address space on different buses.
|
|
*/
|
|
.dram0.dummy (NOLOAD):
|
|
{
|
|
. = ORIGIN(dram0_0_seg) + MAX(_iram_end - _diram_i_start, 0);
|
|
} > dram0_0_seg
|
|
|
|
.dram0.data :
|
|
{
|
|
_data_start = ABSOLUTE(.);
|
|
*(.gnu.linkonce.d.*)
|
|
*(.data1)
|
|
*(.sdata)
|
|
*(.sdata.*)
|
|
KEEP (*(SORT(.xfa.*)))
|
|
*(.gnu.linkonce.s.*)
|
|
*(.sdata2)
|
|
*(.sdata2.*)
|
|
*(.gnu.linkonce.s2.*)
|
|
*(.jcr)
|
|
|
|
_esp_system_init_fn_array_start = ABSOLUTE(.);
|
|
KEEP (*(SORT(.esp_system_init_fn) SORT(.esp_system_init_fn.*)))
|
|
_esp_system_init_fn_array_end = ABSOLUTE(.);
|
|
|
|
*(EXCLUDE_FILE(*components/bt/* *libbtdm_app.a) .data EXCLUDE_FILE(*components/bt/* *libbtdm_app.a) .data.*)
|
|
*(.dram1 .dram1.*)
|
|
_coredump_dram_start = ABSOLUTE(.);
|
|
*(.dram1.coredump .dram1.coredump.*)
|
|
_coredump_dram_end = ABSOLUTE(.);
|
|
*libapp_trace.a:app_trace.*(.rodata .rodata.*)
|
|
*libapp_trace.a:app_trace_util.*(.rodata .rodata.*)
|
|
_bt_data_start = ABSOLUTE(.);
|
|
*components/bt/*(.data .data.*)
|
|
. = ALIGN(4);
|
|
_bt_data_end = ABSOLUTE(.);
|
|
_btdm_data_start = ABSOLUTE(.);
|
|
*libbtdm_app.a:(.data .data.*)
|
|
. = ALIGN(4);
|
|
_btdm_data_end = ABSOLUTE(.);
|
|
|
|
/* find components/ -type f -name linker.lf -exec grep "(noflash)" {} \; -print */
|
|
*components/esp_hw_support/port/*/rtc_clk.*(.rodata .rodata.*)
|
|
*components/esp_rom/esp_rom_spiflash.*(.rodata .rodata.*)
|
|
*components/esp_system/esp_err.*(.rodata .rodata.*)
|
|
*components/esp_system/ubsan.*(.rodata .rodata.*)
|
|
|
|
*libgcc.a:_divsf3.*(.rodata .rodata.*)
|
|
*libgcc.a:save-restore.*(.rodata .rodata.*)
|
|
*libgcov.a:(.rodata .rodata.*)
|
|
|
|
*components/hal/cpu_hal.*(.rodata .rodata.*)
|
|
*components/hal/i2c_hal_iram.*(.rodata .rodata.*)
|
|
*components/hal/ledc_hal_iram.*(.rodata .rodata.*)
|
|
*components/hal/soc_hal.*(.rodata .rodata.*)
|
|
*components/hal/spi_flash_encrypt_hal_iram.*(.rodata .rodata.*)
|
|
*components/hal/spi_flash_hal_gpspi.*(.rodata .rodata.*)
|
|
*components/hal/spi_flash_hal_iram.*(.rodata .rodata.*)
|
|
*components/hal/spi_hal_iram.*(.rodata .rodata.*)
|
|
*components/hal/spi_slave_hal_iram.*(.rodata .rodata.*)
|
|
*components/hal/systimer_hal.*(.rodata .rodata.*)
|
|
*components/hal/twai_hal.*(.rodata .rodata.*)
|
|
*components/hal/uart_hal.*(.rodata .rodata.*)
|
|
*components/hal/wdt_hal_iram.*(.rodata .rodata.*)
|
|
*components/heap/heap_tlsf.*(.rodata .rodata.*)
|
|
*components/heap/multi_heap.*(.rodata .rodata.*)
|
|
|
|
*components/newlib/abort.*(.rodata .rodata.*)
|
|
*components/newlib/assert.*(.rodata .rodata.*)
|
|
*components/newlib/heap.*(.rodata .rodata.*)
|
|
*components/newlib/stdatomic.*(.rodata .rodata.*)
|
|
|
|
_nimble_data_start = ABSOLUTE(.);
|
|
*libnimble.a:(.data .data.*)
|
|
. = ALIGN(4);
|
|
_nimble_data_end = ABSOLUTE(.);
|
|
*libphy.a:(.rodata .rodata.*)
|
|
|
|
*components/soc/lldesc.*(.rodata .rodata.*)
|
|
*components/spi_flash/memspi_host_driver.*(.rodata .rodata.*)
|
|
*components/spi_flash/spi_flash_chip_boya.*(.rodata .rodata.*)
|
|
*components/spi_flash/spi_flash_chip_gd.*(.rodata .rodata.*)
|
|
*components/spi_flash/spi_flash_chip_generic.*(.rodata .rodata.*)
|
|
*components/spi_flash/spi_flash_chip_issi.*(.rodata .rodata.*)
|
|
*components/spi_flash/spi_flash_chip_mxic.*(.rodata .rodata.*)
|
|
*components/spi_flash/spi_flash_chip_mxic_opi.*(.rodata .rodata.*)
|
|
*components/spi_flash/spi_flash_chip_th.*(.rodata .rodata.*)
|
|
*components/spi_flash/spi_flash_chip_winbond.*(.rodata .rodata.*)
|
|
*components/spi_flash/*/spi_flash_rom_patch.*(.rodata .rodata.*)
|
|
*components/spi_flash/spi_flash_timing_tuning.*(.rodata .rodata.*)
|
|
*components/spi_flash/*/spi_timing_config.*(.rodata .rodata.*)
|
|
|
|
_data_end = ABSOLUTE(.);
|
|
. = ALIGN(4);
|
|
} > dram0_0_seg
|
|
|
|
/**
|
|
* This section holds data that should not be initialized at power up.
|
|
* The section located in Internal SRAM memory region. The macro _NOINIT
|
|
* can be used as attribute to place data into this section.
|
|
* See the "esp_attr.h" file for more information.
|
|
*/
|
|
.noinit (NOLOAD):
|
|
{
|
|
. = ALIGN(4);
|
|
_noinit_start = ABSOLUTE(.);
|
|
*(.noinit .noinit.*)
|
|
. = ALIGN(4) ;
|
|
_noinit_end = ABSOLUTE(.);
|
|
} > dram0_0_seg
|
|
|
|
/* Shared RAM */
|
|
.dram0.bss (NOLOAD) :
|
|
{
|
|
. = ALIGN (8);
|
|
_bss_start = ABSOLUTE(.);
|
|
*(.ext_ram.bss*)
|
|
|
|
*(.bss .bss.*)
|
|
*(.ext_ram.bss .ext_ram.bss.*)
|
|
*(.dynbss .dynsbss .gnu.linkonce.b .gnu.linkonce.b.* .gnu.linkonce.sb .gnu.linkonce.sb.* .gnu.linkonce.sb2 .gnu.linkonce.sb2.* .sbss .sbss.* .sbss2 .sbss2.* .scommon .share.mem)
|
|
*(COMMON)
|
|
_bt_bss_start = ABSOLUTE(.);
|
|
*components/bt/*(.bss .bss.* COMMON)
|
|
. = ALIGN(4);
|
|
_bt_bss_end = ABSOLUTE(.);
|
|
_btdm_bss_start = ABSOLUTE(.);
|
|
*libbtdm_app.a:(.bss .bss.* COMMON)
|
|
. = ALIGN(4);
|
|
_btdm_bss_end = ABSOLUTE(.);
|
|
_nimble_bss_start = ABSOLUTE(.);
|
|
*libnimble.a:(.bss .bss.* COMMON)
|
|
. = ALIGN(4);
|
|
_nimble_bss_end = ABSOLUTE(.);
|
|
|
|
*(.dynsbss)
|
|
*(.sbss)
|
|
*(.sbss.*)
|
|
*(.gnu.linkonce.sb.*)
|
|
*(.scommon)
|
|
*(.sbss2)
|
|
*(.sbss2.*)
|
|
*(.gnu.linkonce.sb2.*)
|
|
*(.dynbss)
|
|
*(.share.mem)
|
|
*(.gnu.linkonce.b.*)
|
|
|
|
. = ALIGN (8);
|
|
_bss_end = ABSOLUTE(.);
|
|
} > dram0_0_seg
|
|
|
|
ASSERT(((_bss_end - ORIGIN(dram0_0_seg)) <= LENGTH(dram0_0_seg)), "DRAM segment data does not fit.")
|
|
|
|
.flash.text :
|
|
{
|
|
_stext = .;
|
|
_instruction_reserved_start = ABSOLUTE(.);
|
|
_text_start = ABSOLUTE(.);
|
|
|
|
*(.literal .literal.* .text .text.*)
|
|
|
|
*(.wifi0iram .wifi0iram.*)
|
|
*(.wifiorslpiram .wifiorslpiram.*)
|
|
*(.wifirxiram .wifirxiram.*)
|
|
*(.wifislpiram .wifislpiram.*)
|
|
*(.wifislprxiram .wifislprxiram.*)
|
|
|
|
*(.stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
|
|
*(.irom0.text) /* catch stray ICACHE_RODATA_ATTR */
|
|
*(.fini.literal)
|
|
*(.fini)
|
|
*(.gnu.version)
|
|
|
|
/** CPU will try to prefetch up to 16 bytes of
|
|
* of instructions. This means that any configuration (e.g. MMU, PMS) must allow
|
|
* safe access to up to 16 bytes after the last real instruction, add
|
|
* dummy bytes to ensure this
|
|
*/
|
|
. += _esp_flash_mmap_prefetch_pad_size;
|
|
|
|
_text_end = ABSOLUTE(.);
|
|
_instruction_reserved_end = ABSOLUTE(.);
|
|
_etext = .;
|
|
|
|
/**
|
|
* Similar to _iram_start, this symbol goes here so it is
|
|
* resolved by addr2line in preference to the first symbol in
|
|
* the flash.text segment.
|
|
*/
|
|
_flash_cache_start = ABSOLUTE(0);
|
|
} > default_code_seg
|
|
|
|
/**
|
|
* This dummy section represents the .flash.text section but in default_rodata_seg.
|
|
* Thus, it must have its alignement and (at least) its size.
|
|
*/
|
|
.flash_rodata_dummy (NOLOAD):
|
|
{
|
|
_flash_rodata_dummy_start = .;
|
|
/* Start at the same alignement constraint than .flash.text */
|
|
. = ALIGN(ALIGNOF(.flash.text));
|
|
/* Create an empty gap as big as .flash.text section */
|
|
. = . + SIZEOF(.flash.text);
|
|
/* Prepare the alignement of the section above. Few bytes (0x20) must be
|
|
* added for the mapping header. */
|
|
. = ALIGN(0x10000) + 0x20;
|
|
_rodata_reserved_start = .;
|
|
} > default_rodata_seg
|
|
|
|
.flash.appdesc : ALIGN(0x10)
|
|
{
|
|
_rodata_start = ABSOLUTE(.);
|
|
|
|
*(.rodata_desc .rodata_desc.*) /* Should be the first. App version info. DO NOT PUT ANYTHING BEFORE IT! */
|
|
*(.rodata_custom_desc .rodata_custom_desc.*) /* Should be the second. Custom app version info. DO NOT PUT ANYTHING BEFORE IT! */
|
|
|
|
/* Create an empty gap within this section. Thanks to this, the end of this
|
|
* section will match .flah.rodata's begin address. Thus, both sections
|
|
* will be merged when creating the final bin image. */
|
|
. = ALIGN(ALIGNOF(.flash.rodata));
|
|
} >default_rodata_seg
|
|
|
|
.flash.rodata : ALIGN(0x10)
|
|
{
|
|
_flash_rodata_start = ABSOLUTE(.);
|
|
|
|
*(.rodata .rodata.*)
|
|
|
|
*(.rodata_wlog_error .rodata_wlog_error.*)
|
|
*(.rodata_wlog_info .rodata_wlog_info.*)
|
|
*(.rodata_wlog_warning .rodata_wlog_warning.*)
|
|
|
|
KEEP (*(SORT(.roxfa.*)))
|
|
|
|
*(.irom1.text) /* catch stray ICACHE_RODATA_ATTR */
|
|
*(.gnu.linkonce.r.*)
|
|
*(.rodata1)
|
|
__XT_EXCEPTION_TABLE_ = ABSOLUTE(.);
|
|
*(.xt_except_table)
|
|
*(.gcc_except_table .gcc_except_table.*)
|
|
*(.gnu.linkonce.e.*)
|
|
*(.gnu.version_r)
|
|
. = (. + 3) & ~ 3;
|
|
__eh_frame = ABSOLUTE(.);
|
|
KEEP(*(.eh_frame))
|
|
. = (. + 7) & ~ 3;
|
|
/* C++ constructor and destructor tables */
|
|
/* Don't include anything from crtbegin.o or crtend.o, as IDF doesn't use toolchain crt */
|
|
__init_array_start = ABSOLUTE(.);
|
|
KEEP (*(EXCLUDE_FILE (*crtend.* *crtbegin.*) .ctors SORT(.ctors.*)))
|
|
__init_array_end = ABSOLUTE(.);
|
|
KEEP (*crtbegin.*(.dtors))
|
|
KEEP (*(EXCLUDE_FILE (*crtend.*) .dtors))
|
|
KEEP (*(SORT(.dtors.*)))
|
|
KEEP (*(.dtors))
|
|
/* C++ exception handlers table: */
|
|
__XT_EXCEPTION_DESCS_ = ABSOLUTE(.);
|
|
*(.xt_except_desc)
|
|
*(.gnu.linkonce.h.*)
|
|
__XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
|
|
*(.xt_except_desc_end)
|
|
*(.dynamic)
|
|
*(.gnu.version_d)
|
|
/* Addresses of memory regions reserved via SOC_RESERVE_MEMORY_REGION() */
|
|
soc_reserved_memory_region_start = ABSOLUTE(.);
|
|
KEEP (*(.reserved_memory_address))
|
|
soc_reserved_memory_region_end = ABSOLUTE(.);
|
|
_rodata_end = ABSOLUTE(.);
|
|
/* Literals are also RO data. */
|
|
_lit4_start = ABSOLUTE(.);
|
|
*(*.lit4)
|
|
*(.lit4.*)
|
|
*(.gnu.linkonce.lit4.*)
|
|
_lit4_end = ABSOLUTE(.);
|
|
. = ALIGN(4);
|
|
_thread_local_start = ABSOLUTE(.);
|
|
*(.tdata)
|
|
*(.tdata.*)
|
|
*(.tbss)
|
|
*(.tbss.*)
|
|
_thread_local_end = ABSOLUTE(.);
|
|
_rodata_reserved_end = ABSOLUTE(.);
|
|
. = ALIGN(4);
|
|
} > default_rodata_seg
|
|
|
|
_flash_rodata_align = ALIGNOF(.flash.rodata);
|
|
|
|
.flash.rodata_noload (NOLOAD) :
|
|
{
|
|
. = ALIGN (4);
|
|
*(.rodata_wlog_debug .rodata_wlog_debug.*)
|
|
*(.rodata_wlog_verbose .rodata_wlog_verbose.*)
|
|
} > default_rodata_seg
|
|
|
|
/* Marks the end of IRAM code segment */
|
|
.iram0.text_end (NOLOAD) :
|
|
{
|
|
/* ESP32-S3 memprot requires 16B padding for possible CPU prefetch and 256B alignment for PMS split lines */
|
|
. += _esp_memprot_prefetch_pad_size;
|
|
. = ALIGN(_esp_memprot_align_size);
|
|
/* iram_end_test section exists for use by memprot unit tests only */
|
|
*(.iram_end_test)
|
|
_iram_text_end = ABSOLUTE(.);
|
|
} > iram0_0_seg
|
|
|
|
.iram0.data :
|
|
{
|
|
. = ALIGN(4);
|
|
_iram_data_start = ABSOLUTE(.);
|
|
|
|
*(.iram.data .iram.data.*)
|
|
_coredump_iram_start = ABSOLUTE(.);
|
|
*(.iram.data.coredump .iram.data.coredump.*)
|
|
_coredump_iram_end = ABSOLUTE(.);
|
|
|
|
_iram_data_end = ABSOLUTE(.);
|
|
} > iram0_0_seg
|
|
|
|
.iram0.bss (NOLOAD) :
|
|
{
|
|
. = ALIGN(4);
|
|
_iram_bss_start = ABSOLUTE(.);
|
|
|
|
*(.iram.bss .iram.bss.*)
|
|
|
|
_iram_bss_end = ABSOLUTE(.);
|
|
. = ALIGN(4);
|
|
_iram_end = ABSOLUTE(.);
|
|
} > iram0_0_seg
|
|
|
|
/* Marks the end of data, bss and possibly rodata */
|
|
.dram0.heap_start (NOLOAD) :
|
|
{
|
|
. = ALIGN (8);
|
|
_heap_start = ABSOLUTE(.);
|
|
_sheap = ABSOLUTE(.);
|
|
} > dram0_0_seg
|
|
|
|
. = ORIGIN(dram0_0_seg) + LENGTH(dram0_0_seg);
|
|
_eheap = ABSOLUTE(.);
|
|
|
|
. = _heap_end;
|
|
|
|
#ifdef MODULE_PERIPH_FLASHPAGE
|
|
.flash_writable (NOLOAD) : ALIGN(65536)
|
|
{
|
|
_fp_mem_start = . ;
|
|
KEEP(*(SORT(.flash_writable.*)))
|
|
_fp_mem_end = . ;
|
|
. = ALIGN(4096);
|
|
_end_fw = . ;
|
|
} > drom0_1_seg
|
|
#endif
|
|
}
|
|
|
|
ASSERT(((_iram_end - ORIGIN(iram0_0_seg)) <= LENGTH(iram0_0_seg)),
|
|
"IRAM0 segment data does not fit.")
|
|
|
|
ASSERT(((_heap_start - ORIGIN(dram0_0_seg)) <= LENGTH(dram0_0_seg)),
|
|
"DRAM segment data does not fit.")
|
|
|
|
. = ORIGIN(dram0_0_seg);
|
|
_cpu_ram_start = ABSOLUTE(.);
|
|
. = ORIGIN(dram0_0_seg) + LENGTH(dram0_0_seg);
|
|
_cpu_ram_end = ABSOLUTE(.);
|
|
|
|
/* ensure that RAM_START_ADDR and RAM_LEN as defined in RIOT's makefile
|
|
* match the parameters used in linker script */
|
|
ASSERT((ORIGIN(dram0_0_seg) == CPU_RAM_BASE),
|
|
"RAM_START_ADDR does not match DRAM start address")
|
|
ASSERT((LENGTH(dram0_0_seg) == CPU_RAM_SIZE),
|
|
"RAM_LEN does not match DRAM size")
|