- For using Arduino makefile with cygwin environmnet, OpenCR uses its own Windows binary to upload an image to the board. For this reason, Windows COM port is needed as an argument instead of using converted device path. Signed-off-by: wecracy <wecracy@snu.ac.kr>
274 lines
11 KiB
Makefile
274 lines
11 KiB
Makefile
########################################################################
|
|
#
|
|
# Support for Robotis OpenCR boards
|
|
#
|
|
# Written by Dowhan Jeong, EunJin Jeong
|
|
# Changed by Woosuk Kang
|
|
#
|
|
# Based on work that is copyright Jeremy Shaw, Sudar, Nicholas Zambetti,
|
|
# David A. Mellis & Hernando Barragan.
|
|
#
|
|
# This file is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU Lesser General Public License as
|
|
# published by the Free Software Foundation; either version 2.1 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
########################################################################
|
|
|
|
ifndef ARDUINO_DIR
|
|
echo $(error ARDUINO_DIR should be specified)
|
|
endif
|
|
|
|
ifndef BOARD_TAG
|
|
echo $(error BOARD_TAG should be specified. check board list with 'make show_boards')
|
|
endif
|
|
|
|
ifndef ARDMK_DIR
|
|
ARDMK_DIR := $(realpath $(dir $(realpath $(lastword $(MAKEFILE_LIST)))))
|
|
endif
|
|
|
|
include $(ARDMK_DIR)/Common.mk
|
|
|
|
ifndef ARDUINO_PACKAGE_DIR
|
|
# attempt to find based on Linux, macOS and Windows default
|
|
ARDUINO_PACKAGE_DIR := $(firstword \
|
|
$(call dir_if_exists,$(HOME)/.arduino15/packages) \
|
|
$(call dir_if_exists,$(ARDUINO_DIR)/packages) \
|
|
$(call dir_if_exists,$(HOME)/Library/Arduino15/packages) \
|
|
$(call dir_if_exists,$(realpath $(USERPROFILE))/AppData/Local/Arduino15/packages) )
|
|
$(call show_config_variable,ARDUINO_PACKAGE_DIR,[AUTODETECTED],(from DEFAULT))
|
|
else
|
|
$(call show_config_variable,ARDUINO_PACKAGE_DIR,[USER])
|
|
endif
|
|
|
|
ifndef ARDMK_VENDOR
|
|
ARDMK_VENDOR = OpenCR
|
|
endif
|
|
|
|
ifndef ARCHITECTURE
|
|
ARCHITECTURE := OpenCR
|
|
endif
|
|
|
|
ifndef CORE_VER
|
|
CORE_VER := $(wildcard $(ARDUINO_PACKAGE_DIR)/$(ARDMK_VENDOR)/hardware/$(ARCHITECTURE)/1.*)
|
|
ifneq ($(CORE_VER),)
|
|
CORE_VER := $(shell basename $(CORE_VER))
|
|
$(call show_config_variable,CORE_VER,[AUTODETECTED],(from ARDUINO_PACKAGE_DIR))
|
|
endif
|
|
else
|
|
$(call show_config_variable,CORE_VER,[USER])
|
|
endif
|
|
|
|
ARCHITECTURE := sam
|
|
|
|
arduino_output =
|
|
# When output is not suppressed and we're in the top-level makefile,
|
|
# running for the first time (i.e., not after a restart after
|
|
# regenerating the dependency file), then output the configuration.
|
|
ifndef ARDUINO_QUIET
|
|
ifeq ($(MAKE_RESTARTS),)
|
|
ifeq ($(MAKELEVEL),0)
|
|
arduino_output = $(info $(1))
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# Arduino Settings (will get shown in Arduino.mk as computed)
|
|
ifndef ALTERNATE_CORE_PATH
|
|
ifdef CORE_VER
|
|
ALTERNATE_CORE_PATH = $(ARDUINO_PACKAGE_DIR)/OpenCR/hardware/OpenCR/$(CORE_VER)
|
|
else
|
|
echo $(error Cannot find $(CORE_VER). Check directory settings.)
|
|
endif
|
|
endif
|
|
|
|
ifndef ARDUINO_CORE_PATH
|
|
ARDUINO_CORE_PATH= $(ALTERNATE_CORE_PATH)/cores/arduino
|
|
endif
|
|
|
|
ifndef BOARDS_TXT
|
|
BOARDS_TXT= $(ALTERNATE_CORE_PATH)/boards.txt
|
|
endif
|
|
|
|
ifndef VARIANT
|
|
VARIANT := $(call PARSE_BOARD,$(BOARD_TAG),build.variant)
|
|
endif
|
|
|
|
ARDUINO_VAR_PATH = $(ALTERNATE_CORE_PATH)/variants/$(VARIANT)
|
|
|
|
|
|
# Check boards file exists before continuing as parsing non-existant file can create problems
|
|
ifneq ($(findstring boards.txt, $(wildcard $(ALTERNATE_CORE_PATH)/*.txt)), boards.txt)
|
|
echo $(error $(CORE_VER) Cannot find boards file $(BOARDS_TXT). Check ?? and board support installed)
|
|
endif
|
|
|
|
# grab any sources in the variant core path.
|
|
# directorys were manually checked.
|
|
# Core sources(used to generate libcore.a archive)
|
|
OPENCR_CORE_C_SRCS_1 := $(wildcard $(ARDUINO_CORE_PATH)/avr/*.c)
|
|
OPENCR_CORE_C_SRCS_2 := $(wildcard $(ARDUINO_CORE_PATH)/*.c)
|
|
OPENCR_CORE_CPP_SRCS := $(wildcard $(ARDUINO_CORE_PATH)/*.cpp)
|
|
|
|
# library sources
|
|
OPENCR_LIB_C_SRCS_1 := $(wildcard $(ARDUINO_VAR_PATH)/bsp/opencr/*.c)
|
|
OPENCR_LIB_C_SRCS_2 := $(wildcard $(ARDUINO_VAR_PATH)/hw/*.c)
|
|
OPENCR_LIB_C_SRCS_3 := $(wildcard $(ARDUINO_VAR_PATH)/hw/driver/*.c)
|
|
OPENCR_LIB_C_SRCS_4 := $(wildcard $(ARDUINO_VAR_PATH)/hw/usb_cdc/*.c)
|
|
OPENCR_LIB_C_SRCS_5 := $(wildcard $(ARDUINO_VAR_PATH)/lib/STM32F7xx_HAL_Driver/Src/*.c)
|
|
OPENCR_LIB_CPP_SRCS := $(wildcard $(ARDUINO_VAR_PATH)/*.cpp)
|
|
OPENCR_LIB_S_SRCS := $(wildcard $(ARDUINO_VAR_PATH)/bsp/opencr/startup/*.S)
|
|
|
|
ifndef F_CPU
|
|
F_CPU := $(call PARSE_BOARD,$(BOARD_TAG),build.f_cpu)
|
|
endif
|
|
|
|
OPENCR_LIB_OBJ_FILES = $(notdir $(OPENCR_LIB_C_SRCS_1:.c=.c.o)) $(notdir $(OPENCR_LIB_C_SRCS_2:.c=.c.o)) $(notdir $(OPENCR_LIB_C_SRCS_3:.c=.c.o)) $(notdir $(OPENCR_LIB_C_SRCS_4:.c=.c.o)) $(notdir $(OPENCR_LIB_C_SRCS_5:.c=.c.o)) $(notdir $(OPENCR_LIB_CPP_SRCS:.cpp=.cpp.o)) $(notdir $(OPENCR_LIB_S_SRCS:.S=.S.o))
|
|
OTHER_OBJS = $(patsubst %, \
|
|
$(OBJDIR)/OpenCRlib/%, $(OPENCR_LIB_OBJ_FILES))
|
|
|
|
OPENCR_CORE_OBJ_FILES = $(notdir $(OPENCR_CORE_C_SRCS_1:.c=.c.o)) $(notdir $(OPENCR_CORE_C_SRCS_2:.c=.c.o)) $(notdir $(OPENCR_CORE_CPP_SRCS:.cpp=.cpp.o))
|
|
# override is used since opencr dosen't need other sam core objects
|
|
override CORE_OBJS = $(patsubst %, \
|
|
$(OBJDIR)/core/%, $(OPENCR_CORE_OBJ_FILES))
|
|
|
|
ifndef AVR_TOOLS_DIR
|
|
AVR_TOOLS_DIR = $(call dir_if_exists,$(ARDUINO_PACKAGE_DIR)/OpenCR/tools/opencr_gcc/5.4.0-2016q2)
|
|
endif
|
|
ifeq ($(strip $(AVR_TOOLS_DIR)),)
|
|
echo $(error $(AVR_TOOLS_DIR) Cannot find AVR_TOOLS_DIR. Check AVR_TOOLS_DIR)
|
|
endif
|
|
|
|
# Robotis OpenCR platform library directory
|
|
ifndef ARDUINO_PLATFORM_LIB_PATH
|
|
ARDUINO_PLATFORM_LIB_PATH = $(ALTERNATE_CORE_PATH)/libraries
|
|
$(call show_config_variable,ARDUINO_PLATFORM_LIB_PATH,[COMPUTED],(from OPENCR_DIR))
|
|
endif
|
|
|
|
########################################################################
|
|
# command names
|
|
|
|
TOOL_PREFIX = arm-none-eabi
|
|
|
|
# processor stuff
|
|
ifndef MCU
|
|
MCU := $(call PARSE_BOARD,$(BOARD_TAG),build.mcu)
|
|
endif
|
|
|
|
ifndef MCU_FLAG_NAME
|
|
MCU_FLAG_NAME=mcpu
|
|
endif
|
|
|
|
########################################################################
|
|
# FLAGS
|
|
ifndef USB_TYPE
|
|
USB_TYPE = USB_SERIAL
|
|
endif
|
|
|
|
# from platform.txt
|
|
CPPFLAGS += -DARDUINO_OpenCR
|
|
CPPFLAGS += -DARDUINO_ARCH_OPENCR
|
|
|
|
CPPFLAGS += $(call PARSE_BOARD,$(BOARD_TAG),build.common_flags)
|
|
|
|
OPENCR_COMPILER_LIBS_C_FLAGS +=-I$(ARDUINO_VAR_PATH)/$(call PARSE_BOARD,$(BOARD_TAG),build.inc1)
|
|
OPENCR_COMPILER_LIBS_C_FLAGS +=-I$(ARDUINO_VAR_PATH)/$(call PARSE_BOARD,$(BOARD_TAG),build.inc2)
|
|
OPENCR_COMPILER_LIBS_C_FLAGS +=-I$(ARDUINO_VAR_PATH)/$(call PARSE_BOARD,$(BOARD_TAG),build.inc3)
|
|
OPENCR_COMPILER_LIBS_C_FLAGS +=-I$(ARDUINO_VAR_PATH)/$(call PARSE_BOARD,$(BOARD_TAG),build.inc4)
|
|
OPENCR_COMPILER_LIBS_C_FLAGS +=-I$(ARDUINO_VAR_PATH)/$(call PARSE_BOARD,$(BOARD_TAG),build.inc5)
|
|
OPENCR_COMPILER_LIBS_C_FLAGS +=-I$(ARDUINO_VAR_PATH)/$(call PARSE_BOARD,$(BOARD_TAG),build.inc6)
|
|
OPENCR_COMPILER_LIBS_C_FLAGS +=-I$(ARDUINO_VAR_PATH)/$(call PARSE_BOARD,$(BOARD_TAG),build.inc7)
|
|
CPPFLAGS += $(OPENCR_COMPILER_LIBS_C_FLAGS)
|
|
|
|
CFLAGS_STD += -c -g -O2 -std=gnu11 -mfloat-abi=softfp -mfpu=fpv5-sp-d16 -Wall -Wextra -DDEBUG_LEVEL=DEBUG_ALL -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -DBOARD_$(VARIANT)
|
|
|
|
CXXFLAGS_STD += -c -g -O2 -std=gnu++11 -mfloat-abi=softfp -mfpu=fpv5-sp-d16 -Wall -Wextra -DDEBUG_LEVEL=DEBUG_ALL -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_$(VARIANT)
|
|
|
|
ASFLAGS += -c -g -x assembler-with-cpp -MMD
|
|
|
|
LDFLAGS += -lm -lgcc -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-unresolved-symbols -Wl,--start-group -Wl,--whole-archive
|
|
|
|
LINKER_SCRIPTS = -T$(ARDUINO_VAR_PATH)/bsp/opencr/ldscript/opencr_flash.ld
|
|
########################################################################
|
|
# Reset is handled by upload script. OpenCR don't neet reset command.
|
|
override RESET_CMD =
|
|
|
|
########################################################################
|
|
# Object conversion & uploading magic, modified from Arduino.mk
|
|
override TARGET_HEX = $(OBJDIR)/$(TARGET).bin
|
|
|
|
override avr_size = $(SIZE) --target=binary $(2)
|
|
|
|
# Define UPLOAD_TOOL as avrdude to use avrdude upload recipe in Arduino.mk
|
|
override UPLOAD_TOOL = avrdude
|
|
|
|
ifeq ($(CURRENT_OS), WINDOWS)
|
|
override AVRDUDE = $(ARDUINO_PACKAGE_DIR)/OpenCR/tools/opencr_tools/1.0.0/win/opencr_ld.exe
|
|
else
|
|
override AVRDUDE = $(ARDUINO_PACKAGE_DIR)/OpenCR/tools/opencr_tools/1.0.0/linux/opencr_ld
|
|
endif
|
|
override AVRDUDE_COM_OPTS = $(MONITOR_PORT)
|
|
override AVRDUDE_ISP_OPTS = 115200 $(TARGET_HEX) 1
|
|
override AVRDUDE_ISPLOAD_OPTS =
|
|
|
|
########################################################################
|
|
# automatically include Arduino.mk
|
|
|
|
include $(ARDMK_DIR)/Arduino.mk
|
|
|
|
########################################################################
|
|
|
|
# OpenCR core files
|
|
$(OBJDIR)/core/%.c.o: $(ARDUINO_CORE_PATH)/avr/%.c $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@
|
|
|
|
$(OBJDIR)/core/%.c.o: $(ARDUINO_CORE_PATH)/%.c $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@
|
|
|
|
$(OBJDIR)/core/%.cpp.o: $(ARDUINO_CORE_PATH)/%.cpp $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CXX) -MMD -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
|
|
|
|
# OpenCR lib files
|
|
$(OBJDIR)/OpenCRlib/%.c.o: $(ARDUINO_VAR_PATH)/bsp/opencr/%.c $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@
|
|
$(OBJDIR)/OpenCRlib/%.c.o: $(ARDUINO_VAR_PATH)/hw/%.c $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@
|
|
|
|
$(OBJDIR)/OpenCRlib/%.c.o: $(ARDUINO_VAR_PATH)/hw/driver/%.c $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@
|
|
|
|
$(OBJDIR)/OpenCRlib/%.c.o: $(ARDUINO_VAR_PATH)/hw/usb_cdc/%.c $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@
|
|
|
|
$(OBJDIR)/OpenCRlib/%.c.o: $(ARDUINO_VAR_PATH)/lib/STM32F7xx_HAL_Driver/Src/%.c $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@
|
|
|
|
$(OBJDIR)/OpenCRlib/%.cpp.o: $(ARDUINO_VAR_PATH)/%.cpp $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CXX) -MMD -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
|
|
|
|
$(OBJDIR)/OpenCRlib/%.S.o: $(ARDUINO_VAR_PATH)/bsp/opencr/startup/%.S $(COMMON_DEPS) | $(OBJDIR)
|
|
@$(MKDIR) $(dir $@)
|
|
$(CC) -MMD -c $(CPPFLAGS) $(ASFLAGS) $< -o $@
|
|
|
|
# Object conversion & uploading magic, modified from Arduino.mk
|
|
$(OBJDIR)/%.bin: $(OBJDIR)/%.elf $(COMMON_DEPS)
|
|
@$(MKDIR) $(dir $@)
|
|
$(OBJCOPY) -v -Obinary $< $@
|
|
@$(ECHO) '\n'
|
|
$(call avr_size,$<,$@)
|
|
ifneq ($(strip $(HEX_MAXIMUM_SIZE)),)
|
|
@if [ `$(SIZE) --target=binary $@ | awk 'FNR == 2 {print $$2}'` -le $(HEX_MAXIMUM_SIZE) ]; then touch $@.sizeok; fi
|
|
else
|
|
@$(ECHO) "Maximum flash memory of $(BOARD_TAG) is not specified. Make sure the size of $@ is less then $(BOARD_TAG)\'s flash memory"
|
|
@touch $@.sizeok
|
|
endif
|
|
|
|
CORE_LIB += -Wl,--no-whole-archive -lstdc++
|