summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/esp32/Makefile76
-rw-r--r--ports/esp32/esp32.custom_common.ld273
2 files changed, 73 insertions, 276 deletions
diff --git a/ports/esp32/Makefile b/ports/esp32/Makefile
index 64ca664ee..9e465a935 100644
--- a/ports/esp32/Makefile
+++ b/ports/esp32/Makefile
@@ -117,7 +117,7 @@ LDFLAGS += -u call_user_start_cpu0 -u uxTopUsedPriority -u ld_include_panic_high
LDFLAGS += -u __cxa_guard_dummy # so that implementation of static guards is taken from cxx_guards.o instead of libstdc++.a
LDFLAGS += -L$(ESPCOMP)/esp32/ld
LDFLAGS += -T $(BUILD)/esp32_out.ld
-LDFLAGS += -T ./esp32.custom_common.ld
+LDFLAGS += -T esp32.common.ld
LDFLAGS += -T esp32.rom.ld
LDFLAGS += -T esp32.peripherals.ld
@@ -634,6 +634,75 @@ OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_SMARTCONFIG_ACK_O))
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_SPI_FLASH_O))
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_ULP_O))
OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_WPA_SUPPLICANT_O))
+
+LIB_ESPIDF =
+LIB_ESPIDF += driver
+LIB_ESPIDF += esp32
+LIB_ESPIDF += heap
+LIB_ESPIDF += soc
+LIB_ESPIDF += cxx
+LIB_ESPIDF += ethernet
+LIB_ESPIDF += expat
+LIB_ESPIDF += pthread
+LIB_ESPIDF += freertos
+LIB_ESPIDF += vfs
+LIB_ESPIDF += json
+LIB_ESPIDF += log
+LIB_ESPIDF += xtensa-debug-module
+LIB_ESPIDF += tcpip_adapter
+LIB_ESPIDF += app_trace
+LIB_ESPIDF += app_update
+LIB_ESPIDF += newlib
+LIB_ESPIDF += nghttp
+LIB_ESPIDF += nvs_flash
+LIB_ESPIDF += smartconfig_ack
+LIB_ESPIDF += spi_flash
+LIB_ESPIDF += ulp
+LIB_ESPIDF += lwip
+LIB_ESPIDF += mbedtls
+LIB_ESPIDF += wpa_supplicant
+
+BUILD_ESPIDF_LIB = $(BUILD)/esp-idf
+
+OBJ_ESPIDF_DIRS = $(sort $(dir $(OBJ_ESPIDF))) $(BUILD_ESPIDF_LIB) $(addprefix $(BUILD_ESPIDF_LIB)/,$(LIB_ESPIDF))
+$(OBJ_ESPIDF): | $(OBJ_ESPIDF_DIRS)
+$(OBJ_ESPIDF_DIRS):
+ $(MKDIR) -p $@
+
+define gen_espidf_lib_rule
+$(BUILD_ESPIDF_LIB)/$(1)/lib$(1).a: $(addprefix $$(BUILD)/,$(2))
+ $(ECHO) "AR $$@"
+ $(Q)$(AR) cru $$@ $$^
+endef
+
+$(eval $(call gen_espidf_lib_rule,driver,$(ESPIDF_DRIVER_O)))
+$(eval $(call gen_espidf_lib_rule,esp32,$(ESPIDF_ESP32_O)))
+$(eval $(call gen_espidf_lib_rule,heap,$(ESPIDF_HEAP_O)))
+$(eval $(call gen_espidf_lib_rule,soc,$(ESPIDF_SOC_O)))
+$(eval $(call gen_espidf_lib_rule,cxx,$(ESPIDF_CXX_O)))
+$(eval $(call gen_espidf_lib_rule,ethernet,$(ESPIDF_ETHERNET_O)))
+$(eval $(call gen_espidf_lib_rule,expat,$(ESPIDF_EXPAT_O)))
+$(eval $(call gen_espidf_lib_rule,pthread,$(ESPIDF_PTHREAD_O)))
+$(eval $(call gen_espidf_lib_rule,freertos,$(ESPIDF_FREERTOS_O)))
+$(eval $(call gen_espidf_lib_rule,vfs,$(ESPIDF_VFS_O)))
+$(eval $(call gen_espidf_lib_rule,json,$(ESPIDF_JSON_O)))
+$(eval $(call gen_espidf_lib_rule,log,$(ESPIDF_LOG_O)))
+$(eval $(call gen_espidf_lib_rule,xtensa-debug-module,$(ESPIDF_XTENSA_DEBUG_MODULE_O)))
+$(eval $(call gen_espidf_lib_rule,tcpip_adapter,$(ESPIDF_TCPIP_ADAPTER_O)))
+$(eval $(call gen_espidf_lib_rule,app_trace,$(ESPIDF_APP_TRACE_O)))
+$(eval $(call gen_espidf_lib_rule,app_update,$(ESPIDF_APP_UPDATE_O)))
+$(eval $(call gen_espidf_lib_rule,newlib,$(ESPIDF_NEWLIB_O)))
+$(eval $(call gen_espidf_lib_rule,nghttp,$(ESPIDF_NGHTTP_O)))
+$(eval $(call gen_espidf_lib_rule,nvs_flash,$(ESPIDF_NVS_FLASH_O)))
+$(eval $(call gen_espidf_lib_rule,smartconfig_ack,$(ESPIDF_SMARTCONFIG_ACK_O)))
+$(eval $(call gen_espidf_lib_rule,spi_flash,$(ESPIDF_SPI_FLASH_O)))
+$(eval $(call gen_espidf_lib_rule,ulp,$(ESPIDF_ULP_O)))
+$(eval $(call gen_espidf_lib_rule,lwip,$(ESPIDF_LWIP_O)))
+$(eval $(call gen_espidf_lib_rule,mbedtls,$(ESPIDF_MBEDTLS_O)))
+$(eval $(call gen_espidf_lib_rule,wpa_supplicant,$(ESPIDF_WPA_SUPPLICANT_O)))
+
+LIB = $(foreach lib,$(LIB_ESPIDF),$(BUILD_ESPIDF_LIB)/$(lib)/lib$(lib).a)
+
################################################################################
# Main targets
@@ -659,7 +728,7 @@ erase:
################################################################################
# Declarations to build the application
-OBJ = $(OBJ_MP) $(OBJ_ESPIDF)
+OBJ = $(OBJ_MP)
APP_LD_ARGS =
APP_LD_ARGS += $(LDFLAGS_MOD)
@@ -670,6 +739,7 @@ APP_LD_ARGS += $(LIBC_LIBM)
APP_LD_ARGS += $(ESPCOMP)/esp32/libhal.a
APP_LD_ARGS += -L$(ESPCOMP)/esp32/lib -lcore -lmesh -lnet80211 -lphy -lrtc -lpp -lwpa -lsmartconfig -lcoexist -lwps -lwpa2
APP_LD_ARGS += $(OBJ)
+APP_LD_ARGS += $(LIB)
APP_LD_ARGS += --end-group
$(BUILD)/esp32_out.ld: sdkconfig.h
@@ -679,7 +749,7 @@ $(BUILD)/application.bin: $(BUILD)/application.elf
$(ECHO) "Create $@"
$(Q)$(ESPTOOL) --chip esp32 elf2image --flash_mode $(FLASH_MODE) --flash_freq $(FLASH_FREQ) --flash_size $(FLASH_SIZE) $<
-$(BUILD)/application.elf: $(OBJ) $(BUILD)/esp32_out.ld
+$(BUILD)/application.elf: $(OBJ) $(LIB) $(BUILD)/esp32_out.ld
$(ECHO) "LINK $@"
$(Q)$(LD) $(LDFLAGS) -o $@ $(APP_LD_ARGS)
$(Q)$(SIZE) $@
diff --git a/ports/esp32/esp32.custom_common.ld b/ports/esp32/esp32.custom_common.ld
deleted file mode 100644
index d28d5e26c..000000000
--- a/ports/esp32/esp32.custom_common.ld
+++ /dev/null
@@ -1,273 +0,0 @@
-/* Default entry point: */
-ENTRY(call_start_cpu0);
-
-SECTIONS
-{
- /* RTC fast memory holds RTC wake stub code,
- including from any source file named rtc_wake_stub*.c
- */
- .rtc.text :
- {
- . = ALIGN(4);
- *(.rtc.literal .rtc.text)
- *rtc_wake_stub*.o(.literal .text .literal.* .text.*)
- } > rtc_iram_seg
-
- /* RTC slow memory holds RTC wake stub
- data/rodata, including from any source file
- named rtc_wake_stub*.c
- */
- .rtc.data :
- {
- _rtc_data_start = ABSOLUTE(.);
- *(.rtc.data)
- *(.rtc.rodata)
- *rtc_wake_stub*.o(.data .rodata .data.* .rodata.* .bss .bss.*)
- _rtc_data_end = ABSOLUTE(.);
- } > rtc_slow_seg
-
- /* RTC bss, from any source file named rtc_wake_stub*.c */
- .rtc.bss (NOLOAD) :
- {
- _rtc_bss_start = ABSOLUTE(.);
- *rtc_wake_stub*.o(.bss .bss.*)
- *rtc_wake_stub*.o(COMMON)
- _rtc_bss_end = ABSOLUTE(.);
- } > rtc_slow_seg
-
- /* This section holds data that should not be initialized at power up
- and will be retained during deep sleep. The section located in
- RTC SLOW Memory area. User data marked with RTC_NOINIT_ATTR will be placed
- into this section. See the file "esp_attr.h" for more information.
- */
- .rtc_noinit (NOLOAD):
- {
- . = ALIGN(4);
- _rtc_noinit_start = ABSOLUTE(.);
- *(.rtc_noinit .rtc_noinit.*)
- . = ALIGN(4) ;
- _rtc_noinit_end = ABSOLUTE(.);
- } > rtc_slow_seg
-
- /* Send .iram0 code to iram */
- .iram0.vectors :
- {
- _iram_start = ABSOLUTE(.);
- /* Vectors go to IRAM */
- _init_start = ABSOLUTE(.);
- /* Vectors according to builds/RF-2015.2-win32/esp108_v1_2_s5_512int_2/config.html */
- . = 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;
- *(.*Vector.literal)
-
- *(.UserEnter.literal);
- *(.UserEnter.text);
- . = ALIGN (16);
- *(.entry.text)
- *(.init.literal)
- *(.init)
- _init_end = ABSOLUTE(.);
- } > iram0_0_seg
-
- .iram0.text :
- {
- /* Code marked as runnning out of IRAM */
- _iram_text_start = ABSOLUTE(.);
- *(.iram1 .iram1.*)
- *freertos/*(.literal .text .literal.* .text.*)
- *heap/multi_heap.o(.literal .text .literal.* .text.*)
- *heap/multi_heap_poisoning.o(.literal .text .literal.* .text.*)
- *esp32/panic.o(.literal .text .literal.* .text.*)
- *esp32/core_dump.o(.literal .text .literal.* .text.*)
- *app_trace/*(.literal .text .literal.* .text.*)
- *xtensa-debug-module/eri.o(.literal .text .literal.* .text.*)
- *librtc.a:(.literal .text .literal.* .text.*)
- *soc/esp32/rtc_*.o(.literal .text .literal.* .text.*)
- *soc/esp32/cpu_util.o(.literal .text .literal.* .text.*)
- *libhal.a:(.literal .text .literal.* .text.*)
- *libgcc.a:lib2funcs.o(.literal .text .literal.* .text.*)
- *spi_flash/spi_flash_rom_patch.o(.literal .text .literal.* .text.*)
- *libgcov.a:(.literal .text .literal.* .text.*)
- INCLUDE esp32.spiram.rom-functions-iram.ld
- _iram_text_end = ABSOLUTE(.);
- _iram_end = ABSOLUTE(.);
- } > iram0_0_seg
-
- .dram0.data :
- {
- _data_start = ABSOLUTE(.);
- _bt_data_start = ABSOLUTE(.);
- *libbt.a:(.data .data.*)
- . = ALIGN (4);
- _bt_data_end = ABSOLUTE(.);
- _btdm_data_start = ABSOLUTE(.);
- *libbtdm_app.a:(.data .data.*)
- . = ALIGN (4);
- _btdm_data_end = ABSOLUTE(.);
- *(.data)
- *(.data.*)
- *(.gnu.linkonce.d.*)
- *(.data1)
- *(.sdata)
- *(.sdata.*)
- *(.gnu.linkonce.s.*)
- *(.sdata2)
- *(.sdata2.*)
- *(.gnu.linkonce.s2.*)
- *(.jcr)
- *(.dram1 .dram1.*)
- *esp32/panic.o(.rodata .rodata.*)
- *libphy.a:(.rodata .rodata.*)
- *soc/esp32/rtc_clk.o(.rodata .rodata.*)
- *app_trace/app_trace.o(.rodata .rodata.*)
- *libgcov.a:(.rodata .rodata.*)
- *heap/multi_heap.o(.rodata .rodata.*)
- *heap/multi_heap_poisoning.o(.rodata .rodata.*)
- INCLUDE esp32.spiram.rom-functions-dram.ld
- _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(.);
- _bt_bss_start = ABSOLUTE(.);
- *libbt.a:(.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(.);
- *(.dynsbss)
- *(.sbss)
- *(.sbss.*)
- *(.gnu.linkonce.sb.*)
- *(.scommon)
- *(.sbss2)
- *(.sbss2.*)
- *(.gnu.linkonce.sb2.*)
- *(.dynbss)
- *(.bss)
- *(.bss.*)
- *(.share.mem)
- *(.gnu.linkonce.b.*)
- *(COMMON)
- . = ALIGN (8);
- _bss_end = ABSOLUTE(.);
- /* The heap starts right after end of this section */
- _heap_start = ABSOLUTE(.);
- } > dram0_0_seg
-
- .flash.rodata :
- {
- _rodata_start = ABSOLUTE(.);
- *(.rodata)
- *(.rodata.*)
- *(.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, properly ordered: */
- __init_array_start = ABSOLUTE(.);
- KEEP (*crtbegin.o(.ctors))
- KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
- KEEP (*(SORT(.ctors.*)))
- KEEP (*(.ctors))
- __init_array_end = ABSOLUTE(.);
- KEEP (*crtbegin.o(.dtors))
- KEEP (*(EXCLUDE_FILE (*crtend.o) .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(.);
- . = ALIGN(4);
- } >drom0_0_seg
-
- .flash.text :
- {
- _stext = .;
- _text_start = ABSOLUTE(.);
- *(.literal .text .literal.* .text.* .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)
- _text_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);
- } >iram0_2_seg
-}