1# ----------------------------------------------------------------------------
2#         ATMEL Microcontroller Software Support
3# ----------------------------------------------------------------------------
4# Copyright (c) 2010, Atmel Corporation
5#
6# All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following condition is met:
10#
11# - Redistributions of source code must retain the above copyright notice,
12# this list of conditions and the disclaimer below.
13#
14# Atmel's name may not be used to endorse or promote products derived from
15# this software without specific prior written permission.
16#
17# DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
20# DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27# ----------------------------------------------------------------------------
28
29#-------------------------------------------------------------------------------
30#        User-modifiable options
31#-------------------------------------------------------------------------------
32
33ifeq ('$(CHIP)','')
34$(error CHIP not defined)
35endif
36
37include sam_series.mk
38
39# fill the needed variables
40ifeq ($(CHIP),$(findstring $(CHIP), $(SAM3N)))
41
42BOARD:=SAM3N_EK
43SERIES:=sam3n
44
45else ifeq ($(CHIP),$(findstring $(CHIP), $(SAM3S)))
46
47BOARD:=SAM3S_EK
48SERIES:=sam3s
49
50else ifeq ($(CHIP),$(findstring $(CHIP), $(SAM3SD8)))
51
52BOARD:=SAM3S_EK2
53SERIES:=sam3sd8
54
55else ifeq ($(CHIP),$(findstring $(CHIP), $(SAM3U)))
56
57BOARD:=SAM3U_EK
58SERIES:=sam3u
59
60else ifeq ($(CHIP),$(findstring $(CHIP), $(SAM3XA)))
61
62BOARD:=SAM3X_EK
63SERIES:=sam3xa
64
65else ifeq ($(CHIP),$(findstring $(CHIP), $(SAM4S)))
66
67BOARD:=SAM4S_EK
68SERIES:=sam4s
69
70endif
71
72
73# Defines which are the available memory targets for the device.
74MEMORIES = sram flash
75
76# Optimization level, put in comment for debugging
77OPTIMIZATION = -Os
78
79# Output directories
80BIN = $(CHIP)_bin
81OBJ = $(CHIP)_obj
82
83# Output file basename
84OUTPUT_BIN = $(BIN)/cmsis_example_$(BOARD)_$(CHIP)
85
86# GCC toolchain provider
87GCC_TOOLCHAIN=gcc_atmel
88
89#-------------------------------------------------------------------------------
90#		Tools
91#-------------------------------------------------------------------------------
92
93# Toolchain prefix when cross-compiling
94CROSS_COMPILE = arm-none-eabi-
95
96CMSIS_ROOT=../../..
97CMSIS_PATH=$(CMSIS_ROOT)/CMSIS/Include
98SAM_PATH=$(CMSIS_ROOT)/Device/ATMEL
99DEVICE_PATH=$(SAM_PATH)/$(SERIES)/source
100
101LIBS = -Wl,--start-group -lgcc -lc -Wl,--end-group
102
103LIB_PATH+=-L=/lib/thumb2
104LIB_PATH+=-L"$(realpath $(DEVICE_PATH)/$(GCC_TOOLCHAIN))"
105
106# Compilation tools
107CC = $(CROSS_COMPILE)gcc
108LD = $(CROSS_COMPILE)ld
109SIZE = $(CROSS_COMPILE)size
110STRIP = $(CROSS_COMPILE)strip
111OBJCOPY = $(CROSS_COMPILE)objcopy
112GDB = $(CROSS_COMPILE)gdb
113NM = $(CROSS_COMPILE)nm
114RM = rm
115
116# Flags
117INCLUDES := -I"$(CMSIS_PATH)"
118INCLUDES += -I"$(SAM_PATH)"
119INCLUDES += -I"$(SAM_PATH)/$(SERIES)/include"
120
121CFLAGS += -Wall -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int
122CFLAGS += -Werror-implicit-function-declaration -Wmain -Wparentheses
123CFLAGS += -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused
124CFLAGS += -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef
125CFLAGS += -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings
126CFLAGS += -Wsign-compare -Waggregate-return -Wstrict-prototypes
127CFLAGS += -Wmissing-prototypes -Wmissing-declarations
128CFLAGS += -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations
129CFLAGS += -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long
130CFLAGS += -Wunreachable-code
131CFLAGS += -Wcast-align
132#CFLAGS += -Wmissing-noreturn
133#CFLAGS += -Wconversion
134
135# To reduce application size use only integer printf function.
136CFLAGS += -Dprintf=iprintf
137
138# CFLAGS += -mlong-calls -Wall
139# CFLAGS += -ansi
140CFLAGS += -std=c99
141CFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb -ffunction-sections
142CFLAGS += -g $(OPTIMIZATION) $(INCLUDES) -D__$(CHIP)__ -DBOARD=$(BOARD)
143ASFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g $(OPTIMIZATION) $(INCLUDES) -D__$(CHIP)__ -D__ASSEMBLY__
144LDFLAGS= -mcpu=cortex-m3 -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--entry=Reset_Handler -Wl,--defsym=STACK_SIZE=0x200 -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--warn-unresolved-symbols
145#LD_OPTIONAL=-Wl,--print-gc-sections -Wl,--stats
146
147#-------------------------------------------------------------------------------
148#		Files
149#-------------------------------------------------------------------------------
150
151# Directories where source files can be found
152
153VPATH += ..
154VPATH += $(DEVICE_PATH)
155VPATH += $(DEVICE_PATH)/$(GCC_TOOLCHAIN)
156
157# Objects built from C source files
158C_OBJECTS += main.o
159C_OBJECTS += startup_$(SERIES).o
160C_OBJECTS += system_$(SERIES).o
161
162# Append OBJ and BIN directories to output filename
163OUTPUT := $(BIN)/$(OUTPUT_BIN)
164
165#-------------------------------------------------------------------------------
166#		Rules
167#-------------------------------------------------------------------------------
168
169all: $(BIN) $(OBJ) $(MEMORIES)
170
171$(BIN) $(OBJ):
172	-@mkdir $@
173
174define RULES
175C_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(C_OBJECTS))
176ASM_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(ASM_OBJECTS))
177
178$(1): $$(ASM_OBJECTS_$(1)) $$(C_OBJECTS_$(1))
179	$(CC) $(LIB_PATH) $(LDFLAGS) $(LD_OPTIONAL) -T"$(realpath $(DEVICE_PATH)/$(GCC_TOOLCHAIN)/$(CHIP)_$$@.ld)" -Wl,-Map,"$(OUTPUT_BIN)_$$@.map" -o "$(OUTPUT_BIN)_$$@.elf" $$^ $(LIBS)
180	@$(NM) "$(OUTPUT_BIN)_$$@.elf" >"$(OUTPUT_BIN)_$$@.elf.txt"
181	@$(OBJCOPY) -O binary "$(OUTPUT_BIN)_$$@.elf" "$(OUTPUT_BIN)_$$@.bin"
182	@$(SIZE) $$^ "$(OUTPUT_BIN)_$$@.elf"
183
184$$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile $(OBJ) $(BIN)
185	@$(CC) $(CFLAGS) -D$(1) -c -o $$@ $$<
186
187$$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile $(OBJ) $(BIN)
188	@$(CC) $(ASFLAGS) -D$(1) -c -o $$@ $$<
189
190debug_$(1): $(1)
191	$(GDB) -x "$(CHIP)_$(1).gdb" -ex "reset" -readnow -se "$(OUTPUT_BIN)_$(1).elf"
192endef
193
194$(foreach MEMORY, $(MEMORIES), $(eval $(call RULES,$(MEMORY))))
195
196clean:
197	-$(RM) -fR $(OBJ) $(BIN)
198