# Set verbosity ifeq ($(V), 1) Q = else Q = @ endif # Commands CC = $(Q)arm-none-eabi-gcc AS = $(Q)arm-none-eabi-as LD = $(Q)arm-none-eabi-ld AR = $(Q)arm-none-eabi-ar RM = $(Q)rm CPP = $(Q)arm-none-eabi-cpp SIZE = $(Q)arm-none-eabi-size STRIP = $(Q)arm-none-eabi-strip -s OBJCOPY = $(Q)arm-none-eabi-objcopy OBJDUMP = $(Q)arm-none-eabi-objdump PYTHON = $(Q)python MKDFU = micropython/tools/dfu.py PYDFU = $(Q)../usr/pydfu.py MKDIR = $(Q)mkdir ECHO = $(Q)@echo MAKE = $(Q)make CAT = $(Q)cat # Targets OPENMV = openmv BOOTLOADER = bootloader FIRMWARE = firmware # Directories TOP_DIR=$(shell pwd) BUILD=$(TOP_DIR)/build CMSIS_DIR=cmsis STUSB_DIR=stusb FATFS_DIR=fatfs MICROPY_DIR=micropython OMV_DIR=omv WINC1500_DIR=winc1500 BOOT_DIR=bootloader # Additional qstr definitions for OpenMV OMV_QSTR_DEFS = $(TOP_DIR)/$(OMV_DIR)/py/qstrdefsomv.h # Target TARGET ?= OPENMV2 FW_DIR=$(TOP_DIR)/../firmware/$(TARGET) # Debugging/Optimization ifeq ($(DEBUG), 1) CFLAGS += -O0 -ggdb3 else CFLAGS += -O2 -ggdb3 -DNDEBUG endif ifeq ($(DEBUG_PRINTF), 1) CFLAGS += -DDEBUG_PRINTF endif # Compiler Flags include $(TOP_DIR)/$(OMV_DIR)/boards/$(TARGET)/omv_boardconfig.mk CFLAGS += -std=gnu99 -Wall -Werror -Warray-bounds -mthumb -nostartfiles -mabi=aapcs-linux -fdata-sections -ffunction-sections CFLAGS += -D$(MCU) -D$(ARM_MATH) -fsingle-precision-constant -Wdouble-promotion -mcpu=$(CPU) -mtune=$(CPU) -mfpu=$(FPU) -mfloat-abi=hard CFLAGS += -D__FPU_PRESENT=1 -D__VFP_FP__ -DUSE_USB_FS -DUSE_DEVICE_MODE -DUSE_USB_OTG_ID=0 -DHSE_VALUE=12000000 -D$(TARGET)\ -DSTM32_HAL_H=$(HAL_INC) -DVECT_TAB_OFFSET=$(VECT_TAB_OFFSET) -DMAIN_APP_ADDR=$(MAIN_APP_ADDR) CFLAGS += -I. -Iinclude CFLAGS += -I$(TOP_DIR)/$(BOOT_DIR)/include/ CFLAGS += -I$(TOP_DIR)/$(CMSIS_DIR)/include/ CFLAGS += -I$(TOP_DIR)/$(CMSIS_DIR)/include/st CFLAGS += -I$(TOP_DIR)/$(STHAL_DIR)/include/ CFLAGS += -I$(TOP_DIR)/$(FATFS_DIR)/include/ CFLAGS += -I$(BUILD)/$(MICROPY_DIR)/ CFLAGS += -I$(TOP_DIR)/$(MICROPY_DIR)/ CFLAGS += -I$(TOP_DIR)/$(MICROPY_DIR)/py/ CFLAGS += -I$(TOP_DIR)/$(MICROPY_DIR)/lib/mp-readline CFLAGS += -I$(TOP_DIR)/$(MICROPY_DIR)/stmhal/ CFLAGS += -I$(TOP_DIR)/$(MICROPY_DIR)/stmhal/usbdev/core/inc/ CFLAGS += -I$(TOP_DIR)/$(MICROPY_DIR)/stmhal/usbdev/class/inc/ CFLAGS += -I$(TOP_DIR)/$(MICROPY_DIR)/stmhal/boards/$(TARGET)/ CFLAGS += -I$(TOP_DIR)/$(OMV_DIR)/ CFLAGS += -I$(TOP_DIR)/$(OMV_DIR)/py/ CFLAGS += -I$(TOP_DIR)/$(OMV_DIR)/img/ CFLAGS += -I$(TOP_DIR)/$(OMV_DIR)/boards/$(TARGET)/ CFLAGS += -I$(TOP_DIR)/$(WINC1500_DIR)/include/ # Linker Flags LDFLAGS = -mcpu=$(CPU) -mabi=aapcs-linux -mthumb -mfpu=$(FPU) -mfloat-abi=hard\ -nostdlib -Wl,--gc-sections -Wl,-T$(BUILD)/stm32fxxx.lds # Linker Flags BOOT_LDFLAGS = -mcpu=$(CPU) -mabi=aapcs-linux -mthumb -mfpu=$(FPU) -mfloat-abi=hard\ -nostdlib -Wl,--gc-sections -Wl,-T$(BUILD)/$(BOOT_DIR)/stm32fxxx.lds #------------- Libraries ----------------# #FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/st/*.o) FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/dsp/CommonTables/*.o) FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/dsp/FastMathFunctions/*.o) FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/dsp/MatrixFunctions/*.o) #FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/dsp/ComplexMathFunctions/*.o) #FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/dsp/ControllerFunctions/*.o) #FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/dsp/FilteringFunctions/*.o) #FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/dsp/StatisticsFunctions/*.o) #FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/dsp/SupportFunctions/*.o) #FIRM_OBJ += $(wildcard $(BUILD)/$(CMSIS_DIR)/src/dsp/TransformFunctions/*.o) FIRM_OBJ += $(wildcard $(BUILD)/$(STHAL_DIR)/src/*.o) FIRM_OBJ += $(wildcard $(BUILD)/$(FATFS_DIR)/src/*.o) FIRM_OBJ += $(wildcard $(BUILD)/$(FATFS_DIR)/src/option/*.o) FIRM_OBJ += $(wildcard $(BUILD)/$(WINC1500_DIR)/src/*.o) #------------- OpenMV Objects ----------------# FIRM_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/, \ main.o \ xalloc.o \ fb_alloc.o \ ff_wrapper.o \ array.o \ usbdbg.o \ sccb.o \ ov9650.o \ ov2640.o \ ov7725.o \ sensor.o \ stm32fxxx_hal_msp.o \ soft_i2c.o \ mutex.o \ ) FIRM_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/img/,\ blob.o \ fmath.o \ fsort.o \ fft.o \ haar.o \ imlib.o \ stats.o \ morph.o \ integral.o \ integral_mw.o \ kmeans.o \ lab_tab.o \ xyz_tab.o \ yuv_tab.o \ rainbow_tab.o \ rgb2rgb_tab.o \ midpoint.o \ mean.o \ mode.o \ median.o \ pool.o \ point.o \ rectangle.o \ bmp.o \ ppm.o \ gif.o \ mjpeg.o \ fast.o \ freak.o \ template.o \ phasecorrelation.o \ font.o \ jpeg.o \ lbp.o \ eye.o \ hough.o \ sincos_tab.o \ edge.o \ ) FIRM_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/py/, \ py_helper.o \ py_sensor.o \ py_image.o \ py_time.o \ py_lcd.o \ py_fir.o \ py_gif.o \ py_mjpeg.o \ py_winc.o \ py_tof.o \ py_cpufreq.o \ ) FIRM_OBJ += $(addprefix $(BUILD)/$(CMSIS_DIR)/src/st/,\ $(STARTUP).o \ system_stm32fxxx.o \ ) #------------- MicroPy Core -------------------# FIRM_OBJ += $(wildcard $(BUILD)/$(MICROPY_DIR)/py/*.o) #------------- MicroPy Objects ----------------# FIRM_OBJ += $(addprefix $(BUILD)/$(MICROPY_DIR)/,\ stm32_it.o \ usbd_conf.o \ usbd_desc.o \ usbd_cdc_interface.o \ usbd_msc_storage.o \ pendsv.o \ bufhelper.o \ usb.o \ gchelper.o \ gccollect.o \ pybstdio.o \ help.o \ input.o \ import.o \ lexerfatfs.o \ flash.o \ storage.o \ rtc.o \ irq.o \ adc.o \ dac.o \ dma.o \ uart.o \ systick.o \ i2c.o \ spi.o \ pin.o \ pin_defs_stmhal.o \ pin_named_pins.o \ pins_$(TARGET).o \ timer.o \ servo.o \ rng.o \ led.o \ mphalport.o \ sdcard.o \ fatfs_port.o \ builtin_open.o \ extint.o \ modpyb.o \ modstm.o \ moduos.o \ modutime.o \ moduselect.o \ modusocket.o \ modnetwork.o \ modmachine.o \ ) #------------- MicroPy Objects ----------------# FIRM_OBJ += $(addprefix $(BUILD)/$(MICROPY_DIR)/lib/,\ utils/pyexec.o \ utils/pyhelp.o \ utils/printf.o \ libc/string0.o \ netutils/netutils.o \ timeutils/timeutils.o \ ) FIRM_OBJ += $(addprefix $(BUILD)/$(MICROPY_DIR)/lib/libm/,\ math.o \ asinfacosf.o \ atanf.o \ atan2f.o \ fmodf.o \ roundf.o \ log1pf.o \ acoshf.o \ asinhf.o \ atanhf.o \ kf_rem_pio2.o \ kf_sin.o \ kf_cos.o \ kf_tan.o \ ef_rem_pio2.o \ erf_lgamma.o \ sf_sin.o \ sf_cos.o \ sf_tan.o \ sf_frexp.o \ sf_modf.o \ sf_ldexp.o \ sf_erf.o \ wf_lgamma.o \ wf_tgamma.o \ ) FIRM_OBJ += $(addprefix $(BUILD)/$(MICROPY_DIR)/lib/mp-readline/,\ readline.o \ ) FIRM_OBJ += $(addprefix $(BUILD)/$(MICROPY_DIR)/usbdev/, \ core/src/usbd_core.o \ core/src/usbd_ctlreq.o \ core/src/usbd_ioreq.o \ class/src/usbd_cdc_msc_hid.o \ class/src/usbd_msc_bot.o \ class/src/usbd_msc_scsi.o \ class/src/usbd_msc_data.o \ ) FIRM_OBJ += $(addprefix $(BUILD)/$(MICROPY_DIR)/extmod/,\ fsusermount.o \ vfs_fat.o \ vfs_fat_ffconf.o \ vfs_fat_diskio.o \ vfs_fat_file.o \ vfs_fat_lexer.o \ vfs_fat_misc.o \ machine_mem.o \ machine_i2c.o \ ) # Bootloader object files BOOT_OBJ += $(wildcard $(BUILD)/$(BOOT_DIR)/src/*.o) BOOT_OBJ += $(wildcard $(BUILD)/$(STHAL_DIR)/src/*.o) BOOT_OBJ += $(addprefix $(BUILD)/$(CMSIS_DIR)/src/st/,\ $(STARTUP).o \ system_stm32fxxx.o \ ) BOOT_OBJ += $(addprefix $(BUILD)/$(MICROPY_DIR)/usbdev/, \ core/src/usbd_core.o \ core/src/usbd_ctlreq.o \ core/src/usbd_ioreq.o \ ) ################################################### #Export Variables export Q export CC export AS export LD export AR export SIZE export OBJCOPY export OBJDUMP export MKDIR export ECHO export CFLAGS export LDFLAGS export TOP_DIR export BUILD export TARGET export STARTUP ################################################### all: $(OPENMV) $(BUILD): $(MKDIR) -p $@ BOOTLOADER_OBJS: FIRMWARE_OBJS $(MAKE) -C $(BOOT_DIR) BUILD=$(BUILD)/$(BOOT_DIR) FIRMWARE_OBJS: $(MAKE) -C $(CMSIS_DIR) BUILD=$(BUILD)/$(CMSIS_DIR) $(MAKE) -C $(STHAL_DIR) BUILD=$(BUILD)/$(STHAL_DIR) $(MAKE) -C $(FATFS_DIR) BUILD=$(BUILD)/$(FATFS_DIR) $(MAKE) -C $(MICROPY_DIR)/stmhal BUILD=$(BUILD)/$(MICROPY_DIR) BOARD=$(TARGET) QSTR_DEFS=$(OMV_QSTR_DEFS) $(MAKE) -C $(WINC1500_DIR) BUILD=$(BUILD)/$(WINC1500_DIR) $(MAKE) -C $(OMV_DIR) BUILD=$(BUILD)/$(OMV_DIR) # This target generates the main/app firmware image located at 0x08010000 $(FIRMWARE): FIRMWARE_OBJS $(CPP) -P -E -D$(TARGET) $(OMV_DIR)/stm32fxxx.ld.S > $(BUILD)/stm32fxxx.lds $(CC) $(LDFLAGS) $(FIRM_OBJ) -o $(FW_DIR)/$(FIRMWARE).elf $(OBJCOPY) -Obinary $(FW_DIR)/$(FIRMWARE).elf $(FW_DIR)/$(FIRMWARE).bin $(PYTHON) $(MKDFU) -b $(MAIN_APP_ADDR):$(FW_DIR)/$(FIRMWARE).bin $(FW_DIR)/$(FIRMWARE).dfu # This target generates the bootloader. The bootloader binary is generated twice, # once without padding, to generate the bootloader.dfu file, and once with padding # up to the main fw image (MAIN_APP_ADDR), to generate a contiguous firmware.bin image. $(BOOTLOADER): FIRMWARE_OBJS BOOTLOADER_OBJS $(CPP) -P -E -D$(TARGET) $(BOOT_DIR)/stm32fxxx.ld.S > $(BUILD)/$(BOOT_DIR)/stm32fxxx.lds $(CC) $(BOOT_LDFLAGS) $(BOOT_OBJ) -o $(FW_DIR)/$(BOOTLOADER).elf $(OBJCOPY) -Obinary $(FW_DIR)/$(BOOTLOADER).elf $(FW_DIR)/$(BOOTLOADER).bin $(PYTHON) $(MKDFU) -b 0x08000000:$(FW_DIR)/$(BOOTLOADER).bin $(FW_DIR)/$(BOOTLOADER).dfu $(OBJCOPY) -Obinary --pad-to=$(MAIN_APP_ADDR) $(FW_DIR)/$(BOOTLOADER).elf $(FW_DIR)/$(BOOTLOADER).bin # This target generates a combined bootloader+main firmware image. $(OPENMV): $(BOOTLOADER) $(FIRMWARE) | $(BUILD) $(CAT) $(FW_DIR)/$(BOOTLOADER).bin $(FW_DIR)/$(FIRMWARE).bin > $(FW_DIR)/$(OPENMV).bin $(PYTHON) $(MKDFU) -b 0x08000000:$(FW_DIR)/$(BOOTLOADER).bin -b $(MAIN_APP_ADDR):$(FW_DIR)/$(FIRMWARE).bin $(FW_DIR)/$(OPENMV).dfu $(SIZE) $(FW_DIR)/$(BOOTLOADER).elf $(SIZE) $(FW_DIR)/$(FIRMWARE).elf size: $(SIZE) --format=SysV $(FW_DIR)/$(BOOTLOADER).elf $(SIZE) --format=SysV $(FW_DIR)/$(FIRMWARE).elf clean: $(RM) -fr $(BUILD) # Flash the bootloader flash_boot:: $(PYDFU) -u $(FW_DIR)/$(BOOTLOADER).dfu # Flash the main firmware image flash_image:: $(PYDFU) -u $(FW_DIR)/$(FIRMWARE).dfu # Flash the bootloader + main firmware image (DFU) flash_dfu:: $(PYDFU) -m -u $(FW_DIR)/$(OPENMV).dfu # Flash the bootloader + main firmware image (binary) flash_bin:: $(PYDFU) -m -u $(FW_DIR)/$(OPENMV).bin