| 
									
										
										
										
											2019-12-26 15:25:24 +08:00
										 |  |  | /* ESP32S2 Linker Script Memory Layout | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-26 15:25:24 +08:00
										 |  |  |    This file describes the memory layout (memory blocks) by virtual memory addresses. | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-26 15:25:24 +08:00
										 |  |  |    This linker script is passed through the C preprocessor to include configuration options. | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-26 15:25:24 +08:00
										 |  |  |    Please use preprocessor features sparingly! | 
					
						
							|  |  |  |    Restrict to simple macros with numeric values, and/or #if/#endif blocks. | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | */ | 
					
						
							|  |  |  | #include "sdkconfig.h" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-02 22:55:56 +08:00
										 |  |  | #ifdef CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC | 
					
						
							|  |  |  | #define ESP_BOOTLOADER_RESERVE_RTC (CONFIG_BOOTLOADER_RESERVE_RTC_SIZE + CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC_SIZE) | 
					
						
							|  |  |  | #elif defined(CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP) | 
					
						
							|  |  |  | #define ESP_BOOTLOADER_RESERVE_RTC (CONFIG_BOOTLOADER_RESERVE_RTC_SIZE) | 
					
						
							|  |  |  | #else | 
					
						
							|  |  |  | #define ESP_BOOTLOADER_RESERVE_RTC 0 | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2019-09-06 11:15:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_ESP32S2_INSTRUCTION_CACHE_8KB | 
					
						
							|  |  |  | #define CONFIG_ESP32S2_INSTRUCTION_CACHE_SIZE 0x2000 | 
					
						
							|  |  |  | #else | 
					
						
							|  |  |  | #define CONFIG_ESP32S2_INSTRUCTION_CACHE_SIZE 0x4000 | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_ESP32S2_DATA_CACHE_0KB | 
					
						
							|  |  |  | #define CONFIG_ESP32S2_DATA_CACHE_SIZE 0 | 
					
						
							|  |  |  | #elif defined CONFIG_ESP32S2_DATA_CACHE_8KB | 
					
						
							|  |  |  | #define CONFIG_ESP32S2_DATA_CACHE_SIZE 0x2000 | 
					
						
							|  |  |  | #else | 
					
						
							|  |  |  | #define CONFIG_ESP32S2_DATA_CACHE_SIZE 0x4000 | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-06 11:15:53 +08:00
										 |  |  | #define RAM_IRAM_START    0x40020000 | 
					
						
							|  |  |  | #define RAM_DRAM_START    0x3FFB0000 | 
					
						
							| 
									
										
										
										
											2020-01-21 19:56:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 16:25:15 +10:00
										 |  |  | #define DATA_RAM_END      0x3FFE0000  /* 2nd stage bootloader iram_loader_seg starts at SRAM block 14 (reclaimed after app boots) */ | 
					
						
							| 
									
										
										
										
											2019-09-06 11:15:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define IRAM_ORG    (RAM_IRAM_START + CONFIG_ESP32S2_INSTRUCTION_CACHE_SIZE \ | 
					
						
							|  |  |  |                                     + CONFIG_ESP32S2_DATA_CACHE_SIZE) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define DRAM_ORG    (RAM_DRAM_START + CONFIG_ESP32S2_INSTRUCTION_CACHE_SIZE \ | 
					
						
							| 
									
										
										
										
											2020-01-21 19:56:33 +01:00
										 |  |  |                                     + CONFIG_ESP32S2_DATA_CACHE_SIZE) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define I_D_RAM_SIZE   DATA_RAM_END - DRAM_ORG | 
					
						
							| 
									
										
										
										
											2019-09-06 11:15:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-03 02:17:28 +08:00
										 |  |  | #if defined(CONFIG_ESP32S2_USE_FIXED_STATIC_RAM_SIZE) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ASSERT((CONFIG_ESP32S2_FIXED_STATIC_RAM_SIZE <= I_D_RAM_SIZE), | 
					
						
							|  |  |  |           "Fixed static ram data does not fit.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define STATIC_RAM_SIZE CONFIG_ESP32S2_FIXED_STATIC_RAM_SIZE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else | 
					
						
							|  |  |  | #define STATIC_RAM_SIZE 0 | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | MEMORY | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* All these values assume the flash cache is on, and have the blocks this uses subtracted from the length | 
					
						
							|  |  |  |   of the various regions. The 'data access port' dram/drom regions map to the same iram/irom regions but | 
					
						
							|  |  |  |   are connected to the data port of the CPU and eg allow bytewise access. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-06 11:15:53 +08:00
										 |  |  |   /* IRAM for CPU.*/ | 
					
						
							| 
									
										
										
										
											2020-01-21 19:56:33 +01:00
										 |  |  |   iram0_0_seg (RX) :                 org = IRAM_ORG, len = I_D_RAM_SIZE | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 18:07:02 +01:00
										 |  |  | #ifdef CONFIG_APP_BUILD_USE_FLASH_SECTIONS | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  |   /* Even though the segment name is iram, it is actually mapped to flash | 
					
						
							|  |  |  |   */ | 
					
						
							| 
									
										
										
										
											2020-01-16 14:35:55 +08:00
										 |  |  |   iram0_2_seg (RX) :                 org = 0x40080020, len = 0x780000-0x20 | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* | 
					
						
							| 
									
										
										
										
											2019-09-02 13:45:18 +08:00
										 |  |  |     (0x20 offset above is a convenience for the app binary image generation. | 
					
						
							|  |  |  |     Flash cache has 64KB pages. The .bin file which is flashed to the chip | 
					
						
							|  |  |  |     has a 0x18 byte file header, and each segment has a 0x08 byte segment | 
					
						
							|  |  |  |     header. Setting this offset makes it simple to meet the flash cache MMU's | 
					
						
							|  |  |  |     constraint that (paddr % 64KB == vaddr % 64KB).) | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  |   */ | 
					
						
							| 
									
										
										
										
											2020-01-21 18:07:02 +01:00
										 |  |  | #endif // CONFIG_APP_BUILD_USE_FLASH_SECTIONS | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-26 15:25:24 +08:00
										 |  |  |   /* Shared data RAM, excluding memory reserved for bootloader and ROM bss/data/stack. */ | 
					
						
							| 
									
										
										
										
											2020-06-03 02:17:28 +08:00
										 |  |  |   dram0_0_seg (RW) :                 org = DRAM_ORG, len = I_D_RAM_SIZE - STATIC_RAM_SIZE | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 18:07:02 +01:00
										 |  |  | #ifdef CONFIG_APP_BUILD_USE_FLASH_SECTIONS | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  |   /* Flash mapped constant data */ | 
					
						
							| 
									
										
										
										
											2019-09-02 13:45:18 +08:00
										 |  |  |   drom0_0_seg (R) :                  org = 0x3F000020, len = 0x3f0000-0x20 | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-02 13:45:18 +08:00
										 |  |  |   /* (See iram0_2_seg for meaning of 0x20 offset in the above.) */ | 
					
						
							| 
									
										
										
										
											2020-01-21 18:07:02 +01:00
										 |  |  | #endif // CONFIG_APP_BUILD_USE_FLASH_SECTIONS | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* RTC fast memory (executable). Persists over deep sleep. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   rtc_iram_seg(RWX) :                org = 0x40070000, len = 0x2000 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* RTC slow memory (data accessible). Persists over deep sleep. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      Start of RTC slow memory is reserved for ULP co-processor code + data, if enabled. | 
					
						
							|  |  |  |   */ | 
					
						
							| 
									
										
										
										
											2019-06-10 15:07:12 +08:00
										 |  |  |   rtc_slow_seg(RW)  :                org = 0x50000000 + CONFIG_ESP32S2_ULP_COPROC_RESERVE_MEM, | 
					
						
							| 
									
										
										
										
											2019-08-18 14:23:57 +08:00
										 |  |  |                                      len = 0x2000 - CONFIG_ESP32S2_ULP_COPROC_RESERVE_MEM | 
					
						
							| 
									
										
										
										
											2019-07-08 09:16:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-18 14:23:57 +08:00
										 |  |  |   /* RTC fast memory (same block as above), viewed from data bus */ | 
					
						
							| 
									
										
										
										
											2020-06-02 22:55:56 +08:00
										 |  |  |   rtc_data_seg(RW) :                 org = 0x3ff9e000, len = 0x2000 - ESP_BOOTLOADER_RESERVE_RTC | 
					
						
							| 
									
										
										
										
											2021-09-15 16:09:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* external memory, covers the dport, dram0, dram1 cacheable address space */ | 
					
						
							|  |  |  |   extern_ram_seg(RWX)  :             org = 0x3F500000, | 
					
						
							|  |  |  |                                      len = 0xA80000 | 
					
						
							| 
									
										
										
										
											2019-05-10 11:34:06 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-03 02:17:28 +08:00
										 |  |  | #if defined(CONFIG_ESP32S2_USE_FIXED_STATIC_RAM_SIZE) | 
					
						
							|  |  |  | /* static data ends at defined address */ | 
					
						
							|  |  |  | _static_data_end = DRAM_ORG + STATIC_RAM_SIZE; | 
					
						
							|  |  |  | #else | 
					
						
							| 
									
										
										
										
											2019-06-10 12:08:08 +08:00
										 |  |  | _static_data_end = _bss_end; | 
					
						
							| 
									
										
										
										
											2020-06-03 02:17:28 +08:00
										 |  |  | #endif | 
					
						
							| 
									
										
										
										
											2019-06-10 12:08:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-22 13:40:57 +01:00
										 |  |  | _heap_end = 0x40000000; | 
					
						
							| 
									
										
										
										
											2019-06-10 15:07:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | _data_seg_org = ORIGIN(rtc_data_seg); | 
					
						
							| 
									
										
										
										
											2019-07-08 09:16:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* The lines below define location alias for .rtc.data section based on Kconfig option. | 
					
						
							|  |  |  |    When the option is not defined then use slow memory segment | 
					
						
							|  |  |  |    else the data will be placed in fast memory segment | 
					
						
							| 
									
										
										
										
											2020-01-17 11:47:08 +08:00
										 |  |  |    TODO: check whether the rtc_data_location is correct for esp32s2 - IDF-761 */ | 
					
						
							| 
									
										
										
										
											2020-04-19 11:49:44 +05:30
										 |  |  | #ifndef CONFIG_ESP32S2_RTCDATA_IN_FAST_MEM | 
					
						
							| 
									
										
										
										
											2019-07-08 09:16:06 +08:00
										 |  |  | REGION_ALIAS("rtc_data_location", rtc_slow_seg ); | 
					
						
							|  |  |  | #else | 
					
						
							|  |  |  | REGION_ALIAS("rtc_data_location", rtc_data_seg ); | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2020-01-21 18:07:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_APP_BUILD_USE_FLASH_SECTIONS | 
					
						
							|  |  |  |   REGION_ALIAS("default_code_seg", iram0_2_seg); | 
					
						
							|  |  |  | #else | 
					
						
							|  |  |  |   REGION_ALIAS("default_code_seg", iram0_0_seg); | 
					
						
							|  |  |  | #endif // CONFIG_APP_BUILD_USE_FLASH_SECTIONS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_APP_BUILD_USE_FLASH_SECTIONS | 
					
						
							|  |  |  |   REGION_ALIAS("default_rodata_seg", drom0_0_seg); | 
					
						
							|  |  |  | #else | 
					
						
							|  |  |  |   REGION_ALIAS("default_rodata_seg", dram0_0_seg); | 
					
						
							|  |  |  | #endif // CONFIG_APP_BUILD_USE_FLASH_SECTIONS | 
					
						
							| 
									
										
										
										
											2021-03-18 12:01:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  *  If rodata default segment is placed in `drom0_0_seg`, then flash's first rodata section must | 
					
						
							|  |  |  |  *  also be first in the segment. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifdef CONFIG_APP_BUILD_USE_FLASH_SECTIONS | 
					
						
							|  |  |  |   ASSERT(_rodata_reserved_start == ORIGIN(default_rodata_seg), | 
					
						
							|  |  |  |          ".flash.appdesc section must be placed at the beginning of the rodata segment.") | 
					
						
							|  |  |  | #endif |