efm32: Major rework of build. Use single link script, more common code.

This commit is contained in:
Solomon Peachy 2013-08-05 17:03:38 -04:00
parent 62b2f375a2
commit 5bf2012426
11 changed files with 194 additions and 58 deletions

View file

@ -1,4 +1,8 @@
# Rule
EFM_UPPER = $(shell echo -n $(MCU) | tr a-z A-Z )
# Common Includes
MCU_INCLUDE += -I$(LIBDIR)/CMSIS/Device/EnergyMicro/$(EFM_UPPER)/Include
MCU_INCLUDE += -I$(LIBDIR)/emlib/inc
# CPPFLAGS
@ -12,3 +16,10 @@ EFM32COMMON_OBJSR = em_acmp.o em_cmu.o em_emu.o em_lesense.o em_opamp.o em_syste
em_burtc.o em_ebi.o em_lcd.o em_msc.o em_rtc.o em_wdog.o
EFM32COMMON_OBJS += $(addprefix $(LIBDIR)/emlib/src/,$(EFM32COMMON_OBJSR))
EFM32COMMON_OBJS += $(LIBDIR)/CMSIS/Device/EnergyMicro/$(EFM_UPPER)/Source/system_$(MCU).o $(LIBDIR)/startup_$(MCU).o
# Build Rules
$(LIBDIR)/startup_$(MCU).o: $(LIBDIR)/CMSIS/Device/EnergyMicro/$(EFM_UPPER)/Source/GCC/startup_$(MCU).S
@$(E) " AS " $@
$(Q)$(CPP) -include inc/$(MCU)_hw.h -D__STACK_SIZE=MCU_STACK_SIZE -D_start=main -p < $< | $(AS) -c -o $@

View file

@ -1 +0,0 @@
CMSIS/Device/EnergyMicro/EFM32G/Source/GCC/efm32g.ld

152
libs/efm32g.ld.in Normal file
View file

@ -0,0 +1,152 @@
/* Linker script for Energy Micro EFM32 family of devices */
/* */
/* This file is subject to the license terms as defined in ARM's */
/* CMSIS END USER LICENSE AGREEMENT.pdf, governing the use of */
/* Example Code. */
/* */
/* Energy Micro AS, 2012 */
MEMORY
{
FLASH (rx) : ORIGIN = MCU_FLASH_BASE, LENGTH = MCU_FLASH_SIZE
RAM (rwx) : ORIGIN = MCU_SRAM_BASE, LENGTH = MCU_SRAM_SIZE
}
/* Linker script to place sections and symbol values. Should be used together
* with other linker script that defines memory regions FLASH and RAM.
* It references following symbols, which must be defined in code:
* Reset_Handler : Entry of reset handler
*
* It defines following symbols, which code can use without definition:
* __exidx_start
* __exidx_end
* __etext
* __data_start__
* __preinit_array_start
* __preinit_array_end
* __init_array_start
* __init_array_end
* __fini_array_start
* __fini_array_end
* __data_end__
* __bss_start__
* __bss_end__
* __end__
* end
* __HeapLimit
* __StackLimit
* __StackTop
* __stack
*/
ENTRY(Reset_Handler)
SECTIONS
{
.text :
{
KEEP(*(.isr_vector))
*(.text*)
KEEP(*(.init))
KEEP(*(.fini))
/* .ctors */
*crtbegin.o(.ctors)
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT(.ctors.*))
*(.ctors)
/* .dtors */
*crtbegin.o(.dtors)
*crtbegin?.o(.dtors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
*(SORT(.dtors.*))
*(.dtors)
*(.rodata*)
KEEP(*(.eh_frame*))
} > FLASH
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > FLASH
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > FLASH
__exidx_end = .;
__etext = .;
.data : AT (__etext)
{
__data_start__ = .;
*(vtable)
*(.data*)
. = ALIGN (4);
*(.ram)
. = ALIGN(4);
/* preinit data */
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP(*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
/* init data */
PROVIDE_HIDDEN (__init_array_start = .);
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
/* finit data */
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
/* All data end */
__data_end__ = .;
} > RAM
.bss :
{
__bss_start__ = .;
*(.bss*)
*(COMMON)
__bss_end__ = .;
} > RAM
.heap :
{
__end__ = .;
end = __end__;
_end = __end__;
*(.heap*)
__HeapLimit = .;
} > RAM
/* .stack_dummy section doesn't contains any symbols. It is only
* used for linker to calculate size of stack sections, and assign
* values to stack symbols later */
.stack_dummy :
{
*(.stack)
} > RAM
/* Set stack top to end of RAM, and stack limit move down by
* size of stack_dummy section */
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
PROVIDE(__stack = __StackTop);
/* Check if data + heap + stack exceeds RAM limit */
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
}

View file

@ -1,21 +1,15 @@
# The processor!
MCU_CORE=cm3
# Set up include paths
MCU_INCLUDE += -I$(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32G/Include
# Common definitions
include $(LIBDIR)/efm32_common.mk
# Set up CFLAGS
MCU_CFLAGS += -mcpu=cortex-m3 -mthumb -Wa,-mthumb
# CMSIS
EFM32G_OBJS = $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32G/Source/system_$(MCU).o
include $(LIBDIR)/efm32_common.mk
# Any specific target?
EFM32G_OBJS =
# Bookkeeping
MCU_LIBS =
MCU_LIBS_OBJS += $(EFM32G_OBJS) $(EFM32COMMON_OBJS) $(LIBDIR)/startup_$(MCU).o
# Build Rules
$(LIBDIR)/startup_$(MCU).o: $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32G/Source/GCC/startup_$(MCU).S
@$(E) " AS " $@
$(Q)$(CPP) -D_start=main -p < $< | $(AS) -c -o $@
MCU_LIBS_OBJS += $(EFM32G_OBJS) $(EFM32COMMON_OBJS)

View file

@ -1 +1 @@
CMSIS/Device/EnergyMicro/EFM32GG/Source/GCC/efm32gg.ld
efm32g.ld.in

View file

@ -1,21 +1,15 @@
# The processor!
MCU_CORE=cm3
# Set up include paths
MCU_INCLUDE += -I$(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32GG/Include
# Common definitions
include $(LIBDIR)/efm32_common.mk
# Set up CFLAGS
MCU_CFLAGS += -mcpu=cortex-m3 -mthumb -Wa,-mthumb
# CMSIS
EFM32GG_OBJS = $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32GG/Source/system_$(MCU).o
include $(LIBDIR)/efm32_common.mk
# Any specific target?
EFM32GG_OBJS =
# Bookkeeping
MCU_LIBS =
MCU_LIBS_OBJS += $(EFM32GG_OBJS) $(EFM32COMMON_OBJS) $(LIBDIR)/startup_$(MCU).o
# Build Rules
$(LIBDIR)/startup_$(MCU).o: $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32GG/Source/GCC/startup_$(MCU).S
@$(E) " AS " $@
$(Q)$(CPP) -D_start=main -p < $< | $(AS) -c -o $@
MCU_LIBS_OBJS += $(EFM32GG_OBJS) $(EFM32COMMON_OBJS)

View file

@ -1 +1 @@
CMSIS/Device/EnergyMicro/EFM32LG/Source/GCC/efm32lg.ld
efm32g.ld.in

View file

@ -1,21 +1,16 @@
# The processor!
MCU_CORE=cm3
# Set up include paths
MCU_INCLUDE += -I$(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32LG/Include
# Common definitions
include $(LIBDIR)/efm32_common.mk
# Set up CFLAGS
MCU_CFLAGS += -mcpu=cortex-m3 -mthumb -Wa,-mthumb
# CMSIS
EFM32LG_OBJS = $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32LG/Source/system_$(MCU).o
include $(LIBDIR)/efm32_common.mk
# Any specific target?
EFM32LG_OBJS =
# Bookkeeping
MCU_LIBS =
MCU_LIBS_OBJS += $(EFM32LG_OBJS) $(EFM32COMMON_OBJS) $(LIBDIR)/startup_$(MCU).o
MCU_LIBS_OBJS += $(EFM32LG_OBJS) $(EFM32COMMON_OBJS)
# Build Rules
$(LIBDIR)/startup_$(MCU).o: $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32LG/Source/GCC/startup_$(MCU).S
@$(E) " AS " $@
$(Q)$(CPP) -D_start=main -p < $< | $(AS) -c -o $@

View file

@ -1 +1 @@
CMSIS/Device/EnergyMicro/EFM32TG/Source/GCC/efm32tg.ld
efm32g.ld.in

View file

@ -1,20 +1,16 @@
# The processor!
MCU_CORE=cm3
# Set up include paths
MCU_INCLUDE += -I$(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32TG/Include
# Common definitions
include $(LIBDIR)/efm32_common.mk
# Set up CFLAGS
MCU_CFLAGS += -mcpu=cortex-m3 -mthumb -Wa,-mthumb
# CMSIS
EFM32TG_OBJS = $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32TG/Source/system_$(MCU).o
include $(LIBDIR)/efm32_common.mk
# Any specific target?
EFM32TG_OBJS =
# Bookkeeping
MCU_LIBS =
MCU_LIBS_OBJS += $(EFM32TG_OBJS) $(EFM32COMMON_OBJS) $(LIBDIR)/startup_$(MCU).o
MCU_LIBS_OBJS += $(EFM32TG_OBJS) $(EFM32COMMON_OBJS)
# Build Rules
$(LIBDIR)/startup_$(MCU).o: $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32TG/Source/GCC/startup_$(MCU).S
@$(E) " AS " $@
$(Q)$(CPP) -D_start=main -p < $< | $(AS) -c -o $@

View file

@ -1 +1 @@
CMSIS/Device/EnergyMicro/EFM32WG/Source/GCC/efm32wg.ld
efm32g.ld.in

View file

@ -1,20 +1,15 @@
# The processor!
MCU_CORE=cm4
# Set up include paths
MCU_INCLUDE += -I$(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32WG/Include
# Common definitions
include $(LIBDIR)/efm32_common.mk
# Set up CFLAGS
MCU_CFLAGS += -mcpu=cortex-m4 -mthumb -Wa,-mthumb
# CMSIS
EFM32WG_OBJS = $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32WG/Source/system_$(MCU).o
include $(LIBDIR)/efm32_common.mk
# Any specific target?
EFM32WG_OBJS =
# Bookkeeping
MCU_LIBS =
MCU_LIBS_OBJS += $(EFM32WG_OBJS) $(EFM32COMMON_OBJS) $(LIBDIR)/startup_$(MCU).o
# Build Rules
$(LIBDIR)/startup_$(MCU).o: $(LIBDIR)/CMSIS/Device/EnergyMicro/EFM32WG/Source/GCC/startup_$(MCU).S
@$(E) " AS " $@
$(Q)$(CPP) -D_start=main -p < $< | $(AS) -c -o $@
MCU_LIBS_OBJS += $(EFM32WG_OBJS) $(EFM32COMMON_OBJS)