diff --git a/Makefile b/Makefile index 183dd32408..ba2e9f9246 100644 --- a/Makefile +++ b/Makefile @@ -1,448 +1,450 @@ -############################################################################### -# "THE BEER-WARE LICENSE" (Revision 42): -# wrote this file. As long as you retain this notice you -# can do whatever you want with this stuff. If we meet some day, and you think -# this stuff is worth it, you can buy me a beer in return -############################################################################### -# -# Makefile for building the cleanflight firmware. -# -# Invoke this with 'make help' to see the list of supported targets. -# - -############################################################################### -# Things that the user might override on the commandline -# - -# The target to build, see VALID_TARGETS below -TARGET ?= NAZE - -# Compile-time options -OPTIONS ?= - -# Debugger optons, must be empty or GDB -DEBUG ?= - -# Serial port/Device for flashing -SERIAL_DEVICE ?= /dev/ttyUSB0 - -############################################################################### -# Things that need to be maintained as the source changes -# - -FORKNAME = cleanflight - -VALID_TARGETS = NAZE NAZE32PRO OLIMEXINO STM32F3DISCOVERY CHEBUZZF3 CC3D CJMCU - -# Working directories -ROOT = $(dir $(lastword $(MAKEFILE_LIST))) -SRC_DIR = $(ROOT)/src/main -OBJECT_DIR = $(ROOT)/obj/main -BIN_DIR = $(ROOT)/obj -CMSIS_DIR = $(ROOT)/lib/main/CMSIS -INCLUDE_DIRS = $(SRC_DIR) - -# Search path for sources -VPATH := $(SRC_DIR):$(SRC_DIR)/startup - -ifeq ($(TARGET),$(filter $(TARGET),STM32F3DISCOVERY CHEBUZZF3 NAZE32PRO)) - -STDPERIPH_DIR = $(ROOT)/lib/main/STM32F30x_StdPeriph_Driver -USBFS_DIR = $(ROOT)/lib/main/STM32_USB-FS-Device_Driver - -USBPERIPH_SRC = $(notdir $(wildcard $(USBFS_DIR)/src/*.c)) -STDPERIPH_SRC = $(notdir $(wildcard $(STDPERIPH_DIR)/src/*.c)) - -EXCLUDES = stm32f30x_crc.c \ - stm32f30x_can.c - -STDPERIPH_SRC := $(filter-out ${EXCLUDES}, $(STDPERIPH_SRC)) - -DEVICE_STDPERIPH_SRC = $(USBPERIPH_SRC) \ - $(STDPERIPH_SRC) - - -VPATH := $(VPATH):$(CMSIS_DIR)/CM1/CoreSupport:$(CMSIS_DIR)/CM1/DeviceSupport/ST/STM32F30x:$(USBFS_DIR)/src -CMSIS_SRC = $(notdir $(wildcard $(CMSIS_DIR)/CM1/CoreSupport/*.c \ - $(CMSIS_DIR)/CM1/DeviceSupport/ST/STM32F30x/*.c)) - -INCLUDE_DIRS := $(INCLUDE_DIRS) \ - $(STDPERIPH_DIR)/inc \ - $(USBFS_DIR)/inc \ - $(CMSIS_DIR)/CM1/CoreSupport \ - $(CMSIS_DIR)/CM1/DeviceSupport/ST/STM32F30x \ - $(ROOT)/src/main/vcp - -LD_SCRIPT = $(ROOT)/stm32_flash_f303.ld - -ARCH_FLAGS = -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -DEVICE_FLAGS = -DSTM32F303xC -TARGET_FLAGS = -D$(TARGET) -ifeq ($(TARGET),CHEBUZZF3) -# CHEBUZZ is a VARIANT of STM32F3DISCOVERY -TARGET_FLAGS := $(TARGET_FLAGS) -DSTM32F3DISCOVERY -endif - - -else - -STDPERIPH_DIR = $(ROOT)/lib/main/STM32F10x_StdPeriph_Driver - -STDPERIPH_SRC = $(notdir $(wildcard $(STDPERIPH_DIR)/src/*.c)) - -# Search path and source files for the CMSIS sources -VPATH := $(VPATH):$(CMSIS_DIR)/CM3/CoreSupport:$(CMSIS_DIR)/CM3/DeviceSupport/ST/STM32F10x -CMSIS_SRC = $(notdir $(wildcard $(CMSIS_DIR)/CM3/CoreSupport/*.c \ - $(CMSIS_DIR)/CM3/DeviceSupport/ST/STM32F10x/*.c)) - -INCLUDE_DIRS := $(INCLUDE_DIRS) \ - $(STDPERIPH_DIR)/inc \ - $(CMSIS_DIR)/CM3/CoreSupport \ - $(CMSIS_DIR)/CM3/DeviceSupport/ST/STM32F10x \ - -LD_SCRIPT = $(ROOT)/stm32_flash_f103.ld - -ARCH_FLAGS = -mthumb -mcpu=cortex-m3 -TARGET_FLAGS = -D$(TARGET) -DEVICE_FLAGS = -DSTM32F10X_MD - -DEVICE_STDPERIPH_SRC = $(STDPERIPH_SRC) - -endif - -TARGET_DIR = $(ROOT)/src/main/target/$(TARGET) -TARGET_SRC = $(notdir $(wildcard $(TARGET_DIR)/*.c)) - -INCLUDE_DIRS := $(INCLUDE_DIRS) \ - $(TARGET_DIR) - -VPATH := $(VPATH):$(TARGET_DIR) - -COMMON_SRC = build_config.c \ - $(TARGET_SRC) \ - config/config.c \ - config/runtime_config.c \ - common/maths.c \ - common/printf.c \ - common/typeconversion.c \ - main.c \ - mw.c \ - flight/altitudehold.c \ - flight/failsafe.c \ - flight/flight.c \ - flight/imu.c \ - flight/mixer.c \ - drivers/bus_i2c_soft.c \ - drivers/serial.c \ - drivers/sound_beeper.c \ - drivers/system.c \ - io/beeper.c \ - io/rc_controls.c \ - io/rc_curves.c \ - io/serial.c \ - io/serial_cli.c \ - io/serial_msp.c \ - io/statusindicator.c \ - rx/rx.c \ - rx/pwm.c \ - rx/msp.c \ - sensors/acceleration.c \ - sensors/battery.c \ - sensors/boardalignment.c \ - sensors/compass.c \ - sensors/gyro.c \ - sensors/initialisation.c \ - $(CMSIS_SRC) \ - $(DEVICE_STDPERIPH_SRC) - -HIGHEND_SRC = flight/autotune.c \ - io/gps.c \ - io/gps_conversion.c \ - io/ledstrip.c \ - rx/sbus.c \ - rx/sumd.c \ - rx/spektrum.c \ - telemetry/telemetry.c \ - telemetry/frsky.c \ - telemetry/hott.c \ - telemetry/msp.c \ - sensors/sonar.c \ - sensors/barometer.c - -NAZE_SRC = startup_stm32f10x_md_gcc.S \ - drivers/accgyro_adxl345.c \ - drivers/accgyro_bma280.c \ - drivers/accgyro_l3g4200d.c \ - drivers/accgyro_mma845x.c \ - drivers/accgyro_mpu3050.c \ - drivers/accgyro_mpu6050.c \ - drivers/adc.c \ - drivers/adc_stm32f10x.c \ - drivers/barometer_bmp085.c \ - drivers/barometer_ms5611.c \ - drivers/bus_spi.c \ - drivers/bus_i2c_stm32f10x.c \ - drivers/compass_hmc5883l.c \ - drivers/gpio_stm32f10x.c \ - drivers/light_led_stm32f10x.c \ - drivers/light_ws2811strip.c \ - drivers/light_ws2811strip_stm32f10x.c \ - drivers/sonar_hcsr04.c \ - drivers/pwm_mapping.c \ - drivers/pwm_output.c \ - drivers/pwm_rx.c \ - drivers/serial_softserial.c \ - drivers/serial_uart.c \ - drivers/serial_uart_stm32f10x.c \ - drivers/sound_beeper_stm32f10x.c \ - drivers/system_stm32f10x.c \ - drivers/timer.c \ - $(HIGHEND_SRC) \ - $(COMMON_SRC) - -OLIMEXINO_SRC = startup_stm32f10x_md_gcc.S \ - drivers/accgyro_mpu6050.c \ - drivers/adc.c \ - drivers/adc_stm32f10x.c \ - drivers/barometer_bmp085.c \ - drivers/bus_i2c_stm32f10x.c \ - drivers/bus_spi.c \ - drivers/compass_hmc5883l.c \ - drivers/gpio_stm32f10x.c \ - drivers/light_led_stm32f10x.c \ - drivers/light_ws2811strip.c \ - drivers/light_ws2811strip_stm32f10x.c \ - drivers/pwm_mapping.c \ - drivers/pwm_output.c \ - drivers/pwm_rssi.c \ - drivers/pwm_rx.c \ - drivers/serial_softserial.c \ - drivers/serial_uart.c \ - drivers/serial_uart_stm32f10x.c \ - drivers/sound_beeper_stm32f10x.c \ - drivers/system_stm32f10x.c \ - drivers/timer.c \ - $(HIGHEND_SRC) \ - $(COMMON_SRC) - -CJMCU_SRC = startup_stm32f10x_md_gcc.S \ - drivers/adc.c \ - drivers/adc_stm32f10x.c \ - drivers/accgyro_mpu6050.c \ - drivers/bus_i2c_stm32f10x.c \ - drivers/bus_spi.c \ - drivers/compass_hmc5883l.c \ - drivers/gpio_stm32f10x.c \ - drivers/light_led_stm32f10x.c \ - drivers/pwm_mapping.c \ - drivers/pwm_output.c \ - drivers/pwm_rssi.c \ - drivers/pwm_rx.c \ - drivers/serial_uart.c \ - drivers/serial_uart_stm32f10x.c \ - drivers/sound_beeper_stm32f10x.c \ - drivers/system_stm32f10x.c \ - drivers/timer.c \ - $(COMMON_SRC) - -CC3D_SRC = startup_stm32f10x_md_gcc.S \ - drivers/accgyro_spi_mpu6000.c \ - drivers/adc.c \ - drivers/adc_stm32f10x.c \ - drivers/bus_i2c_stm32f10x.c \ - drivers/bus_spi.c \ - drivers/gpio_stm32f10x.c \ - drivers/light_led_stm32f10x.c \ - drivers/light_ws2811strip.c \ - drivers/light_ws2811strip_stm32f10x.c \ - drivers/pwm_mapping.c \ - drivers/pwm_output.c \ - drivers/pwm_rssi.c \ - drivers/pwm_rx.c \ - drivers/serial_softserial.c \ - drivers/serial_uart.c \ - drivers/serial_uart_stm32f10x.c \ - drivers/sound_beeper_stm32f10x.c \ - drivers/system_stm32f10x.c \ - drivers/timer.c \ - $(HIGHEND_SRC) \ - $(COMMON_SRC) - -STM32F30x_COMMON_SRC = startup_stm32f30x_md_gcc.S \ - drivers/adc.c \ - drivers/adc_stm32f30x.c \ - drivers/bus_i2c_stm32f30x.c \ - drivers/bus_spi.c \ - drivers/gpio_stm32f30x.c \ - drivers/light_led_stm32f30x.c \ - drivers/light_ws2811strip.c \ - drivers/light_ws2811strip_stm32f30x.c \ - drivers/pwm_mapping.c \ - drivers/pwm_output.c \ - drivers/pwm_rssi.c \ - drivers/pwm_rx.c \ - drivers/serial_uart.c \ - drivers/serial_uart_stm32f30x.c \ - drivers/serial_softserial.c \ - drivers/serial_usb_vcp.c \ - drivers/sound_beeper_stm32f30x.c \ - drivers/system_stm32f30x.c \ - drivers/timer.c \ - vcp/hw_config.c \ - vcp/stm32_it.c \ - vcp/usb_desc.c \ - vcp/usb_endp.c \ - vcp/usb_istr.c \ - vcp/usb_prop.c \ - vcp/usb_pwr.c - -NAZE32PRO_SRC = $(STM32F30x_COMMON_SRC) \ - $(HIGHEND_SRC) \ - $(COMMON_SRC) - -STM32F3DISCOVERY_COMMON_SRC = $(STM32F30x_COMMON_SRC) \ - drivers/accgyro_l3gd20.c \ - drivers/accgyro_l3gd20.c \ - drivers/accgyro_lsm303dlhc.c - -STM32F3DISCOVERY_SRC = $(STM32F3DISCOVERY_COMMON_SRC) \ - drivers/accgyro_adxl345.c \ - drivers/accgyro_bma280.c \ - drivers/accgyro_mma845x.c \ - drivers/accgyro_mpu3050.c \ - drivers/accgyro_mpu6050.c \ - drivers/accgyro_l3g4200d.c \ - $(HIGHEND_SRC) \ - $(COMMON_SRC) - -CHEBUZZF3_SRC = $(STM32F3DISCOVERY_SRC) \ - $(HIGHEND_SRC) \ - $(COMMON_SRC) - -# Search path and source files for the ST stdperiph library -VPATH := $(VPATH):$(STDPERIPH_DIR)/src - -############################################################################### -# Things that might need changing to use different tools -# - -# Tool names -CC = arm-none-eabi-gcc -OBJCOPY = arm-none-eabi-objcopy -SIZE = arm-none-eabi-size - -# -# Tool options. -# - -ifeq ($(DEBUG),GDB) -OPTIMIZE = -O0 -LTO_FLAGS = $(OPTIMIZE) -else -OPTIMIZE = -Os -LTO_FLAGS = -flto -fuse-linker-plugin $(OPTIMIZE) -endif - -DEBUG_FLAGS = -ggdb3 - -CFLAGS = $(ARCH_FLAGS) \ - $(LTO_FLAGS) \ - $(addprefix -D,$(OPTIONS)) \ - $(addprefix -I,$(INCLUDE_DIRS)) \ - $(DEBUG_FLAGS) \ - -std=gnu99 \ - -Wall -pedantic \ - -ffunction-sections \ - -fdata-sections \ - $(DEVICE_FLAGS) \ - -DUSE_STDPERIPH_DRIVER \ - $(TARGET_FLAGS) \ - -D'__FORKNAME__="$(FORKNAME)"' \ - -save-temps=obj - -ASFLAGS = $(ARCH_FLAGS) \ - -x assembler-with-cpp \ - $(addprefix -I,$(INCLUDE_DIRS)) - -# XXX Map/crossref output? -LDFLAGS = -lm \ - -nostartfiles \ - --specs=nano.specs \ - -lnosys \ - $(ARCH_FLAGS) \ - $(LTO_FLAGS) \ - $(DEBUG_FLAGS) \ - -static \ - -Wl,-gc-sections,-Map,$(TARGET_MAP) \ - -T$(LD_SCRIPT) - -############################################################################### -# No user-serviceable parts below -############################################################################### - -# -# Things we will build -# -ifeq ($(filter $(TARGET),$(VALID_TARGETS)),) -$(error Target '$(TARGET)' is not valid, must be one of $(VALID_TARGETS)) -endif - - -TARGET_HEX = $(BIN_DIR)/$(FORKNAME)_$(TARGET).hex -TARGET_ELF = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).elf -TARGET_OBJS = $(addsuffix .o,$(addprefix $(OBJECT_DIR)/$(TARGET)/,$(basename $($(TARGET)_SRC)))) -TARGET_MAP = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).map - -# List of buildable ELF files and their object dependencies. -# It would be nice to compute these lists, but that seems to be just beyond make. - -$(TARGET_HEX): $(TARGET_ELF) - $(OBJCOPY) -O ihex --set-start 0x8000000 $< $@ - -$(TARGET_ELF): $(TARGET_OBJS) - $(CC) -o $@ $^ $(LDFLAGS) - $(SIZE) $(TARGET_ELF) - -# Compile -$(OBJECT_DIR)/$(TARGET)/%.o: %.c - @mkdir -p $(dir $@) - @echo %% $(notdir $<) - @$(CC) -c -o $@ $(CFLAGS) $< - -# Assemble -$(OBJECT_DIR)/$(TARGET)/%.o: %.s - @mkdir -p $(dir $@) - @echo %% $(notdir $<) - @$(CC) -c -o $@ $(ASFLAGS) $< -$(OBJECT_DIR)/$(TARGET)/%.o): %.S - @mkdir -p $(dir $@) - @echo %% $(notdir $<) - @$(CC) -c -o $@ $(ASFLAGS) $< - -clean: - rm -f $(TARGET_HEX) $(TARGET_ELF) $(TARGET_OBJS) $(TARGET_MAP) - rm -rf $(OBJECT_DIR)/$(TARGET) - -flash_$(TARGET): $(TARGET_HEX) - stty -F $(SERIAL_DEVICE) raw speed 115200 -crtscts cs8 -parenb -cstopb -ixon - echo -n 'R' >$(SERIAL_DEVICE) - stm32flash -w $(TARGET_HEX) -v -g 0x0 -b 115200 $(SERIAL_DEVICE) - -flash: flash_$(TARGET) - - -unbrick_$(TARGET): $(TARGET_HEX) - stty -F $(SERIAL_DEVICE) raw speed 115200 -crtscts cs8 -parenb -cstopb -ixon - stm32flash -w $(TARGET_HEX) -v -g 0x0 -b 115200 $(SERIAL_DEVICE) - -unbrick: unbrick_$(TARGET) - -help: - @echo "" - @echo "Makefile for the $(FORKNAME) firmware" - @echo "" - @echo "Usage:" - @echo " make [TARGET=] [OPTIONS=\"\"]" - @echo "" - @echo "Valid TARGET values are: $(VALID_TARGETS)" - @echo "" +############################################################################### +# "THE BEER-WARE LICENSE" (Revision 42): +# wrote this file. As long as you retain this notice you +# can do whatever you want with this stuff. If we meet some day, and you think +# this stuff is worth it, you can buy me a beer in return +############################################################################### +# +# Makefile for building the cleanflight firmware. +# +# Invoke this with 'make help' to see the list of supported targets. +# + +############################################################################### +# Things that the user might override on the commandline +# + +# The target to build, see VALID_TARGETS below +TARGET ?= NAZE + +# Compile-time options +OPTIONS ?= + +# Debugger optons, must be empty or GDB +DEBUG ?= + +# Serial port/Device for flashing +SERIAL_DEVICE ?= /dev/ttyUSB0 + +############################################################################### +# Things that need to be maintained as the source changes +# + +FORKNAME = cleanflight + +VALID_TARGETS = NAZE NAZE32PRO OLIMEXINO STM32F3DISCOVERY CHEBUZZF3 CC3D CJMCU + +# Working directories +ROOT = $(dir $(lastword $(MAKEFILE_LIST))) +SRC_DIR = $(ROOT)/src/main +OBJECT_DIR = $(ROOT)/obj/main +BIN_DIR = $(ROOT)/obj +CMSIS_DIR = $(ROOT)/lib/main/CMSIS +INCLUDE_DIRS = $(SRC_DIR) + +# Search path for sources +VPATH := $(SRC_DIR):$(SRC_DIR)/startup + +ifeq ($(TARGET),$(filter $(TARGET),STM32F3DISCOVERY CHEBUZZF3 NAZE32PRO)) + +STDPERIPH_DIR = $(ROOT)/lib/main/STM32F30x_StdPeriph_Driver +USBFS_DIR = $(ROOT)/lib/main/STM32_USB-FS-Device_Driver + +USBPERIPH_SRC = $(notdir $(wildcard $(USBFS_DIR)/src/*.c)) +STDPERIPH_SRC = $(notdir $(wildcard $(STDPERIPH_DIR)/src/*.c)) + +EXCLUDES = stm32f30x_crc.c \ + stm32f30x_can.c + +STDPERIPH_SRC := $(filter-out ${EXCLUDES}, $(STDPERIPH_SRC)) + +DEVICE_STDPERIPH_SRC = $(USBPERIPH_SRC) \ + $(STDPERIPH_SRC) + + +VPATH := $(VPATH):$(CMSIS_DIR)/CM1/CoreSupport:$(CMSIS_DIR)/CM1/DeviceSupport/ST/STM32F30x:$(USBFS_DIR)/src +CMSIS_SRC = $(notdir $(wildcard $(CMSIS_DIR)/CM1/CoreSupport/*.c \ + $(CMSIS_DIR)/CM1/DeviceSupport/ST/STM32F30x/*.c)) + +INCLUDE_DIRS := $(INCLUDE_DIRS) \ + $(STDPERIPH_DIR)/inc \ + $(USBFS_DIR)/inc \ + $(CMSIS_DIR)/CM1/CoreSupport \ + $(CMSIS_DIR)/CM1/DeviceSupport/ST/STM32F30x \ + $(ROOT)/src/main/vcp + +LD_SCRIPT = $(ROOT)/stm32_flash_f303.ld + +ARCH_FLAGS = -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 +DEVICE_FLAGS = -DSTM32F303xC +TARGET_FLAGS = -D$(TARGET) +ifeq ($(TARGET),CHEBUZZF3) +# CHEBUZZ is a VARIANT of STM32F3DISCOVERY +TARGET_FLAGS := $(TARGET_FLAGS) -DSTM32F3DISCOVERY +endif + + +else + +STDPERIPH_DIR = $(ROOT)/lib/main/STM32F10x_StdPeriph_Driver + +STDPERIPH_SRC = $(notdir $(wildcard $(STDPERIPH_DIR)/src/*.c)) + +# Search path and source files for the CMSIS sources +VPATH := $(VPATH):$(CMSIS_DIR)/CM3/CoreSupport:$(CMSIS_DIR)/CM3/DeviceSupport/ST/STM32F10x +CMSIS_SRC = $(notdir $(wildcard $(CMSIS_DIR)/CM3/CoreSupport/*.c \ + $(CMSIS_DIR)/CM3/DeviceSupport/ST/STM32F10x/*.c)) + +INCLUDE_DIRS := $(INCLUDE_DIRS) \ + $(STDPERIPH_DIR)/inc \ + $(CMSIS_DIR)/CM3/CoreSupport \ + $(CMSIS_DIR)/CM3/DeviceSupport/ST/STM32F10x \ + +LD_SCRIPT = $(ROOT)/stm32_flash_f103.ld + +ARCH_FLAGS = -mthumb -mcpu=cortex-m3 +TARGET_FLAGS = -D$(TARGET) +DEVICE_FLAGS = -DSTM32F10X_MD + +DEVICE_STDPERIPH_SRC = $(STDPERIPH_SRC) + +endif + +TARGET_DIR = $(ROOT)/src/main/target/$(TARGET) +TARGET_SRC = $(notdir $(wildcard $(TARGET_DIR)/*.c)) + +INCLUDE_DIRS := $(INCLUDE_DIRS) \ + $(TARGET_DIR) + +VPATH := $(VPATH):$(TARGET_DIR) + +COMMON_SRC = build_config.c \ + $(TARGET_SRC) \ + config/config.c \ + config/runtime_config.c \ + common/maths.c \ + common/printf.c \ + common/typeconversion.c \ + main.c \ + mw.c \ + flight/altitudehold.c \ + flight/failsafe.c \ + flight/flight.c \ + flight/imu.c \ + flight/mixer.c \ + drivers/bus_i2c_soft.c \ + drivers/serial.c \ + drivers/sound_beeper.c \ + drivers/system.c \ + io/beeper.c \ + io/rc_controls.c \ + io/rc_curves.c \ + io/serial.c \ + io/serial_cli.c \ + io/serial_msp.c \ + io/statusindicator.c \ + rx/rx.c \ + rx/pwm.c \ + rx/msp.c \ + sensors/acceleration.c \ + sensors/battery.c \ + sensors/boardalignment.c \ + sensors/compass.c \ + sensors/gyro.c \ + sensors/initialisation.c \ + $(CMSIS_SRC) \ + $(DEVICE_STDPERIPH_SRC) + +HIGHEND_SRC = flight/autotune.c \ + io/gps.c \ + io/gps_conversion.c \ + io/ledstrip.c \ + rx/sbus.c \ + rx/sumd.c \ + rx/spektrum.c \ + telemetry/telemetry.c \ + telemetry/frsky.c \ + telemetry/hott.c \ + telemetry/msp.c \ + sensors/sonar.c \ + sensors/barometer.c + +NAZE_SRC = startup_stm32f10x_md_gcc.S \ + drivers/accgyro_adxl345.c \ + drivers/accgyro_bma280.c \ + drivers/accgyro_l3g4200d.c \ + drivers/accgyro_mma845x.c \ + drivers/accgyro_mpu3050.c \ + drivers/accgyro_mpu6050.c \ + drivers/adc.c \ + drivers/adc_stm32f10x.c \ + drivers/barometer_bmp085.c \ + drivers/barometer_ms5611.c \ + drivers/bus_spi.c \ + drivers/bus_i2c_stm32f10x.c \ + drivers/compass_hmc5883l.c \ + drivers/gpio_stm32f10x.c \ + drivers/light_led_stm32f10x.c \ + drivers/light_ws2811strip.c \ + drivers/light_ws2811strip_stm32f10x.c \ + drivers/sonar_hcsr04.c \ + drivers/pwm_mapping.c \ + drivers/pwm_output.c \ + drivers/pwm_rx.c \ + drivers/serial_softserial.c \ + drivers/serial_uart.c \ + drivers/serial_uart_stm32f10x.c \ + drivers/sound_beeper_stm32f10x.c \ + drivers/system_stm32f10x.c \ + drivers/timer.c \ + $(HIGHEND_SRC) \ + $(COMMON_SRC) + +OLIMEXINO_SRC = startup_stm32f10x_md_gcc.S \ + drivers/accgyro_mpu6050.c \ + drivers/adc.c \ + drivers/adc_stm32f10x.c \ + drivers/barometer_bmp085.c \ + drivers/bus_i2c_stm32f10x.c \ + drivers/bus_spi.c \ + drivers/compass_hmc5883l.c \ + drivers/gpio_stm32f10x.c \ + drivers/light_led_stm32f10x.c \ + drivers/light_ws2811strip.c \ + drivers/light_ws2811strip_stm32f10x.c \ + drivers/pwm_mapping.c \ + drivers/pwm_output.c \ + drivers/pwm_rssi.c \ + drivers/pwm_rx.c \ + drivers/serial_softserial.c \ + drivers/serial_uart.c \ + drivers/serial_uart_stm32f10x.c \ + drivers/sound_beeper_stm32f10x.c \ + drivers/system_stm32f10x.c \ + drivers/timer.c \ + $(HIGHEND_SRC) \ + $(COMMON_SRC) + +CJMCU_SRC = startup_stm32f10x_md_gcc.S \ + drivers/adc.c \ + drivers/adc_stm32f10x.c \ + drivers/accgyro_mpu6050.c \ + drivers/bus_i2c_stm32f10x.c \ + drivers/bus_spi.c \ + drivers/compass_hmc5883l.c \ + drivers/gpio_stm32f10x.c \ + drivers/light_led_stm32f10x.c \ + drivers/pwm_mapping.c \ + drivers/pwm_output.c \ + drivers/pwm_rssi.c \ + drivers/pwm_rx.c \ + drivers/serial_uart.c \ + drivers/serial_uart_stm32f10x.c \ + drivers/sound_beeper_stm32f10x.c \ + drivers/system_stm32f10x.c \ + drivers/timer.c \ + $(COMMON_SRC) + +CC3D_SRC = startup_stm32f10x_md_gcc.S \ + drivers/accgyro_spi_mpu6000.c \ + drivers/adc.c \ + drivers/adc_stm32f10x.c \ + drivers/bus_i2c_stm32f10x.c \ + drivers/bus_spi.c \ + drivers/gpio_stm32f10x.c \ + drivers/light_led_stm32f10x.c \ + drivers/light_ws2811strip.c \ + drivers/light_ws2811strip_stm32f10x.c \ + drivers/pwm_mapping.c \ + drivers/pwm_output.c \ + drivers/pwm_rssi.c \ + drivers/pwm_rx.c \ + drivers/serial_softserial.c \ + drivers/serial_uart.c \ + drivers/serial_uart_stm32f10x.c \ + drivers/sound_beeper_stm32f10x.c \ + drivers/system_stm32f10x.c \ + drivers/timer.c \ + $(HIGHEND_SRC) \ + $(COMMON_SRC) + +STM32F30x_COMMON_SRC = startup_stm32f30x_md_gcc.S \ + drivers/adc.c \ + drivers/adc_stm32f30x.c \ + drivers/bus_i2c_stm32f30x.c \ + drivers/bus_spi.c \ + drivers/gpio_stm32f30x.c \ + drivers/light_led_stm32f30x.c \ + drivers/light_ws2811strip.c \ + drivers/light_ws2811strip_stm32f30x.c \ + drivers/pwm_mapping.c \ + drivers/pwm_output.c \ + drivers/pwm_rssi.c \ + drivers/pwm_rx.c \ + drivers/serial_uart.c \ + drivers/serial_uart_stm32f30x.c \ + drivers/serial_softserial.c \ + drivers/serial_usb_vcp.c \ + drivers/sound_beeper_stm32f30x.c \ + drivers/system_stm32f30x.c \ + drivers/timer.c \ + vcp/hw_config.c \ + vcp/stm32_it.c \ + vcp/usb_desc.c \ + vcp/usb_endp.c \ + vcp/usb_istr.c \ + vcp/usb_prop.c \ + vcp/usb_pwr.c + +NAZE32PRO_SRC = $(STM32F30x_COMMON_SRC) \ + $(HIGHEND_SRC) \ + $(COMMON_SRC) + +STM32F3DISCOVERY_COMMON_SRC = $(STM32F30x_COMMON_SRC) \ + drivers/accgyro_l3gd20.c \ + drivers/accgyro_l3gd20.c \ + drivers/accgyro_lsm303dlhc.c + +STM32F3DISCOVERY_SRC = $(STM32F3DISCOVERY_COMMON_SRC) \ + drivers/accgyro_adxl345.c \ + drivers/accgyro_bma280.c \ + drivers/accgyro_mma845x.c \ + drivers/accgyro_mpu3050.c \ + drivers/accgyro_mpu6050.c \ + drivers/accgyro_l3g4200d.c \ + $(HIGHEND_SRC) \ + $(COMMON_SRC) + +CHEBUZZF3_SRC = $(STM32F3DISCOVERY_SRC) \ + $(HIGHEND_SRC) \ + $(COMMON_SRC) + +# Search path and source files for the ST stdperiph library +VPATH := $(VPATH):$(STDPERIPH_DIR)/src + +############################################################################### +# Things that might need changing to use different tools +# + +# Tool names +CC = arm-none-eabi-gcc +OBJCOPY = arm-none-eabi-objcopy +SIZE = arm-none-eabi-size + +# +# Tool options. +# + +ifeq ($(DEBUG),GDB) +OPTIMIZE = -O0 +LTO_FLAGS = $(OPTIMIZE) +SPEC_FLAGS = +else +OPTIMIZE = -Os +LTO_FLAGS = $(OPTIMIZE) -flto -fuse-linker-plugin +SPEC_FLAGS = --specs=nano.specs +endif + +DEBUG_FLAGS = -ggdb3 + +CFLAGS = $(ARCH_FLAGS) \ + $(addprefix -D,$(OPTIONS)) \ + $(addprefix -I,$(INCLUDE_DIRS)) \ + $(DEBUG_FLAGS) \ + -std=gnu99 \ + -Wall -pedantic -Wextra -Wshadow -Wunsafe-loop-optimizations \ + -ffunction-sections \ + -fdata-sections \ + $(DEVICE_FLAGS) \ + -DUSE_STDPERIPH_DRIVER \ + $(TARGET_FLAGS) \ + -D'__FORKNAME__="$(FORKNAME)"' \ + -save-temps=obj \ + $(LTO_FLAGS) + +ASFLAGS = $(ARCH_FLAGS) \ + -x assembler-with-cpp \ + $(addprefix -I,$(INCLUDE_DIRS)) + +# XXX Map/crossref output? +LDFLAGS = -T$(LD_SCRIPT) \ + $(ARCH_FLAGS) \ + $(DEBUG_FLAGS) \ + -static \ + -nostartfiles \ + -Wl,-gc-sections,-Map,$(TARGET_MAP) \ + -lnosys \ + -lm \ + $(LTO_FLAGS) \ + $(SPEC_FLAGS) + +############################################################################### +# No user-serviceable parts below +############################################################################### + +# +# Things we will build +# +ifeq ($(filter $(TARGET),$(VALID_TARGETS)),) +$(error Target '$(TARGET)' is not valid, must be one of $(VALID_TARGETS)) +endif + + +TARGET_HEX = $(BIN_DIR)/$(FORKNAME)_$(TARGET).hex +TARGET_ELF = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).elf +TARGET_OBJS = $(addsuffix .o,$(addprefix $(OBJECT_DIR)/$(TARGET)/,$(basename $($(TARGET)_SRC)))) +TARGET_MAP = $(OBJECT_DIR)/$(FORKNAME)_$(TARGET).map + +# List of buildable ELF files and their object dependencies. +# It would be nice to compute these lists, but that seems to be just beyond make. + +$(TARGET_HEX): $(TARGET_ELF) + $(OBJCOPY) -O ihex --set-start 0x8000000 $< $@ + +$(TARGET_ELF): $(TARGET_OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + $(SIZE) $(TARGET_ELF) + +# Compile +$(OBJECT_DIR)/$(TARGET)/%.o: %.c + @mkdir -p $(dir $@) + @echo %% $(notdir $<) + @$(CC) -c -o $@ $(CFLAGS) $< + +# Assemble +$(OBJECT_DIR)/$(TARGET)/%.o: %.s + @mkdir -p $(dir $@) + @echo %% $(notdir $<) + @$(CC) -c -o $@ $(ASFLAGS) $< +$(OBJECT_DIR)/$(TARGET)/%.o): %.S + @mkdir -p $(dir $@) + @echo %% $(notdir $<) + @$(CC) -c -o $@ $(ASFLAGS) $< + +clean: + rm -f $(TARGET_HEX) $(TARGET_ELF) $(TARGET_OBJS) $(TARGET_MAP) + rm -rf $(OBJECT_DIR)/$(TARGET) + +flash_$(TARGET): $(TARGET_HEX) + stty -F $(SERIAL_DEVICE) raw speed 115200 -crtscts cs8 -parenb -cstopb -ixon + echo -n 'R' >$(SERIAL_DEVICE) + stm32flash -w $(TARGET_HEX) -v -g 0x0 -b 115200 $(SERIAL_DEVICE) + +flash: flash_$(TARGET) + + +unbrick_$(TARGET): $(TARGET_HEX) + stty -F $(SERIAL_DEVICE) raw speed 115200 -crtscts cs8 -parenb -cstopb -ixon + stm32flash -w $(TARGET_HEX) -v -g 0x0 -b 115200 $(SERIAL_DEVICE) + +unbrick: unbrick_$(TARGET) + +help: + @echo "" + @echo "Makefile for the $(FORKNAME) firmware" + @echo "" + @echo "Usage:" + @echo " make [TARGET=] [OPTIONS=\"\"]" + @echo "" + @echo "Valid TARGET values are: $(VALID_TARGETS)" + @echo ""