You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

493 lines
15KB

  1. # Copyright 2012 Olivier Gillet.
  2. #
  3. # Author: Olivier Gillet (ol.gillet@gmail.com)
  4. #
  5. # Permission is hereby granted, free of charge, to any person obtaining a copy
  6. # of this software and associated documentation files (the "Software"), to deal
  7. # in the Software without restriction, including without limitation the rights
  8. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. # copies of the Software, and to permit persons to whom the Software is
  10. # furnished to do so, subject to the following conditions:
  11. #
  12. # The above copyright notice and this permission notice shall be included in
  13. # all copies or substantial portions of the Software.
  14. #
  15. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. # THE SOFTWARE.
  22. #
  23. # See http://creativecommons.org/licenses/MIT/ for more information.
  24. # ------------------------------------------------------------------------------
  25. # Files and directories
  26. # ------------------------------------------------------------------------------
  27. TOOLCHAIN_PATH ?= /usr/local/arm/
  28. PGM_INTERFACE ?= stlink-v2
  29. # PGM_INTERFACE ?= ftdi/olimex-arm-jtag-swd
  30. # PGM_INTERFACE ?= ftdi/olimex-arm-usb-ocd-h
  31. ifeq ($(PGM_INTERFACE),ftdi/olimex-arm-jtag-swd)
  32. OPENOCD_INTERFACE_SCRIPT ?= interface/ftdi/olimex-arm-usb-ocd-h.cfg -f interface/ftdi/olimex-arm-jtag-swd.cfg
  33. else
  34. OPENOCD_INTERFACE_SCRIPT ?= interface/$(PGM_INTERFACE).cfg
  35. endif
  36. PGM_SERIAL_PORT ?= /dev/ftdi-usbserial
  37. PGM_SERIAL_BAUD_RATE ?= 115200
  38. PGM_SERIAL_VERIFY ?= -v
  39. # --- You should not have to modify these --------------------------------------
  40. TOOLCHAIN_BIN = $(TOOLCHAIN_PATH)bin/
  41. STM32_PATH = stmlib/third_party/STM
  42. # --- Do not modify anything below this point ----------------------------------
  43. BUILD_ROOT = build/
  44. BUILD_DIR = $(BUILD_ROOT)$(TARGET)/
  45. CC = $(TOOLCHAIN_BIN)arm-none-eabi-gcc
  46. CXX = $(TOOLCHAIN_BIN)arm-none-eabi-g++
  47. AS = $(TOOLCHAIN_BIN)arm-none-eabi-as
  48. OBJCOPY = $(TOOLCHAIN_BIN)arm-none-eabi-objcopy
  49. DB = $(TOOLCHAIN_BIN)arm-none-eabi-gdb
  50. OBJDUMP = $(TOOLCHAIN_BIN)arm-none-eabi-objdump
  51. AR = $(TOOLCHAIN_BIN)arm-none-eabi-ar
  52. SIZE = $(TOOLCHAIN_BIN)arm-none-eabi-size
  53. NM = $(TOOLCHAIN_BIN)arm-none-eabi-nm
  54. REMOVE = rm -f
  55. CAT = cat
  56. FORMAT_SIZE = | figlet | cowsay -n -f moose
  57. FORMAT_RAMSIZE = | figlet | cowsay -n -f small
  58. STM32LOADER_PATH = stmlib/programming/serial/
  59. OPENOCD_SCRIPTS_PATH = stmlib/programming/jtag/
  60. # ------------------------------------------------------------------------------
  61. # Files and directories for the user code
  62. # ------------------------------------------------------------------------------
  63. VPATH = $(PACKAGES)
  64. CC_FILES = $(notdir $(wildcard $(patsubst %,%/*.cc,$(PACKAGES))))
  65. C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(PACKAGES))))
  66. AS_FILES = $(notdir $(wildcard $(patsubst %,%/*.s,$(PACKAGES))))
  67. TARGET_BIN = $(BUILD_DIR)$(TARGET).bin
  68. TARGET_ELF = $(BUILD_DIR)$(TARGET).elf
  69. TARGET_HEX = $(BUILD_DIR)$(TARGET).hex
  70. COMBO_HEX = $(BUILD_DIR)$(TARGET)_bootloader_combo.hex
  71. COMBO_BIN = $(BUILD_DIR)$(TARGET)_bootloader_combo.bin
  72. BOOTLOADER_HEX = $(BUILD_ROOT)$(BOOTLOADER)/$(BOOTLOADER).hex
  73. TARGET_SIZE = $(BUILD_DIR)$(TARGET).size
  74. TARGETS = $(BUILD_DIR)$(TARGET).*
  75. DEP_FILE = $(BUILD_DIR)depends.mk
  76. # ------------------------------------------------------------------------------
  77. # Platform specific flags
  78. # ------------------------------------------------------------------------------
  79. ifeq ($(FAMILY),f4xx)
  80. MODEL_DEFINE = STM32F40_41xxx -DSTM32F4XX -DARM_MATH_CM4 -D__FPU_PRESENT
  81. STARTUP_OBJ = $(BUILD_DIR)startup_stm32f4xx.o
  82. LINKER_SCRIPT = stmlib/linker_scripts/stm32f4xx_flash$(LD_SUFFIX).ld
  83. FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F4xx_StdPeriph_Driver
  84. ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb-interwork -funroll-loops
  85. ARCH_DEFINE = GCC_ARMCM4
  86. OPENOCD_TARGET = f4x
  87. else ifeq ($(FAMILY),f37x)
  88. MODEL_DEFINE = STM32F37X -DARM_MATH_CM4 -D__FPU_PRESENT
  89. STARTUP_OBJ = $(BUILD_DIR)startup_stm32f37x.o
  90. LINKER_SCRIPT = stmlib/linker_scripts/stm32f373x_flash$(LD_SUFFIX).ld
  91. FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F37x_StdPeriph_Driver
  92. ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb-interwork -funroll-loops
  93. ARCH_DEFINE = GCC_ARMCM4
  94. OPENOCD_TARGET = f3x
  95. else ifeq ($(FAMILY),f0xx)
  96. MODEL_DEFINE = STM32F0XX
  97. STARTUP_OBJ = $(BUILD_DIR)startup_stm32f0xx.o
  98. LINKER_SCRIPT = stmlib/linker_scripts/stm32f0xx_flash$(LD_SUFFIX).ld
  99. FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F0xx_StdPeriph_Driver
  100. ARCHFLAGS = -mcpu=cortex-m0 -mthumb -mthumb-interwork -funroll-loops
  101. ARCH_DEFINE = GCC_ARMCM0
  102. OPENOCD_TARGET = f0x
  103. else
  104. ifeq ($(DENSITY),hd)
  105. MODEL_DEFINE = STM32F10X_HD
  106. else ifeq ($(DENSITY),md)
  107. MODEL_DEFINE = STM32F10X_MD
  108. else
  109. MODEL_DEFINE = STM32F10X_CL
  110. endif
  111. STARTUP_OBJ = $(BUILD_DIR)startup_stm32f10x_$(DENSITY).o
  112. LINKER_SCRIPT = stmlib/linker_scripts/stm32f10x_flash_$(DENSITY)$(LD_SUFFIX).ld
  113. FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F10x_StdPeriph_Driver
  114. ARCHFLAGS = -mcpu=cortex-m3 -mthumb -fno-unroll-loops
  115. ARCH_DEFINE = GCC_ARMCM3
  116. OPENOCD_TARGET = f1x
  117. endif
  118. ifeq ($(APPLICATION),TRUE)
  119. APPLICATION_DEFINE = -DAPPLICATION
  120. LD_SUFFIX = _application
  121. BASE_ADDRESS = 0x08004000
  122. else ifeq ($(APPLICATION_SMALL),TRUE)
  123. APPLICATION_DEFINE = -DAPPLICATION
  124. LD_SUFFIX = _application_small
  125. BASE_ADDRESS = 0x08001000
  126. else ifeq ($(APPLICATION_LARGE),TRUE)
  127. APPLICATION_DEFINE = -DAPPLICATION
  128. LD_SUFFIX = _application_large
  129. BASE_ADDRESS = 0x08008000
  130. else
  131. APPLICATION_DEFINE = -DNO_APPLICATION
  132. LD_SUFFIX =
  133. BASE_ADDRESS = 0x08000000
  134. endif
  135. OPENOCD_TARGET_SCRIPT ?= target/stm32$(OPENOCD_TARGET).cfg
  136. # ------------------------------------------------------------------------------
  137. # Flags for gcc/binutils
  138. # ------------------------------------------------------------------------------
  139. INCFLAGS = \
  140. -I. \
  141. -D$(ARCH_DEFINE) \
  142. -D$(MODEL_DEFINE) \
  143. $(APPLICATION_DEFINE) \
  144. $(PROJECT_CONFIGURATION) \
  145. -DF_CPU=$(F_CPU) \
  146. -DF_CRYSTAL=$(F_CRYSTAL) \
  147. -DUSE_STDPERIPH_DRIVER \
  148. -D$(SYSCLOCK)=$(F_CPU)
  149. CCFLAGS = \
  150. -g -O2 -Wall -Werror -Wno-unused-local-typedefs \
  151. -fasm \
  152. -finline \
  153. -finline-functions-called-once \
  154. -fdata-sections \
  155. -ffunction-sections \
  156. -fshort-enums \
  157. -fno-move-loop-invariants \
  158. $(INCFLAGS) \
  159. $(ARCHFLAGS)
  160. CPPFLAGS = -fno-exceptions -fno-rtti
  161. ASFLAGS = $(ARCHFLAGS)
  162. LDFLAGS = \
  163. -Wl,-Map=$(BUILD_DIR)$(TARGET).map \
  164. -Wl,--gc-sections \
  165. -T $(LINKER_SCRIPT) \
  166. $(ARCHFLAGS) \
  167. $(INCFLAGS) \
  168. -L$(STM32_PATH)
  169. # ------------------------------------------------------------------------------
  170. # Files and directories for the system firmware
  171. # ------------------------------------------------------------------------------
  172. FW_BUILD_DIR = $(BUILD_ROOT)stm_firmware/
  173. FW_CORE_DIR = $(STM32_PATH)/CMSIS/CM3_$(FAMILY)
  174. FW_STARTUP_DIR = $(FW_CORE_DIR)/startup/gcc
  175. FW_STDDRIVER_SRCDIR = $(FW_STDDRIVER_DIR)/src
  176. FW_STDDRIVER_INCDIR = $(FW_STDDRIVER_DIR)/inc
  177. FW_USB_DIR = $(STM32_PATH)/STM32_USB-FS-Device_Driver
  178. FW_USB_SRCDIR = $(FW_USB_DIR)/src
  179. FW_USB_INCDIR = $(FW_USB_DIR)/inc
  180. INCFLAGS += -I$(STM32_PATH) -I$(FW_CORE_DIR) -I$(FW_STARTUP_DIR) -I$(FW_STDDRIVER_INCDIR)
  181. VPATH += $(FW_CORE_DIR) $(FW_STARTUP_DIR) $(FW_STDDRIVER_SRCDIR) $(STM32_PATH) $(FW_BUILD_DIR)
  182. CORE_C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(FW_CORE_DIR))))
  183. DRIVERS_C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(FW_STDDRIVER_SRCDIR))))
  184. USB_C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(FW_USB_SRCDIR))))
  185. C_FILES += $(CORE_C_FILES)
  186. C_FILES += $(DRIVERS_C_FILES)
  187. ifeq ($(USB),enabled)
  188. INCFLAGS += -I$(FW_USB_INCDIR)
  189. VPATH += $(FW_USB_SRCDIR)
  190. C_FILES += $(USB_C_FILES)
  191. endif
  192. # ------------------------------------------------------------------------------
  193. # Source compiling and dependency analysis
  194. # ------------------------------------------------------------------------------
  195. $(BUILD_DIR)%.o: %.s
  196. $(CC) -c -x assembler-with-cpp $(ASFLAGS) $< -o $@
  197. $(BUILD_DIR)%.o: %.c
  198. $(CC) -c $(CCFLAGS) -std=c99 $< -o $@
  199. $(BUILD_DIR)%.o: %.cc
  200. $(CXX) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
  201. $(BUILD_DIR)%.d: %.s
  202. $(CC) -c -x assembler-with-cpp -MM $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o)
  203. $(BUILD_DIR)%.d: %.c
  204. $(CC) -MM $(CCFLAGS) $< -MF $@ -MT $(@:.d=.o)
  205. $(BUILD_DIR)%.d: %.cc
  206. $(CXX) -MM $(CCFLAGS) $(CPPFLAGS) $< -MF $@ -MT $(@:.d=.o)
  207. # ------------------------------------------------------------------------------
  208. # Object file conversion
  209. # ------------------------------------------------------------------------------
  210. $(BUILD_DIR)%.hex: $(BUILD_DIR)%.elf
  211. $(OBJCOPY) -O ihex $< $@
  212. $(BUILD_DIR)%.bin: $(BUILD_DIR)%.elf
  213. $(OBJCOPY) -O binary $< $@
  214. $(BUILD_DIR)%.lss: $(BUILD_DIR)%.elf
  215. $(OBJDUMP) -d -h -S $< > $@
  216. $(BUILD_DIR)%.sym: $(BUILD_DIR)%.elf
  217. $(NM) -n $< > $@
  218. # ------------------------------------------------------------------------------
  219. # What to build
  220. # ------------------------------------------------------------------------------
  221. OBJ_FILES = $(CC_FILES:.cc=.o) $(C_FILES:.c=.o) $(AS_FILES:.s=.o)
  222. OBJS = $(patsubst %,$(BUILD_DIR)%,$(OBJ_FILES)) $(STARTUP_OBJ)
  223. DEPS = $(OBJS:.o=.d)
  224. all: $(BUILD_DIR) $(TARGET_HEX)
  225. # ------------------------------------------------------------------------------
  226. # Resources
  227. # ------------------------------------------------------------------------------
  228. RESOURCE_COMPILER = stmlib/tools/resources_compiler.py
  229. resources: $(TARGET)/resources.cc
  230. $(TARGET)/resources.cc: $(wildcard $(RESOURCES)/*.py)
  231. python $(RESOURCE_COMPILER) $(RESOURCES)/resources.py
  232. # ------------------------------------------------------------------------------
  233. # Main rules
  234. # ------------------------------------------------------------------------------
  235. $(BUILD_DIR):
  236. mkdir -p $(BUILD_DIR)
  237. $(TARGET_ELF): $(OBJS)
  238. $(CC) $(LDFLAGS) -o $(TARGET_ELF) $(OBJS)
  239. $(DEP_FILE): $(BUILD_DIR) $(DEPS)
  240. cat $(DEPS) > $(DEP_FILE)
  241. bin: $(TARGET_BIN)
  242. hex: $(TARGET_HEX)
  243. clean:
  244. $(REMOVE) $(OBJS) $(TARGETS) $(DEP_FILE) $(DEPS)
  245. depends: $(DEPS)
  246. cat $(DEPS) > $(DEP_FILE)
  247. $(TARGET_SIZE): $(TARGET_ELF)
  248. $(SIZE) $(TARGET_ELF) > $(TARGET_SIZE)
  249. $(BUILD_DIR)$(TARGET).top_symbols: $(TARGET_ELF)
  250. $(NM) $(TARGET_ELF) --size-sort -C -f bsd -r > $@
  251. size: $(TARGET_SIZE)
  252. cat $(TARGET_SIZE) | awk '{ print $$1+$$2 }' | tail -n1 $(FORMAT_SIZE)
  253. ramsize: $(TARGET_SIZE)
  254. cat $(TARGET_SIZE) | awk '{ print $$2+$$3 }' | tail -n1 $(FORMAT_RAMSIZE)
  255. disassemble: build/$(TARGET)/$(TARGET).lss build/$(TARGET)/$(TARGET).top_symbols
  256. .PHONY: all bin clean depends resources
  257. include $(DEP_FILE)
  258. # ------------------------------------------------------------------------------
  259. # Bootloader merging
  260. # ------------------------------------------------------------------------------
  261. $(COMBO_BIN): $(TARGET_HEX) $(BOOTLOADER_HEX)
  262. cat $(TARGET_HEX) $(BOOTLOADER_HEX) | \
  263. awk -f stmlib/programming/merge_hex.awk > $(COMBO_HEX)
  264. $(OBJCOPY) -I ihex -O binary $(COMBO_HEX) $(COMBO_BIN)
  265. # ------------------------------------------------------------------------------
  266. # Firmware flashing
  267. # ------------------------------------------------------------------------------
  268. BASE_JTAG_CMD = openocd \
  269. -f $(OPENOCD_INTERFACE_SCRIPT) \
  270. -f $(OPENOCD_TARGET_SCRIPT) \
  271. -c "init" -c "halt" -c "sleep 200"
  272. POSTLUDE = -c "sleep 200" -c "reset run" -c "shutdown"
  273. upload: $(UPLOAD_COMMAND)
  274. image_serial:
  275. python $(STM32LOADER_PATH)stm32loader.py \
  276. -p $(PGM_SERIAL_PORT) \
  277. -b $(PGM_SERIAL_BAUD_RATE) \
  278. -r -l 131072 image.bin
  279. upload_serial: $(TARGET_BIN)
  280. python $(STM32LOADER_PATH)stm32loader.py \
  281. -p $(PGM_SERIAL_PORT) \
  282. -b $(PGM_SERIAL_BAUD_RATE) \
  283. -e $(PGM_SERIAL_VERIFY) \
  284. -a $(BASE_ADDRESS) \
  285. -w $(TARGET_BIN)
  286. upload_serial_no_erase: $(TARGET_BIN)
  287. python $(STM32LOADER_PATH)stm32loader.py \
  288. -p $(PGM_SERIAL_PORT) \
  289. -b $(PGM_SERIAL_BAUD_RATE) $(PGM_SERIAL_VERIFY)\
  290. -a $(BASE_ADDRESS) \
  291. -w $(TARGET_BIN)
  292. upload_combo_serial: $(COMBO_BIN)
  293. python $(STM32LOADER_PATH)stm32loader.py \
  294. -p $(PGM_SERIAL_PORT) \
  295. -b $(PGM_SERIAL_BAUD_RATE) \
  296. -e $(PGM_SERIAL_VERIFY) \
  297. -w $(COMBO_BIN)
  298. upload_combo_serial_no_erase: $(COMBO_BIN)
  299. python $(STM32LOADER_PATH)stm32loader.py \
  300. -p $(PGM_SERIAL_PORT) \
  301. -b $(PGM_SERIAL_BAUD_RATE) $(PGM_SERIAL_VERIFY)\
  302. -w $(COMBO_BIN)
  303. image_jtag:
  304. $(BASE_JTAG_CMD) \
  305. -c "dump_image image.bin 0x08000000 131072" \
  306. $(POSTLUDE)
  307. image_jtag_256k:
  308. $(BASE_JTAG_CMD) \
  309. -c "dump_image image.bin 0x08000000 262144" \
  310. $(POSTLUDE)
  311. image_jtag_1M:
  312. $(BASE_JTAG_CMD) \
  313. -c "dump_image image.bin 0x08000000 1048576" \
  314. $(POSTLUDE)
  315. debug_server: $(TARGET_BIN)
  316. openocd \
  317. -f $(OPENOCD_INTERFACE_SCRIPT) \
  318. -f $(OPENOCD_TARGET_SCRIPT) \
  319. -c "init" \
  320. -c "reset" \
  321. -c "halt"
  322. debug_client:
  323. $(DB) --eval-command="target remote localhost:3333" $(TARGET_ELF)
  324. erase_jtag:
  325. $(BASE_JTAG_CMD) \
  326. -c "stm32f4x unlock 0" \
  327. -f $(OPENOCD_SCRIPTS_PATH)erase_$(FAMILY).cfg \
  328. $(POSTLUDE)
  329. upload_jtag: $(TARGET_BIN)
  330. $(BASE_JTAG_CMD) \
  331. -f $(OPENOCD_SCRIPTS_PATH)erase_$(FAMILY).cfg \
  332. -c "flash write_bank 0 $(TARGET_BIN) 0x0" \
  333. -c "verify_image $(TARGET_BIN)" \
  334. $(POSTLUDE)
  335. upload_combo_jtag: $(COMBO_BIN)
  336. $(BASE_JTAG_CMD) \
  337. -f $(OPENOCD_SCRIPTS_PATH)erase_$(FAMILY).cfg \
  338. -c "flash write_bank 0 $(COMBO_BIN) 0x0" \
  339. -c "verify_image $(COMBO_BIN)" \
  340. $(POSTLUDE)
  341. upload_jtag_no_erase: $(TARGET_BIN)
  342. $(BASE_JTAG_CMD) \
  343. -c "flash write_image erase $(TARGET_BIN) 0x08000000" \
  344. -c "verify_image $(TARGET_BIN)" \
  345. $(POSTLUDE)
  346. upload_combo_jtag_no_erase: $(COMBO_BIN)
  347. $(BASE_JTAG_CMD) \
  348. -c "flash write_image erase $(COMBO_BIN) 0x08000000" \
  349. -c "verify_image $(COMBO_BIN)" \
  350. $(POSTLUDE)
  351. upload_jtag_erase_first: $(TARGET_BIN)
  352. $(BASE_JTAG_CMD) \
  353. -c "flash erase_address 0x08000000 32768" \
  354. -c "reset halt" \
  355. -c "flash write_image erase $(TARGET_BIN) 0x08000000" \
  356. -c "verify_image $(TARGET_BIN)" \
  357. $(POSTLUDE)
  358. upload_combo_jtag_erase_first: $(COMBO_BIN)
  359. $(BASE_JTAG_CMD) \
  360. -c "flash erase_address 0x08000000 32768" \
  361. -c "reset halt" \
  362. -c "flash write_image erase $(COMBO_BIN) 0x08000000" \
  363. -c "verify_image $(COMBO_BIN)" \
  364. $(POSTLUDE)
  365. # Phony target for killing the system FTDI driver on OS X.
  366. kill_ftdi:
  367. sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
  368. reload_ftdi:
  369. sudo kextload -b com.FTDI.driver.FTDIUSBSerialDriver
  370. .PHONY: upload
  371. .PHONY: image_serial
  372. .PHONY: upload_serial upload_serial_no_erase
  373. .PHONY: upload_combo_serial upload_combo_serial_no_erase
  374. .PHONY: image_jtag image_jtag_1M
  375. .PHONY: erase_jtag
  376. .PHONY: upload_jtag upload_jtag_no_erase upload_jtag_erase_first
  377. .PHONY: upload_combo_jtag upload_combo_jtag_no_erase upload_combo_jtag_erase_first
  378. .PHONY: kill_ftdi reload_ftdi
  379. .PHONY: debug_client debug_server