2018-02-02 16:35:19 -04:00
TOOLCHAIN = ARM
ARM_CXX := arm-none-eabi-g++
ARM_CC := arm-none-eabi-gcc
ARM_AS := arm-none-eabi-gcc
ARM_AR := arm-none-eabi-ar
#ARM_LD := arm-none-eabi-g++
ARM_LD := arm-none-eabi-ld
ARM_GDB := arm-none-eabi-gdb
ARM_OBJCOPY := arm-none-eabi-objcopy
2018-02-20 07:47:20 -04:00
SIZE := arm-none-eabi-size
DISAS := arm-none-eabi-objdump
2018-02-02 16:35:19 -04:00
#TOOLCHAIN = arm-none-eabi
i n c l u d e $( MK_DIR ) / f i n d _ t o o l s . m k
.DEFAULT_GOAL := all
##
## Target-specific configuration. This determines some compiler and
## linker options/flags.
##
PATH := $( PATH) :/usr/local/bin
# these default to a Maple Flash build.
BOARD ?= f4light_Revolution
MEMORY_TARGET ?= flash
##
## Useful paths, constants, etc.
##
STFLASH := /usr/local/stlink/st-flash
STUTIL := /usr/local/stlink/st-util
2018-02-28 05:08:39 -04:00
BL_ADDRESS := 0x08000000
2018-02-02 16:35:19 -04:00
FLASH_ADDRESS := 0x08010000
UPLOADER := dfu-util
#leaflabs bootloader
USBID := 1EAF:0003
BLDROOT := $( SRCROOT) /..
#BUILD_PATH := $(BLDROOT)/build
BUILD_PATH := $( BUILDROOT)
LIBRARIES_PATH := $( BLDROOT) /libraries
2018-02-20 07:47:20 -04:00
HAL_PATH := $( LIBRARIES_PATH) /AP_HAL_F4Light
WIRISH_PATH := $( HAL_PATH) /wirish
BOARDS_PATH := $( HAL_PATH) /boards
HARDWARE_PATH := $( HAL_PATH) /hardware
HAL_HW_PATH := $( HAL_PATH) /hardware/hal
2018-02-02 16:35:19 -04:00
STM32_PATH := $( HARDWARE_PATH) /STM32F4xx_DSP_StdPeriph_Lib_V1.1.0
STM32USB_PATH := $( HARDWARE_PATH) /STM32_USB_Driver
cpu_flags := -mthumb -mcpu= cortex-m4 -march= armv7e-m -mfpu= fpv4-sp-d16 -mfloat-abi= hard
FIRMWARE_PATH := $( BLDROOT) /$( SKETCH)
# List of input files to the sketch.cpp file in the order they should be appended to create it
LIBRARY_INCLUDES :=
SUPPORT_PATH := $( BLDROOT) /libraries/AP_HAL_F4Light/support
TOOLS_PATH := $( BLDROOT) /libraries/AP_HAL_F4Light/support/tools
# Support files for linker
LDDIR := $( BOARDS_PATH) /$( BOARD) /ld
2018-02-28 05:08:39 -04:00
BOOTLOADERS := $( BLDROOT) /Tools/bootloaders
APJTOOL := $( BLDROOT) /Tools/ardupilotwaf/px_mkfw.py
2018-02-02 16:35:19 -04:00
# $(BOARD)- and $(MEMORY_TARGET)-specific configuration
i n c l u d e $( BOARDS_PATH ) / $( BOARD ) / t a r g e t - c o n f i g . m k
##
## Compilation flags
##
EXTRAFLAGS += -DHAVE_STD_NULLPTR_T= 0 -DHAVE_BYTESWAP_H= 0
EXTRAFLAGS += $( SKETCHLIBINCLUDES) -DARDUPILOT_BUILD -DTESTS_MATHLIB_DISABLE -DSKETCH_MAIN= ArduPilot_main
2018-04-06 03:51:24 -03:00
GITFLAGS := -DGIT_VERSION= " \" $( GIT_VERSION) $( shell date --rfc-3339= date) \" "
2018-02-02 16:35:19 -04:00
#-Werror
WARNFLAGS = -Wall -Wshadow -Wpointer-arith -Wcast-align -Wno-psabi -Wno-unused-parameter -Wno-error= cast-align -Wno-error= unused-but-set-variable
WARNFLAGS += -Wwrite-strings -Wformat= 2 -Wshadow -Wfloat-equal -Wpointer-arith -Wlogical-op -Wmissing-declarations -Wpacked -Wno-pragmas
WARNFLAGS += -Wextra -Wlogical-op -Wno-unknown-pragmas -Wno-redundant-decls -Wno-packed -Wno-error= double-promotion -Wno-error= type-limits
WARNFLAGS += -Wno-error= unused-variable -Wno-error= reorder -Wno-error= float-equal -Wno-error= unused-parameter -Wno-missing-field-initializers
WARNFLAGS += -Wno-error= pmf-conversions -Wno-error= missing-declarations -Wno-error= unused-function -Werror= format-security -Werror= array-bounds
WARNFLAGS += -Wno-error= unused-label -Wno-trigraphs
OPTFLAGS = -Os
OPTFLAGS += -fsingle-precision-constant -g3 -fno-strict-aliasing -fomit-frame-pointer -frename-registers
#-fno-strength-reduce
OPTFLAGS += -fno-builtin-printf -fno-aggressive-loop-optimizations -fpredictive-commoning
2018-02-20 07:47:20 -04:00
#OPTFLAGS += -fassociative-math -freciprocal-math -ffast-math - cause EKF errors
2018-02-02 16:35:19 -04:00
OPTFLAGS += -fno-signed-zeros -fno-trapping-math
OPTFLAGS += -finline-functions-called-once -fearly-inlining -finline-small-functions
OPTFLAGS += -fmerge-all-constants
WARNFLAGSCXX = -Wno-reorder
DEPFLAGS = -MD -MT $@
GLOBAL_FLAGS := -D$( VECT_BASE_ADDR)
GLOBAL_FLAGS += -DBOARD_$( BOARD)
GLOBAL_FLAGS += -DMCU_$( MCU)
GLOBAL_FLAGS += -DCONFIG_HAL_BOARD= $( HAL_BOARD)
GLOBAL_FLAGS += -DSTM32F4XX
GLOBAL_FLAGS += -DUSE_STDPERIPH_DRIVER
GLOBAL_FLAGS += -DARM_MATH_CM4
GLOBAL_FLAGS += -DUSE_OTG_FS_CORE
GLOBAL_FLAGS += -DUSE_USB_OTG_FS
GLOBAL_FLAGS += -DUSE_EMBEDDED_PHY
GLOBAL_FLAGS += -D__FPU_PRESENT
GLOBAL_FLAGS += -D__FPU_USED= 1
GLOBAL_FLAGS += -DAPM_BUILD_DIRECTORY= APM_BUILD_$( SKETCH)
GLOBAL_FLAGS += $( WARNFLAGS) $( DEPFLAGS) $( EXTRAFLAGS) $( OPTS)
#
GLOBAL_FLAGS += -mthumb -mcpu= cortex-m4 -march= armv7e-m -mfpu= fpv4-sp-d16 -mfloat-abi= hard
GLOBAL_FLAGS += -ffunction-sections
GLOBAL_FLAGS += -fdata-sections
#Produce debugging information in the operating system's native format
GLOBAL_FLAGS += -ggdb
#GLOBAL_FLAGS += -v -save-temps # for GCC bugreport
# GLOBAL_CFLAGS -----------------------------------------------------------------------------------
GLOBAL_CFLAGS := $( cpu_flags)
#GLOBAL_CFLAGS += -nostdlib #Do not use the standard system startup files or libraries when linking
GLOBAL_CFLAGS += -Wall #This enables all the warnings about constructions that some users consider questionable, and that are easy to avoid (or modify to prevent the warning), even in conjunction with macros
GLOBAL_CFLAGS += $( GLOBAL_FLAGS) $( OPTFLAGS)
GLOBAL_CFLAGS += -include $( BOARDS_PATH) /$( BOARD) /board.h
# GLOBAL_CXXFLAGS ---------------------------------------------------------------------------------
GLOBAL_CXXFLAGS := -fno-rtti #Disable generation of information about every class with virtual functions for use by the C++ runtime type identification features
GLOBAL_CXXFLAGS += -fno-exceptions -fno-threadsafe-statics # not true C++
GLOBAL_CXXFLAGS += -fconserve-space -fno-enforce-eh-specs -fno-use-cxa-atexit
GLOBAL_CXXFLAGS += -std= gnu++11
# Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using "-fpermissive" will allow some nonconforming code to compile.
2018-02-20 07:47:20 -04:00
GLOBAL_CXXFLAGS += $( GLOBAL_CFLAGS)
# -fpermissive
2018-02-02 16:35:19 -04:00
# missing definitions
GLOBAL_CXXFLAGS += -c -include $( WIRISH_PATH) /defs.h
# GLOBAL_ASFLAGS ----------------------------------------------------------------------------------
GLOBAL_ASFLAGS := $( cpu_flags)
GLOBAL_ASFLAGS += -x assembler-with-cpp
GLOBAL_ASFLAGS += $( GLOBAL_FLAGS) $( OPTFLAGS)
# GLOBAL_LDFLAGS ----------------------------------------------------------------------------------
LDFLAGS := $( cpu_flags)
LDFLAGS += -static
LDFLAGS += -lm -lgcc
LDFLAGS += -Wall
LDFLAGS += -Wl,--gc-sections
LDFLAGS += -Wl,--cref
#LDFLAGS += -Wl,--print-gc-sections
LDFLAGS += -Wl,-Map -Wl,$( BUILD_PATH) /$( BOARD) .map
LDFLAGS += -T$( LDDIR) /$( LDSCRIPT)
LDFLAGS += -L$( LDDIR)
LDFLAGS += -Wl,--warn-common
# -Wl,--verbose
#let's linker optimize whole program itself
LDFLAGS += -Wl,--relax
#LDFLAGS += -fwhole-program
##
# -fwhole-program
#--plugin=/usr/local/arm-none-eabi/lib/gcc/arm-none-eabi/5.2.1/liblto_plugin.so
# -flto -fuse-linker-plugin
# used to collect files from HAL folders tree
TGT_BIN :=
2018-02-20 07:47:20 -04:00
COREINCLUDES = -I$( HAL_HW_PATH) -I$( STM32_PATH) -I$( WIRISH_PATH) -I$( BOARDS_PATH) /$( BOARD) -I$( STM32USB_PATH) \
2018-02-02 16:35:19 -04:00
-I$( HARDWARE_PATH) \
-I$( STM32_PATH) /Libraries/STM32F4xx_StdPeriph_Driver/inc \
-I$( STM32_PATH) /Libraries/CMSIS/Include \
-I$( STM32_PATH) /Libraries/CMSIS/Device/ST/STM32F4xx/Include \
-I$( BUILDROOT) /libraries/GCS_MAVLink/ \
-I$( BUILDROOT) /libraries/GCS_MAVLink/include/mavlink/v2.0
TGT_ASFLAGS = $( COREINCLUDES)
##
## Build rules and useful templates
##
i n c l u d e $( MK_DIR ) / f i n d _ t o o l s . m k
# all subfolder's rules
i n c l u d e $( WIRISH_PATH ) / r u l e s . m k
i n c l u d e $( HARDWARE_PATH ) / h a l / r u l e s . m k
i n c l u d e $( HARDWARE_PATH ) / 4 w a y / r u l e s . m k
i n c l u d e $( HARDWARE_PATH ) / s d / r u l e s . m k
i n c l u d e $( HARDWARE_PATH ) / S T M 3 2 _ U S B _ D r i v e r / r u l e s . m k
i n c l u d e $( HARDWARE_PATH ) / S T M 3 2 F 4 x x _ D S P _ S t d P e r i p h _ L i b _ V 1 . 1 . 0 / r u l e s . m k
i n c l u d e $( MK_DIR ) / b u i l d _ r u l e s . m k
LIBGCC := $( shell $( CC) $( GLOBAL_FLAGS) -print-libgcc-file-name)
CFLAGS = $( GLOBAL_CFLAGS) $( TGT_CFLAGS) $( COREINCLUDES) -I$( LIBRARIES_PATH) $( LIBRARY_INCLUDES)
CXXFLAGS = $( GLOBAL_CXXFLAGS) $( TGT_CFLAGS) $( COREINCLUDES) -I$( LIBRARIES_PATH) $( LIBRARY_INCLUDES) $( GITFLAGS)
ASFLAGS = $( GLOBAL_ASFLAGS) $( TGT_ASFLAGS)
##
## Set all submodules here
##
SKETCH_INCLUDES = $( SKETCHLIBINCLUDES) $( ARDUINOLIBINCLUDES)
SLIB_INCLUDES = -I$( dir $<) /utility $( SKETCHLIBINCLUDES) $( ARDUINOLIBINCLUDES)
################################################################################
# Built products
#
# Library object files
LIBOBJS := $( SKETCHLIBOBJS)
# The ELF file
SKETCHELF = $( BUILDROOT) /$( SKETCH) .elf
BUILDELF = $( notdir $( SKETCHELF) )
# HEX file
SKETCHHEX = $( BUILDROOT) /$( SKETCH) .hex
# BIN file
SKETCHBIN = $( BUILDROOT) /$( SKETCH) .bin
# EEP file
SKETCHEEP = $( BUILDROOT) /$( SKETCH) .eep
# Map file
SKETCHMAP = $( BUILDROOT) /$( SKETCH) .map
# All of the objects that may be built
ALLOBJS = $( SKETCHOBJS) $( LIBOBJS)
# All of the dependency files that may be generated
ALLDEPS = $( ALLOBJS:%.o= %.d)
CAT := cat
FIND := /usr/bin/find
################################################################################
# Targets
#
all : $( SKETCHELF ) $( SKETCHEEP ) $( BUILD_PATH ) /$( BOARD ) .bin
print-% :
echo " $* = $( $* ) "
.PHONY : upload
#upload via maple bootloader
f4light-maple-upload : $( SKETCHBIN )
$( LIBMAPLE_PATH) /support/scripts/reset.py && sleep 1 && $( UPLOADER) -a1 -d $( USBID) -D $( SKETCHBIN) -R
#upload via BOOT0 hardware bootloader
f4light-upload : $( SKETCHBIN )
$( UPLOADER) -a 0 --dfuse-address $( FLASH_ADDRESS) -D $( SKETCHBIN) -R
# sorry byt I use ST_LINK and SWD, not JTAG - @NG
#f4light-debug:
# $(AVARICE) --mkII --capture --jtag usb :4242 & \
# gnome-terminal -x $(GDB) $(SKETCHELF) & \
# echo -e '\n\nat the gdb prompt type "target remote localhost:4242"'
## this allows you to flash your image via JTAG for when you
## have completely broken your USB
#f4light-jtag-program:
# $(AVARICE) --mkII --jtag usb --erase --program --file $(SKETCHELF)
f4light-debug :
$( STUTIL) -m -p 4242
## this allows you to flash your image via SWD for when you have completely broken your USB
f4light-program :
$( STFLASH) --reset write $( SKETCHBIN) $( FLASH_ADDRESS)
################################################################################
# Rules
#
# fetch dependency info from a previous build if any of it exists
- i n c l u d e $( ALLDEPS )
f4light-clean : clean
2018-02-20 07:47:20 -04:00
$( v) $( FIND) $( HAL_PATH) -type f -name "*.d" -delete
$( v) $( FIND) $( HAL_PATH) -type f -name "*.o" -delete
$( v) $( FIND) $( HAL_PATH) -type f -name "*.i" -delete
$( v) $( FIND) $( HAL_PATH) -type f -name "*.ii" -delete
$( v) $( FIND) $( HAL_PATH) -type f -name "*.d" -delete
2018-02-02 16:35:19 -04:00
# Link the final object. this line sets compilation order
$(SKETCHELF) : $( LIBOBJS ) $( TGT_BIN ) $( BUILD_PATH ) /main .o $( SKETCHOBJS )
$( RULEHDR)
# $(v)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
$( SILENT_LD) $( CXX) $( LDFLAGS) -o $@ $( TGT_BIN) $( BUILD_PATH) /main.o $( SKETCHOBJS) $( LIBOBJS) $( LIBS) $( LIBGCC) -Wl,-Map,$( BUILD_PATH) /$( BOARD) .map
# $(v) $(LD) $(LDFLAGS) -Map $(BUILD_PATH)/$(BOARD).map -o $(TGT_BIN) --start-group $(BUILD_PATH)/main.o $(SKETCHOBJS) $(LIBOBJS) $(LIBS) $(EXTRA_LIBS) $(LIBGCC) --end-group
#
$( v) cp $( SKETCHELF) .
@echo " Firmware is in $( BUILDELF) "
# Create the eep file
$(SKETCHEEP) : $( SKETCHELF )
$( RULEHDR)
$( v) $( OBJCOPY) -O ihex -j.eeprom --set-section-flags= .eeprom= alloc,load --no-change-warnings --change-section-lma .eeprom= 0 $< $@
$(BUILD_PATH)/main.o : $( WIRISH_PATH ) /main .cxx
$( SILENT_CXX) $( CXX) $( CXXFLAGS) $( LIBRARY_INCLUDES) -o $@ -c $<
$(BUILD_PATH)/$(BOARD).bin : $( SKETCHELF )
$( SILENT_OBJCOPY) $( OBJCOPY) -v -Obinary $( SKETCHELF) --gap-fill 0xFF $@ 1>/dev/null
$( OBJCOPY) -v -Oihex $( SKETCHELF) $( BUILD_PATH) /$( BOARD) .hex 1>/dev/null
$( SILENT_DISAS) $( DISAS) -S $( SKETCHELF) > $( BUILD_PATH) /$( BOARD) .disas
@echo " "
$( TOOLS_PATH) /dfu-convert --ihex $( BUILD_PATH) /$( BOARD) .hex $( BUILD_PATH) /$( BOARD) .dfu
2018-02-28 05:08:39 -04:00
# python $(APJTOOL) --image $(BUILD_PATH)/$(BOARD).bin --prototype $(BUILDROOT)/apj.prototype > $(BUILD_PATH)/$(BOARD).apj
python $( APJTOOL) --image $( BUILD_PATH) /$( BOARD) .bin --board_id $( BOARD_TYPE) --board_revision $( BOARD_REV) > $( BUILD_PATH) /$( BOARD) .apj
dd if = /dev/zero ibs = 1k count = 64 | tr "\000" "\377" >$( BUILDROOT) /rom.bin
dd if = $( BOOTLOADERS) /$( BOOTLOADER) .bin of = $( BUILDROOT) /rom.bin conv = notrunc
( printf '%02x %02x' " $( BOARD_TYPE) " " $( BOARD_REV) " ) | xxd -r -p - $( BUILDROOT) /board_id.bin
dd if = $( BUILDROOT) /board_id.bin of = $( BUILDROOT) /rom.bin obs = 1 seek = 16368 conv = notrunc
( cat $( BUILDROOT) /rom.bin; cat $( BUILD_PATH) /$( BOARD) .bin) > $( BUILD_PATH) /$( BOARD) _bl.bin
$( TOOLS_PATH) /dfu-convert -b $( BL_ADDRESS) :$( BUILDROOT) /rom.bin -b $( FLASH_ADDRESS) :$( BUILD_PATH) /$( BOARD) .bin $( BUILD_PATH) /$( BOARD) _bl.dfu
2018-02-02 16:35:19 -04:00
$( v) cp $( BUILD_PATH) /$( BOARD) .hex .
$( v) cp $( BUILD_PATH) /$( BOARD) .bin .
$( v) cp $( BUILD_PATH) /$( BOARD) .dfu .
2018-02-28 05:08:39 -04:00
$( v) cp $( BUILD_PATH) /$( BOARD) .apj .
$( v) cp $( BUILD_PATH) /$( BOARD) _bl.bin .
$( v) cp $( BUILD_PATH) /$( BOARD) _bl.dfu .
2018-02-02 16:35:19 -04:00
@echo "Object file sizes:"
2018-02-20 07:47:20 -04:00
@find $( BUILD_PATH) -iname "*.o" | xargs $( SIZE) -t > $( BUILD_PATH) /$( BOARD) .sizes
cd $( HAL_PATH) ; find . -follow -iname "*.o" | xargs $( SIZE) -t >> $( BUILD_PATH) /$( BOARD) .sizes
2018-02-02 16:35:19 -04:00
@cat $( BUILD_PATH) /$( BOARD) .sizes
@echo " "
@echo "Final Size:"
@$( SIZE) $<
@echo $( MEMORY_TARGET) > $( BUILD_PATH) /build-type
#
# Build sketch objects
#