2018-11-24 10:55:51 -08:00
|
|
|
include ../../../tools/top.mk
|
|
|
|
|
|
|
|
# Select the board to build for.
|
|
|
|
ifeq ($(BOARD),)
|
2019-03-05 23:24:33 +07:00
|
|
|
$(info You must provide a BOARD parameter with 'BOARD=')
|
|
|
|
$(info Possible values are:)
|
|
|
|
$(info $(sort $(subst /.,,$(subst $(TOP)/hw/bsp/,,$(wildcard $(TOP)/hw/bsp/*/.)))))
|
|
|
|
$(error BOARD not defined)
|
2018-11-24 10:55:51 -08:00
|
|
|
else
|
|
|
|
ifeq ($(wildcard $(TOP)/hw/bsp/$(BOARD)/.),)
|
|
|
|
$(error Invalid BOARD specified)
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2019-03-20 01:23:49 +07:00
|
|
|
# Verbose mode (V=). 0: default, 1: print out CFLAG, LDFLAG 2: print all compile command
|
|
|
|
ifeq ("$(V)","2")
|
|
|
|
QUIET =
|
|
|
|
else
|
|
|
|
QUIET = @
|
|
|
|
endif
|
|
|
|
|
2018-11-24 10:55:51 -08:00
|
|
|
# If the build directory is not given, make it reflect the board name.
|
|
|
|
BUILD ?= build-$(BOARD)
|
|
|
|
|
|
|
|
CROSS_COMPILE = arm-none-eabi-
|
|
|
|
|
|
|
|
include $(TOP)/hw/bsp/$(BOARD)/board.mk
|
|
|
|
|
|
|
|
CC = $(CROSS_COMPILE)gcc
|
|
|
|
CXX = $(CROSS_COMPILE)g++
|
|
|
|
OBJCOPY = $(CROSS_COMPILE)objcopy
|
2019-01-29 19:39:34 +07:00
|
|
|
SIZE = $(CROSS_COMPILE)size
|
2018-11-24 10:55:51 -08:00
|
|
|
MKDIR = mkdir
|
|
|
|
SED = sed
|
|
|
|
CP = cp
|
|
|
|
RM = rm
|
2018-11-27 18:11:03 -08:00
|
|
|
AS = $(CROSS_COMPILE)as
|
2018-11-24 10:55:51 -08:00
|
|
|
|
|
|
|
INC += -Isrc \
|
|
|
|
-I$(TOP)/hw \
|
|
|
|
-I$(TOP)/src
|
|
|
|
|
|
|
|
CFLAGS += \
|
|
|
|
-fsingle-precision-constant \
|
|
|
|
-fno-strict-aliasing \
|
|
|
|
-Wdouble-promotion \
|
|
|
|
-Wno-endif-labels \
|
|
|
|
-Wstrict-prototypes \
|
|
|
|
-Werror-implicit-function-declaration \
|
|
|
|
-Wfloat-equal \
|
|
|
|
-Wundef \
|
|
|
|
-Wshadow \
|
|
|
|
-Wwrite-strings \
|
|
|
|
-Wsign-compare \
|
|
|
|
-Wmissing-format-attribute \
|
|
|
|
-Wno-deprecated-declarations \
|
|
|
|
-Wnested-externs \
|
|
|
|
-Wunreachable-code \
|
|
|
|
-Wno-error=lto-type-mismatch \
|
|
|
|
-ffunction-sections \
|
|
|
|
-fdata-sections
|
|
|
|
|
2019-03-20 01:23:49 +07:00
|
|
|
# This causes lots of warning with nrf5x build due to nrfx code
|
|
|
|
# CFLAGS += -Wcast-align
|
|
|
|
|
2018-11-24 10:55:51 -08:00
|
|
|
#Debugging/Optimization
|
|
|
|
ifeq ($(DEBUG), 1)
|
|
|
|
CFLAGS += -O0 -ggdb
|
|
|
|
else
|
|
|
|
CFLAGS += -flto -Os
|
|
|
|
endif
|
|
|
|
|
2019-03-20 01:23:49 +07:00
|
|
|
CFLAGS += $(INC) -Wall -Werror -std=gnu11 -DBOARD_$(shell echo $(BOARD) | tr a-z\- A-Z_)
|
|
|
|
LDFLAGS += $(CFLAGS) -fshort-enums -Wl,-T,$(TOP)/$(LD_FILE) -Wl,-Map=$@.map -Wl,-cref -Wl,-gc-sections -specs=nosys.specs -specs=nano.specs
|
|
|
|
|
|
|
|
ifeq ("$(V)","1")
|
|
|
|
$(info CFLAGS $(CFLAGS))
|
|
|
|
$(info )
|
|
|
|
$(info LDFLAGS $(LDFLAGS))
|
|
|
|
$(info )
|
|
|
|
$(info ASFLAGS $(ASFLAGS))
|
|
|
|
$(info )
|
|
|
|
endif
|
2019-03-19 16:41:00 +07:00
|
|
|
|
|
|
|
LIBS = -lgcc -lc -lm -lnosys
|
2018-11-24 10:55:51 -08:00
|
|
|
|
|
|
|
EXAMPLE_SOURCE += \
|
|
|
|
src/main.c \
|
|
|
|
src/msc_app.c \
|
|
|
|
src/msc_disk_ram.c \
|
|
|
|
src/tusb_descriptors.c
|
|
|
|
|
|
|
|
SRC_C += $(addprefix $(CURRENT_PATH)/, $(EXAMPLE_SOURCE))
|
|
|
|
|
|
|
|
LIB_SOURCE += \
|
|
|
|
hw/bsp/$(BOARD)/board_$(BOARD).c \
|
|
|
|
src/common/tusb_fifo.c \
|
|
|
|
src/device/usbd.c \
|
|
|
|
src/device/usbd_auto_desc.c \
|
|
|
|
src/device/usbd_control.c \
|
|
|
|
src/class/msc/msc_device.c \
|
|
|
|
src/class/cdc/cdc_device.c \
|
|
|
|
src/class/hid/hid_device.c \
|
|
|
|
src/tusb.c \
|
2018-12-05 13:32:55 +07:00
|
|
|
src/portable/$(VENDOR)/$(CHIP_FAMILY)/dcd_$(CHIP_FAMILY).c
|
2018-11-24 10:55:51 -08:00
|
|
|
|
|
|
|
SRC_C += $(LIB_SOURCE)
|
|
|
|
|
2019-03-05 23:24:33 +07:00
|
|
|
# Assembly files can be name with upper case .S, convert it to .s
|
|
|
|
SRC_S := $(SRC_S:.S=.s)
|
|
|
|
|
2019-03-20 01:23:49 +07:00
|
|
|
# Due to GCC LTO bug https://bugs.launchpad.net/gcc-arm-embedded/+bug/1747966
|
|
|
|
# assembly file should be placed first in linking order
|
2019-03-05 23:24:33 +07:00
|
|
|
OBJ += $(addprefix $(BUILD)/obj/, $(SRC_S:.s=.o))
|
2019-03-19 16:41:00 +07:00
|
|
|
OBJ += $(addprefix $(BUILD)/obj/, $(SRC_C:.c=.o))
|
2019-01-09 11:38:28 -05:00
|
|
|
|
2019-03-09 01:04:26 +07:00
|
|
|
# Set all as default goal
|
|
|
|
.DEFAULT_GOAL := all
|
2019-01-29 19:39:34 +07:00
|
|
|
all: $(BUILD)/$(BOARD)-firmware.bin size
|
2018-11-24 10:55:51 -08:00
|
|
|
|
|
|
|
OBJ_DIRS = $(sort $(dir $(OBJ)))
|
|
|
|
$(OBJ): | $(OBJ_DIRS)
|
|
|
|
$(OBJ_DIRS):
|
|
|
|
@$(MKDIR) -p $@
|
|
|
|
|
|
|
|
$(BUILD)/$(BOARD)-firmware.elf: $(OBJ)
|
|
|
|
@echo LINK $@
|
2019-03-20 01:23:49 +07:00
|
|
|
$(QUIET)$(CC) -o $@ $(LDFLAGS) $^ -Wl,--start-group $(LIBS) -Wl,--end-group
|
2018-11-24 10:55:51 -08:00
|
|
|
|
|
|
|
$(BUILD)/$(BOARD)-firmware.bin: $(BUILD)/$(BOARD)-firmware.elf
|
|
|
|
@echo CREATE $@
|
2019-03-09 01:04:26 +07:00
|
|
|
@$(OBJCOPY) -O binary -j .vectors -j .text -j .data $^ $@
|
2019-03-16 01:34:26 +07:00
|
|
|
|
|
|
|
$(BUILD)/$(BOARD)-firmware.hex: $(BUILD)/$(BOARD)-firmware.elf
|
|
|
|
@echo CREATE $@
|
|
|
|
@$(OBJCOPY) -O ihex $^ $@
|
2018-11-24 10:55:51 -08:00
|
|
|
|
|
|
|
# We set vpath to point to the top of the tree so that the source files
|
|
|
|
# can be located. By following this scheme, it allows a single build rule
|
|
|
|
# to be used to compile all .c files.
|
|
|
|
vpath %.c . $(TOP)
|
|
|
|
$(BUILD)/obj/%.o: %.c
|
2019-01-02 22:35:42 +07:00
|
|
|
@echo CC $(notdir $@)
|
2019-03-20 01:23:49 +07:00
|
|
|
$(QUIET)$(CC) $(CFLAGS) -c -MD -o $@ $<
|
2018-11-24 10:55:51 -08:00
|
|
|
@# The following fixes the dependency file.
|
|
|
|
@# See http://make.paulandlesley.org/autodep.html for details.
|
|
|
|
@# Regex adjusted from the above to play better with Windows paths, etc.
|
|
|
|
@$(CP) $(@:.o=.d) $(@:.o=.P); \
|
|
|
|
$(SED) -e 's/#.*//' -e 's/^.*: *//' -e 's/ *\\$$//' \
|
|
|
|
-e '/^$$/ d' -e 's/$$/ :/' < $(@:.o=.d) >> $(@:.o=.P); \
|
|
|
|
$(RM) $(@:.o=.d)
|
|
|
|
|
2019-03-05 23:24:33 +07:00
|
|
|
# ASM sources lower case .s
|
2018-11-27 18:11:03 -08:00
|
|
|
vpath %.s . $(TOP)
|
|
|
|
$(BUILD)/obj/%.o: %.s
|
2019-03-05 23:24:33 +07:00
|
|
|
@echo AS $(notdir $@)
|
2019-03-20 01:23:49 +07:00
|
|
|
$(QUIET)$(CC) -x assembler-with-cpp $(ASFLAGS) -c -o $@ $<
|
2019-03-05 23:24:33 +07:00
|
|
|
|
|
|
|
# ASM sources upper case .S
|
|
|
|
vpath %.S . $(TOP)
|
|
|
|
$(BUILD)/obj/%.o: %.S
|
|
|
|
@echo AS $(notdir $@)
|
2019-03-20 01:23:49 +07:00
|
|
|
$(QUIET)$(CC) -x assembler-with-cpp $(ASFLAGS) -c -o $@ $<
|
2019-01-02 22:35:42 +07:00
|
|
|
|
2019-03-16 01:34:26 +07:00
|
|
|
# Flash binary using Jlink
|
|
|
|
ifeq ($(OS),Windows_NT)
|
|
|
|
JLINKEXE = JLink.exe
|
|
|
|
else
|
|
|
|
JLINKEXE = JLinkExe
|
|
|
|
endif
|
|
|
|
|
2019-03-17 15:42:57 +07:00
|
|
|
# default jlink interface is swd
|
|
|
|
ifeq ($(JLINK_IF),)
|
|
|
|
JLINK_IF = swd
|
|
|
|
endif
|
|
|
|
|
2019-03-19 16:41:00 +07:00
|
|
|
# Flash using jlink
|
2019-03-17 15:42:57 +07:00
|
|
|
flash-jlink: $(BUILD)/$(BOARD)-firmware.hex
|
2019-03-16 01:34:26 +07:00
|
|
|
@echo halt > $(BUILD)/$(BOARD).jlink
|
|
|
|
@echo loadfile $^ >> $(BUILD)/$(BOARD).jlink
|
2019-03-17 15:42:57 +07:00
|
|
|
@echo r >> $(BUILD)/$(BOARD).jlink
|
2019-03-16 01:34:26 +07:00
|
|
|
@echo go >> $(BUILD)/$(BOARD).jlink
|
|
|
|
@echo exit >> $(BUILD)/$(BOARD).jlink
|
2019-03-17 15:42:57 +07:00
|
|
|
$(JLINKEXE) -device $(JLINK_DEVICE) -if $(JLINK_IF) -speed auto -CommandFile $(BUILD)/$(BOARD).jlink
|
2019-03-16 01:34:26 +07:00
|
|
|
|
2019-01-29 19:39:34 +07:00
|
|
|
size: $(BUILD)/$(BOARD)-firmware.elf
|
|
|
|
-@echo ''
|
|
|
|
@$(SIZE) $<
|
|
|
|
-@echo ''
|
|
|
|
|
2018-11-24 10:55:51 -08:00
|
|
|
clean:
|
|
|
|
rm -rf build-$(BOARD)
|