|
- # Copyright 2012 Olivier Gillet.
- #
- # Author: Olivier Gillet (ol.gillet@gmail.com)
- #
- # Permission is hereby granted, free of charge, to any person obtaining a copy
- # of this software and associated documentation files (the "Software"), to deal
- # in the Software without restriction, including without limitation the rights
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- # copies of the Software, and to permit persons to whom the Software is
- # furnished to do so, subject to the following conditions:
- #
- # The above copyright notice and this permission notice shall be included in
- # all copies or substantial portions of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- # THE SOFTWARE.
- #
- # See http://creativecommons.org/licenses/MIT/ for more information.
-
- # ------------------------------------------------------------------------------
- # Files and directories
- # ------------------------------------------------------------------------------
-
- TOOLCHAIN_PATH ?= /usr/local/arm/
-
- PGM_INTERFACE ?= stlink-v2
- # PGM_INTERFACE ?= ftdi/olimex-arm-jtag-swd
- # PGM_INTERFACE ?= ftdi/olimex-arm-usb-ocd-h
-
- ifeq ($(PGM_INTERFACE),ftdi/olimex-arm-jtag-swd)
- OPENOCD_INTERFACE_SCRIPT ?= interface/ftdi/olimex-arm-usb-ocd-h.cfg -f interface/ftdi/olimex-arm-jtag-swd.cfg
- else
- OPENOCD_INTERFACE_SCRIPT ?= interface/$(PGM_INTERFACE).cfg
- endif
-
- PGM_SERIAL_PORT ?= /dev/ftdi-usbserial
- PGM_SERIAL_BAUD_RATE ?= 115200
- PGM_SERIAL_VERIFY ?= -v
-
- # --- You should not have to modify these --------------------------------------
-
- TOOLCHAIN_BIN = $(TOOLCHAIN_PATH)bin/
- STM32_PATH = stmlib/third_party/STM
-
- # --- Do not modify anything below this point ----------------------------------
-
- BUILD_ROOT = build/
- BUILD_DIR = $(BUILD_ROOT)$(TARGET)/
-
- CC = $(TOOLCHAIN_BIN)arm-none-eabi-gcc
- CXX = $(TOOLCHAIN_BIN)arm-none-eabi-g++
- AS = $(TOOLCHAIN_BIN)arm-none-eabi-as
- OBJCOPY = $(TOOLCHAIN_BIN)arm-none-eabi-objcopy
- DB = $(TOOLCHAIN_BIN)arm-none-eabi-gdb
- OBJDUMP = $(TOOLCHAIN_BIN)arm-none-eabi-objdump
- AR = $(TOOLCHAIN_BIN)arm-none-eabi-ar
- SIZE = $(TOOLCHAIN_BIN)arm-none-eabi-size
- NM = $(TOOLCHAIN_BIN)arm-none-eabi-nm
- REMOVE = rm -f
- CAT = cat
- FORMAT_SIZE = | figlet | cowsay -n -f moose
- FORMAT_RAMSIZE = | figlet | cowsay -n -f small
-
- STM32LOADER_PATH = stmlib/programming/serial/
- OPENOCD_SCRIPTS_PATH = stmlib/programming/jtag/
-
- # ------------------------------------------------------------------------------
- # Files and directories for the user code
- # ------------------------------------------------------------------------------
-
- VPATH = $(PACKAGES)
-
- CC_FILES = $(notdir $(wildcard $(patsubst %,%/*.cc,$(PACKAGES))))
- C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(PACKAGES))))
- AS_FILES = $(notdir $(wildcard $(patsubst %,%/*.s,$(PACKAGES))))
-
- TARGET_BIN = $(BUILD_DIR)$(TARGET).bin
- TARGET_ELF = $(BUILD_DIR)$(TARGET).elf
- TARGET_HEX = $(BUILD_DIR)$(TARGET).hex
- COMBO_HEX = $(BUILD_DIR)$(TARGET)_bootloader_combo.hex
- COMBO_BIN = $(BUILD_DIR)$(TARGET)_bootloader_combo.bin
- BOOTLOADER_HEX = $(BUILD_ROOT)$(BOOTLOADER)/$(BOOTLOADER).hex
- TARGET_SIZE = $(BUILD_DIR)$(TARGET).size
- TARGETS = $(BUILD_DIR)$(TARGET).*
- DEP_FILE = $(BUILD_DIR)depends.mk
-
- # ------------------------------------------------------------------------------
- # Platform specific flags
- # ------------------------------------------------------------------------------
-
- ifeq ($(FAMILY),f4xx)
-
- MODEL_DEFINE = STM32F40_41xxx -DSTM32F4XX -DARM_MATH_CM4 -D__FPU_PRESENT
- STARTUP_OBJ = $(BUILD_DIR)startup_stm32f4xx.o
- LINKER_SCRIPT = stmlib/linker_scripts/stm32f4xx_flash$(LD_SUFFIX).ld
- FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F4xx_StdPeriph_Driver
- ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb-interwork -funroll-loops
- ARCH_DEFINE = GCC_ARMCM4
- OPENOCD_TARGET = f4x
-
- else ifeq ($(FAMILY),f37x)
-
- MODEL_DEFINE = STM32F37X -DARM_MATH_CM4 -D__FPU_PRESENT
- STARTUP_OBJ = $(BUILD_DIR)startup_stm32f37x.o
- LINKER_SCRIPT = stmlib/linker_scripts/stm32f373x_flash$(LD_SUFFIX).ld
- FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F37x_StdPeriph_Driver
- ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb-interwork -funroll-loops
- ARCH_DEFINE = GCC_ARMCM4
- OPENOCD_TARGET = f3x
-
- else ifeq ($(FAMILY),f0xx)
-
- MODEL_DEFINE = STM32F0XX
- STARTUP_OBJ = $(BUILD_DIR)startup_stm32f0xx.o
- LINKER_SCRIPT = stmlib/linker_scripts/stm32f0xx_flash$(LD_SUFFIX).ld
- FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F0xx_StdPeriph_Driver
- ARCHFLAGS = -mcpu=cortex-m0 -mthumb -mthumb-interwork -funroll-loops
- ARCH_DEFINE = GCC_ARMCM0
- OPENOCD_TARGET = f0x
-
- else
-
- ifeq ($(DENSITY),hd)
- MODEL_DEFINE = STM32F10X_HD
- else ifeq ($(DENSITY),md)
- MODEL_DEFINE = STM32F10X_MD
- else
- MODEL_DEFINE = STM32F10X_CL
- endif
-
- STARTUP_OBJ = $(BUILD_DIR)startup_stm32f10x_$(DENSITY).o
- LINKER_SCRIPT = stmlib/linker_scripts/stm32f10x_flash_$(DENSITY)$(LD_SUFFIX).ld
- FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F10x_StdPeriph_Driver
- ARCHFLAGS = -mcpu=cortex-m3 -mthumb -fno-unroll-loops
- ARCH_DEFINE = GCC_ARMCM3
- OPENOCD_TARGET = f1x
-
- endif
-
- ifeq ($(APPLICATION),TRUE)
- APPLICATION_DEFINE = -DAPPLICATION
- LD_SUFFIX = _application
- BASE_ADDRESS = 0x08004000
- else ifeq ($(APPLICATION_SMALL),TRUE)
- APPLICATION_DEFINE = -DAPPLICATION
- LD_SUFFIX = _application_small
- BASE_ADDRESS = 0x08001000
- else ifeq ($(APPLICATION_LARGE),TRUE)
- APPLICATION_DEFINE = -DAPPLICATION
- LD_SUFFIX = _application_large
- BASE_ADDRESS = 0x08008000
- else
- APPLICATION_DEFINE = -DNO_APPLICATION
- LD_SUFFIX =
- BASE_ADDRESS = 0x08000000
- endif
-
- OPENOCD_TARGET_SCRIPT ?= target/stm32$(OPENOCD_TARGET).cfg
-
- # ------------------------------------------------------------------------------
- # Flags for gcc/binutils
- # ------------------------------------------------------------------------------
-
- INCFLAGS = \
- -I. \
- -D$(ARCH_DEFINE) \
- -D$(MODEL_DEFINE) \
- $(APPLICATION_DEFINE) \
- $(PROJECT_CONFIGURATION) \
- -DF_CPU=$(F_CPU) \
- -DF_CRYSTAL=$(F_CRYSTAL) \
- -DUSE_STDPERIPH_DRIVER \
- -D$(SYSCLOCK)=$(F_CPU)
-
- CCFLAGS = \
- -g -O2 -Wall -Werror -Wno-unused-local-typedefs \
- -fasm \
- -finline \
- -finline-functions-called-once \
- -fdata-sections \
- -ffunction-sections \
- -fshort-enums \
- -fno-move-loop-invariants \
- $(INCFLAGS) \
- $(ARCHFLAGS)
-
- CPPFLAGS = -fno-exceptions -fno-rtti
-
- ASFLAGS = $(ARCHFLAGS)
-
- LDFLAGS = \
- -Wl,-Map=$(BUILD_DIR)$(TARGET).map \
- -Wl,--gc-sections \
- -T $(LINKER_SCRIPT) \
- $(ARCHFLAGS) \
- $(INCFLAGS) \
- -L$(STM32_PATH)
-
-
- # ------------------------------------------------------------------------------
- # Files and directories for the system firmware
- # ------------------------------------------------------------------------------
-
- FW_BUILD_DIR = $(BUILD_ROOT)stm_firmware/
- FW_CORE_DIR = $(STM32_PATH)/CMSIS/CM3_$(FAMILY)
- FW_STARTUP_DIR = $(FW_CORE_DIR)/startup/gcc
-
- FW_STDDRIVER_SRCDIR = $(FW_STDDRIVER_DIR)/src
- FW_STDDRIVER_INCDIR = $(FW_STDDRIVER_DIR)/inc
-
- FW_USB_DIR = $(STM32_PATH)/STM32_USB-FS-Device_Driver
- FW_USB_SRCDIR = $(FW_USB_DIR)/src
- FW_USB_INCDIR = $(FW_USB_DIR)/inc
-
- INCFLAGS += -I$(STM32_PATH) -I$(FW_CORE_DIR) -I$(FW_STARTUP_DIR) -I$(FW_STDDRIVER_INCDIR)
- VPATH += $(FW_CORE_DIR) $(FW_STARTUP_DIR) $(FW_STDDRIVER_SRCDIR) $(STM32_PATH) $(FW_BUILD_DIR)
-
- CORE_C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(FW_CORE_DIR))))
- DRIVERS_C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(FW_STDDRIVER_SRCDIR))))
- USB_C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(FW_USB_SRCDIR))))
-
- C_FILES += $(CORE_C_FILES)
- C_FILES += $(DRIVERS_C_FILES)
-
- ifeq ($(USB),enabled)
- INCFLAGS += -I$(FW_USB_INCDIR)
- VPATH += $(FW_USB_SRCDIR)
- C_FILES += $(USB_C_FILES)
- endif
-
-
- # ------------------------------------------------------------------------------
- # Source compiling and dependency analysis
- # ------------------------------------------------------------------------------
-
- $(BUILD_DIR)%.o: %.s
- $(CC) -c -x assembler-with-cpp $(ASFLAGS) $< -o $@
-
- $(BUILD_DIR)%.o: %.c
- $(CC) -c $(CCFLAGS) -std=c99 $< -o $@
-
- $(BUILD_DIR)%.o: %.cc
- $(CXX) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
-
- $(BUILD_DIR)%.d: %.s
- $(CC) -c -x assembler-with-cpp -MM $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o)
-
- $(BUILD_DIR)%.d: %.c
- $(CC) -MM $(CCFLAGS) $< -MF $@ -MT $(@:.d=.o)
-
- $(BUILD_DIR)%.d: %.cc
- $(CXX) -MM $(CCFLAGS) $(CPPFLAGS) $< -MF $@ -MT $(@:.d=.o)
-
-
- # ------------------------------------------------------------------------------
- # Object file conversion
- # ------------------------------------------------------------------------------
-
- $(BUILD_DIR)%.hex: $(BUILD_DIR)%.elf
- $(OBJCOPY) -O ihex $< $@
-
- $(BUILD_DIR)%.bin: $(BUILD_DIR)%.elf
- $(OBJCOPY) -O binary $< $@
-
- $(BUILD_DIR)%.lss: $(BUILD_DIR)%.elf
- $(OBJDUMP) -d -h -S $< > $@
-
- $(BUILD_DIR)%.sym: $(BUILD_DIR)%.elf
- $(NM) -n $< > $@
-
-
- # ------------------------------------------------------------------------------
- # What to build
- # ------------------------------------------------------------------------------
-
- OBJ_FILES = $(CC_FILES:.cc=.o) $(C_FILES:.c=.o) $(AS_FILES:.s=.o)
- OBJS = $(patsubst %,$(BUILD_DIR)%,$(OBJ_FILES)) $(STARTUP_OBJ)
- DEPS = $(OBJS:.o=.d)
-
- all: $(BUILD_DIR) $(TARGET_HEX)
-
-
- # ------------------------------------------------------------------------------
- # Resources
- # ------------------------------------------------------------------------------
-
- RESOURCE_COMPILER = stmlib/tools/resources_compiler.py
-
- resources: $(TARGET)/resources.cc
-
- $(TARGET)/resources.cc: $(wildcard $(RESOURCES)/*.py)
- python $(RESOURCE_COMPILER) $(RESOURCES)/resources.py
-
-
- # ------------------------------------------------------------------------------
- # Main rules
- # ------------------------------------------------------------------------------
-
- $(BUILD_DIR):
- mkdir -p $(BUILD_DIR)
-
- $(TARGET_ELF): $(OBJS)
- $(CC) $(LDFLAGS) -o $(TARGET_ELF) $(OBJS)
-
- $(DEP_FILE): $(BUILD_DIR) $(DEPS)
- cat $(DEPS) > $(DEP_FILE)
-
- bin: $(TARGET_BIN)
-
- hex: $(TARGET_HEX)
-
- clean:
- $(REMOVE) $(OBJS) $(TARGETS) $(DEP_FILE) $(DEPS)
-
- depends: $(DEPS)
- cat $(DEPS) > $(DEP_FILE)
-
- $(TARGET_SIZE): $(TARGET_ELF)
- $(SIZE) $(TARGET_ELF) > $(TARGET_SIZE)
-
- $(BUILD_DIR)$(TARGET).top_symbols: $(TARGET_ELF)
- $(NM) $(TARGET_ELF) --size-sort -C -f bsd -r > $@
-
- size: $(TARGET_SIZE)
- cat $(TARGET_SIZE) | awk '{ print $$1+$$2 }' | tail -n1 $(FORMAT_SIZE)
-
- ramsize: $(TARGET_SIZE)
- cat $(TARGET_SIZE) | awk '{ print $$2+$$3 }' | tail -n1 $(FORMAT_RAMSIZE)
-
- disassemble: build/$(TARGET)/$(TARGET).lss build/$(TARGET)/$(TARGET).top_symbols
-
- .PHONY: all bin clean depends resources
-
- include $(DEP_FILE)
-
-
- # ------------------------------------------------------------------------------
- # Bootloader merging
- # ------------------------------------------------------------------------------
-
- $(COMBO_BIN): $(TARGET_HEX) $(BOOTLOADER_HEX)
- cat $(TARGET_HEX) $(BOOTLOADER_HEX) | \
- awk -f stmlib/programming/merge_hex.awk > $(COMBO_HEX)
- $(OBJCOPY) -I ihex -O binary $(COMBO_HEX) $(COMBO_BIN)
-
-
- # ------------------------------------------------------------------------------
- # Firmware flashing
- # ------------------------------------------------------------------------------
-
- BASE_JTAG_CMD = openocd \
- -f $(OPENOCD_INTERFACE_SCRIPT) \
- -f $(OPENOCD_TARGET_SCRIPT) \
- -c "init" -c "halt" -c "sleep 200"
-
- POSTLUDE = -c "sleep 200" -c "reset run" -c "shutdown"
-
- upload: $(UPLOAD_COMMAND)
-
- image_serial:
- python $(STM32LOADER_PATH)stm32loader.py \
- -p $(PGM_SERIAL_PORT) \
- -b $(PGM_SERIAL_BAUD_RATE) \
- -r -l 131072 image.bin
-
- upload_serial: $(TARGET_BIN)
- python $(STM32LOADER_PATH)stm32loader.py \
- -p $(PGM_SERIAL_PORT) \
- -b $(PGM_SERIAL_BAUD_RATE) \
- -e $(PGM_SERIAL_VERIFY) \
- -a $(BASE_ADDRESS) \
- -w $(TARGET_BIN)
-
- upload_serial_no_erase: $(TARGET_BIN)
- python $(STM32LOADER_PATH)stm32loader.py \
- -p $(PGM_SERIAL_PORT) \
- -b $(PGM_SERIAL_BAUD_RATE) $(PGM_SERIAL_VERIFY)\
- -a $(BASE_ADDRESS) \
- -w $(TARGET_BIN)
-
- upload_combo_serial: $(COMBO_BIN)
- python $(STM32LOADER_PATH)stm32loader.py \
- -p $(PGM_SERIAL_PORT) \
- -b $(PGM_SERIAL_BAUD_RATE) \
- -e $(PGM_SERIAL_VERIFY) \
- -w $(COMBO_BIN)
-
- upload_combo_serial_no_erase: $(COMBO_BIN)
- python $(STM32LOADER_PATH)stm32loader.py \
- -p $(PGM_SERIAL_PORT) \
- -b $(PGM_SERIAL_BAUD_RATE) $(PGM_SERIAL_VERIFY)\
- -w $(COMBO_BIN)
-
- image_jtag:
- $(BASE_JTAG_CMD) \
- -c "dump_image image.bin 0x08000000 131072" \
- $(POSTLUDE)
-
- image_jtag_256k:
- $(BASE_JTAG_CMD) \
- -c "dump_image image.bin 0x08000000 262144" \
- $(POSTLUDE)
-
- image_jtag_1M:
- $(BASE_JTAG_CMD) \
- -c "dump_image image.bin 0x08000000 1048576" \
- $(POSTLUDE)
-
- debug_server: $(TARGET_BIN)
- openocd \
- -f $(OPENOCD_INTERFACE_SCRIPT) \
- -f $(OPENOCD_TARGET_SCRIPT) \
- -c "init" \
- -c "reset" \
- -c "halt"
-
- debug_client:
- $(DB) --eval-command="target remote localhost:3333" $(TARGET_ELF)
-
- erase_jtag:
- $(BASE_JTAG_CMD) \
- -c "stm32f4x unlock 0" \
- -f $(OPENOCD_SCRIPTS_PATH)erase_$(FAMILY).cfg \
- $(POSTLUDE)
-
- upload_jtag: $(TARGET_BIN)
- $(BASE_JTAG_CMD) \
- -f $(OPENOCD_SCRIPTS_PATH)erase_$(FAMILY).cfg \
- -c "flash write_bank 0 $(TARGET_BIN) 0x0" \
- -c "verify_image $(TARGET_BIN)" \
- $(POSTLUDE)
-
- upload_combo_jtag: $(COMBO_BIN)
- $(BASE_JTAG_CMD) \
- -f $(OPENOCD_SCRIPTS_PATH)erase_$(FAMILY).cfg \
- -c "flash write_bank 0 $(COMBO_BIN) 0x0" \
- -c "verify_image $(COMBO_BIN)" \
- $(POSTLUDE)
-
- upload_jtag_no_erase: $(TARGET_BIN)
- $(BASE_JTAG_CMD) \
- -c "flash write_image erase $(TARGET_BIN) 0x08000000" \
- -c "verify_image $(TARGET_BIN)" \
- $(POSTLUDE)
-
- upload_combo_jtag_no_erase: $(COMBO_BIN)
- $(BASE_JTAG_CMD) \
- -c "flash write_image erase $(COMBO_BIN) 0x08000000" \
- -c "verify_image $(COMBO_BIN)" \
- $(POSTLUDE)
-
- upload_jtag_erase_first: $(TARGET_BIN)
- $(BASE_JTAG_CMD) \
- -c "flash erase_address 0x08000000 32768" \
- -c "reset halt" \
- -c "flash write_image erase $(TARGET_BIN) 0x08000000" \
- -c "verify_image $(TARGET_BIN)" \
- $(POSTLUDE)
-
- upload_combo_jtag_erase_first: $(COMBO_BIN)
- $(BASE_JTAG_CMD) \
- -c "flash erase_address 0x08000000 32768" \
- -c "reset halt" \
- -c "flash write_image erase $(COMBO_BIN) 0x08000000" \
- -c "verify_image $(COMBO_BIN)" \
- $(POSTLUDE)
-
- # Phony target for killing the system FTDI driver on OS X.
- kill_ftdi:
- sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
-
- reload_ftdi:
- sudo kextload -b com.FTDI.driver.FTDIUSBSerialDriver
-
- .PHONY: upload
-
- .PHONY: image_serial
- .PHONY: upload_serial upload_serial_no_erase
- .PHONY: upload_combo_serial upload_combo_serial_no_erase
-
- .PHONY: image_jtag image_jtag_1M
- .PHONY: erase_jtag
- .PHONY: upload_jtag upload_jtag_no_erase upload_jtag_erase_first
- .PHONY: upload_combo_jtag upload_combo_jtag_no_erase upload_combo_jtag_erase_first
-
- .PHONY: kill_ftdi reload_ftdi
- .PHONY: debug_client debug_server
|