Makefile 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. # Select the board to build for: if not given on the command line,
  2. # then default to PYBV10.
  3. BOARD ?= PYBV10
  4. ifeq ($(wildcard ../boards/$(BOARD)/.),)
  5. $(error Invalid BOARD specified)
  6. endif
  7. # If the build directory is not given, make it reflect the board name.
  8. BUILD ?= build-$(BOARD)
  9. include ../../../py/mkenv.mk
  10. include ../boards/$(BOARD)/mpconfigboard.mk
  11. CMSIS_DIR=$(TOP)/lib/stm32lib/CMSIS/STM32$(MCU_SERIES_UPPER)xx/Include
  12. MCU_SERIES_UPPER = $(shell echo $(MCU_SERIES) | tr '[:lower:]' '[:upper:]')
  13. HAL_DIR=lib/stm32lib/STM32$(MCU_SERIES_UPPER)xx_HAL_Driver
  14. USBDEV_DIR=usbdev
  15. DFU=$(TOP)/tools/dfu.py
  16. PYDFU ?= $(TOP)/tools/pydfu.py
  17. DEVICE=0483:df11
  18. STFLASH ?= st-flash
  19. OPENOCD ?= openocd
  20. OPENOCD_CONFIG ?= boards/openocd_stm32f4.cfg
  21. CROSS_COMPILE = arm-none-eabi-
  22. INC += -I.
  23. INC += -I..
  24. INC += -I$(TOP)
  25. INC += -I$(BUILD)
  26. INC += -I$(TOP)/lib/cmsis/inc
  27. INC += -I$(CMSIS_DIR)/
  28. INC += -I$(TOP)/$(HAL_DIR)/Inc
  29. INC += -I../$(USBDEV_DIR)/core/inc -I../$(USBDEV_DIR)/class/inc
  30. # Basic Cortex-M flags
  31. CFLAGS_CORTEX_M = -mthumb
  32. # Options for particular MCU series
  33. CFLAGS_MCU_f4 = $(CFLAGS_CORTEX_M) -mtune=cortex-m4 -mcpu=cortex-m4
  34. CFLAGS_MCU_f7 = $(CFLAGS_CORTEX_M) -mtune=cortex-m7 -mcpu=cortex-m7
  35. CFLAGS_MCU_l4 = $(CFLAGS_CORTEX_M) -mtune=cortex-m4 -mcpu=cortex-m4
  36. CFLAGS = $(INC) -Wall -Wpointer-arith -Werror -std=gnu99 -nostdlib $(CFLAGS_MOD) $(CFLAGS_EXTRA)
  37. CFLAGS += -D$(CMSIS_MCU)
  38. CFLAGS += $(CFLAGS_MCU_$(MCU_SERIES))
  39. CFLAGS += $(COPT)
  40. CFLAGS += -I../boards/$(BOARD)
  41. CFLAGS += -DSTM32_HAL_H='<stm32$(MCU_SERIES)xx_hal.h>'
  42. CFLAGS += -DBOARD_$(BOARD)
  43. CFLAGS += -DAPPLICATION_ADDR=$(TEXT0_ADDR)
  44. LDFLAGS = -nostdlib -L . -T stm32_generic.ld -Map=$(@:.elf=.map) --cref
  45. LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
  46. # Remove uncalled code from the final image.
  47. CFLAGS += -fdata-sections -ffunction-sections
  48. LDFLAGS += --gc-sections
  49. # Debugging/Optimization
  50. ifeq ($(DEBUG), 1)
  51. CFLAGS += -g -DPENDSV_DEBUG
  52. COPT = -O0
  53. else
  54. COPT += -Os -DNDEBUG
  55. endif
  56. SRC_LIB = $(addprefix lib/,\
  57. libc/string0.c \
  58. )
  59. SRC_C = \
  60. main.c \
  61. drivers/bus/softspi.c \
  62. drivers/bus/softqspi.c \
  63. drivers/memory/spiflash.c \
  64. ports/stm32/i2cslave.c \
  65. ports/stm32/qspi.c \
  66. ports/stm32/flashbdev.c \
  67. ports/stm32/spibdev.c \
  68. ports/stm32/usbd_conf.c \
  69. $(patsubst $(TOP)/%,%,$(wildcard $(TOP)/ports/stm32/boards/$(BOARD)/*.c))
  70. SRC_O = \
  71. ports/stm32/boards/startup_stm32$(MCU_SERIES).o \
  72. ports/stm32/resethandler.o \
  73. SRC_HAL = $(addprefix $(HAL_DIR)/Src/stm32$(MCU_SERIES)xx_,\
  74. hal_cortex.c \
  75. hal_flash.c \
  76. hal_flash_ex.c \
  77. hal_pcd.c \
  78. hal_pcd_ex.c \
  79. ll_usb.c \
  80. )
  81. SRC_USBDEV = $(addprefix ports/stm32/$(USBDEV_DIR)/,\
  82. core/src/usbd_core.c \
  83. core/src/usbd_ctlreq.c \
  84. core/src/usbd_ioreq.c \
  85. )
  86. OBJ =
  87. OBJ += $(addprefix $(BUILD)/, $(SRC_LIB:.c=.o))
  88. OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
  89. OBJ += $(addprefix $(BUILD)/, $(SRC_O))
  90. OBJ += $(addprefix $(BUILD)/, $(SRC_HAL:.c=.o))
  91. OBJ += $(addprefix $(BUILD)/, $(SRC_USBDEV:.c=.o))
  92. all: $(TOP)/lib/stm32lib/README.md $(BUILD)/firmware.dfu $(BUILD)/firmware.hex
  93. # For convenience, automatically fetch required submodules if they don't exist
  94. $(TOP)/lib/stm32lib/README.md:
  95. $(ECHO) "stm32lib submodule not found, fetching it now..."
  96. (cd $(TOP) && git submodule update --init lib/stm32lib)
  97. .PHONY: deploy
  98. deploy: $(BUILD)/firmware.dfu
  99. $(ECHO) "Writing $< to the board"
  100. $(Q)$(PYTHON) $(PYDFU) -u $<
  101. FLASH_ADDR = 0x08000000
  102. $(BUILD)/firmware.dfu: $(BUILD)/firmware.elf
  103. $(ECHO) "Create $@"
  104. $(Q)$(OBJCOPY) -O binary -j .isr_vector -j .text -j .data $^ $(BUILD)/firmware.bin
  105. $(Q)$(PYTHON) $(DFU) -b $(FLASH_ADDR):$(BUILD)/firmware.bin $@
  106. $(BUILD)/firmware.hex: $(BUILD)/firmware.elf
  107. $(ECHO) "Create $@"
  108. $(Q)$(OBJCOPY) -O ihex $< $@
  109. $(BUILD)/firmware.elf: $(OBJ)
  110. $(ECHO) "LINK $@"
  111. $(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
  112. $(Q)$(SIZE) $@
  113. #########################################
  114. vpath %.S . $(TOP)
  115. $(BUILD)/%.o: %.S
  116. $(ECHO) "CC $<"
  117. $(Q)$(CC) $(CFLAGS) -c -o $@ $<
  118. vpath %.s . $(TOP)
  119. $(BUILD)/%.o: %.s
  120. $(ECHO) "AS $<"
  121. $(Q)$(AS) -o $@ $<
  122. define compile_c
  123. $(ECHO) "CC $<"
  124. $(Q)$(CC) $(CFLAGS) -c -MD -o $@ $<
  125. @# The following fixes the dependency file.
  126. @# See http://make.paulandlesley.org/autodep.html for details.
  127. @# Regex adjusted from the above to play better with Windows paths, etc.
  128. @$(CP) $(@:.o=.d) $(@:.o=.P); \
  129. $(SED) -e 's/#.*//' -e 's/^.*: *//' -e 's/ *\\$$//' \
  130. -e '/^$$/ d' -e 's/$$/ :/' < $(@:.o=.d) >> $(@:.o=.P); \
  131. $(RM) -f $(@:.o=.d)
  132. endef
  133. vpath %.c . $(TOP)
  134. $(BUILD)/%.o: %.c
  135. $(call compile_c)
  136. # $(sort $(var)) removes duplicates
  137. #
  138. # The net effect of this, is it causes the objects to depend on the
  139. # object directories (but only for existence), and the object directories
  140. # will be created if they don't exist.
  141. OBJ_DIRS = $(sort $(dir $(OBJ)))
  142. $(OBJ): | $(OBJ_DIRS)
  143. $(OBJ_DIRS):
  144. $(MKDIR) -p $@
  145. clean:
  146. $(RM) -rf $(BUILD) $(CLEAN_EXTRA)
  147. .PHONY: clean
  148. ###########################################
  149. $(BUILD)/main.o: $(BUILD)/genhdr/qstrdefs.generated.h
  150. $(BUILD)/genhdr/qstrdefs.generated.h:
  151. $(MKDIR) -p $(BUILD)/genhdr
  152. $(Q)echo "// empty" > $@
  153. -include $(OBJ:.o=.P)