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.

501 lines
16KB

  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/gcc-arm-none-eabi-5_4-2016q3/
  28. # Supported: arm-usb-ocd, arm-usb-ocd-h, arm-usb-tiny-h, stlink-v2, stlink-v2-1
  29. PGM_INTERFACE ?= stlink-v2-1
  30. # hla for stlink-v2+jtag; hla-swd for stlink-v2+swd; jtag otherwise
  31. PGM_INTERFACE_TYPE ?= hla
  32. PGM_SERIAL_PORT ?= /dev/tty.usbserial-AH02F1B0
  33. PGM_SERIAL_BAUD_RATE ?= 115200
  34. PGM_SERIAL_VERIFY ?= -v
  35. # --- You should not have to modify these --------------------------------------
  36. TOOLCHAIN_BIN = $(TOOLCHAIN_PATH)bin/
  37. STM32_PATH = stmlib/third_party/STM
  38. # --- Do not modify anything below this point ----------------------------------
  39. BUILD_ROOT = build/
  40. BUILD_DIR = $(BUILD_ROOT)$(TARGET)/
  41. CC = $(TOOLCHAIN_BIN)arm-none-eabi-gcc
  42. CXX = $(TOOLCHAIN_BIN)arm-none-eabi-g++
  43. AS = $(TOOLCHAIN_BIN)arm-none-eabi-as
  44. OBJCOPY = $(TOOLCHAIN_BIN)arm-none-eabi-objcopy
  45. DB = $(TOOLCHAIN_BIN)arm-none-eabi-gdb
  46. OBJDUMP = $(TOOLCHAIN_BIN)arm-none-eabi-objdump
  47. AR = $(TOOLCHAIN_BIN)arm-none-eabi-ar
  48. SIZE = $(TOOLCHAIN_BIN)arm-none-eabi-size
  49. NM = $(TOOLCHAIN_BIN)arm-none-eabi-nm
  50. REMOVE = rm -f
  51. CAT = cat
  52. FORMAT_SIZE = | figlet | cowsay -n -f moose
  53. FORMAT_RAMSIZE = | figlet | cowsay -n -f small
  54. STM32LOADER_PATH = stmlib/programming/serial/
  55. OPENOCD_SCRIPTS_PATH = stmlib/programming/jtag/
  56. # ------------------------------------------------------------------------------
  57. # Files and directories for the user code
  58. # ------------------------------------------------------------------------------
  59. VPATH = $(PACKAGES)
  60. CC_FILES = $(notdir $(wildcard $(patsubst %,%/*.cc,$(PACKAGES))))
  61. C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(PACKAGES))))
  62. AS_FILES = $(notdir $(wildcard $(patsubst %,%/*.s,$(PACKAGES))))
  63. TARGET_BIN = $(BUILD_DIR)$(TARGET).bin
  64. TARGET_ELF = $(BUILD_DIR)$(TARGET).elf
  65. TARGET_HEX = $(BUILD_DIR)$(TARGET).hex
  66. COMBO_HEX = $(BUILD_DIR)$(TARGET)_bootloader_combo.hex
  67. COMBO_BIN = $(BUILD_DIR)$(TARGET)_bootloader_combo.bin
  68. BOOTLOADER_HEX = $(BUILD_ROOT)$(BOOTLOADER)/$(BOOTLOADER).hex
  69. TARGET_SIZE = $(BUILD_DIR)$(TARGET).size
  70. TARGETS = $(BUILD_DIR)$(TARGET).*
  71. # ------------------------------------------------------------------------------
  72. # Platform specific flags
  73. # ------------------------------------------------------------------------------
  74. MCU ?= STM32F40_41xxx
  75. ifeq ($(FAMILY),f4xx)
  76. MODEL_DEFINE = $(MCU) -DSTM32F4XX -DARM_MATH_CM4 -D__FPU_PRESENT
  77. STARTUP_OBJ = $(BUILD_DIR)startup_stm32f4xx.o
  78. LINKER_SCRIPT ?= stmlib/linker_scripts/stm32f4xx_flash$(LD_SUFFIX).ld
  79. FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F4xx_StdPeriph_Driver
  80. ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 \
  81. -mthumb-interwork -funroll-loops
  82. ARCH_DEFINE = GCC_ARMCM4
  83. else ifeq ($(FAMILY),f37x)
  84. MODEL_DEFINE = STM32F37X -DARM_MATH_CM4 -D__FPU_PRESENT
  85. STARTUP_OBJ = $(BUILD_DIR)startup_stm32f37x.o
  86. LINKER_SCRIPT = stmlib/linker_scripts/stm32f373x_flash$(LD_SUFFIX).ld
  87. FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F37x_StdPeriph_Driver
  88. ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb-interwork -funroll-loops
  89. ARCH_DEFINE = GCC_ARMCM4
  90. else ifeq ($(FAMILY),f30x)
  91. MODEL_DEFINE = STM32F30X -DARM_MATH_CM4 -D__FPU_PRESENT
  92. STARTUP_OBJ = $(BUILD_DIR)startup_stm32f30x.o
  93. LINKER_SCRIPT = stmlib/linker_scripts/stm32f373x_flash$(LD_SUFFIX).ld
  94. FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F30x_StdPeriph_Driver
  95. ARCHFLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb-interwork -funroll-loops
  96. ARCH_DEFINE = GCC_ARMCM4
  97. else
  98. ifeq ($(DENSITY),hd)
  99. MODEL_DEFINE = STM32F10X_HD -D STM32F10X
  100. else ifeq ($(DENSITY),md)
  101. MODEL_DEFINE = STM32F10X_MD -D STM32F10X
  102. else
  103. MODEL_DEFINE = STM32F10X_CL -D STM32F10X
  104. endif
  105. STARTUP_OBJ = $(BUILD_DIR)startup_stm32f10x_$(DENSITY).o
  106. LINKER_SCRIPT ?= stmlib/linker_scripts/stm32f10x_flash_$(DENSITY)$(LD_SUFFIX).ld
  107. FW_STDDRIVER_DIR = $(STM32_PATH)/STM32F10x_StdPeriph_Driver
  108. ARCHFLAGS = -mcpu=cortex-m3 -mthumb -fno-unroll-loops
  109. ARCH_DEFINE = GCC_ARMCM3
  110. endif
  111. ifeq ($(APPLICATION),TRUE)
  112. APPLICATION_DEFINE = -DAPPLICATION
  113. LD_SUFFIX = _application
  114. BASE_ADDRESS = 0x08004000
  115. else ifeq ($(APPLICATION_SMALL),TRUE)
  116. APPLICATION_DEFINE = -DAPPLICATION
  117. LD_SUFFIX = _application_small
  118. BASE_ADDRESS = 0x08001000
  119. else ifeq ($(APPLICATION_LARGE),TRUE)
  120. APPLICATION_DEFINE = -DAPPLICATION
  121. LD_SUFFIX = _application_large
  122. BASE_ADDRESS = 0x08008000
  123. else
  124. APPLICATION_DEFINE = -DNO_APPLICATION
  125. LD_SUFFIX =
  126. BASE_ADDRESS = 0x08000000
  127. endif
  128. # ------------------------------------------------------------------------------
  129. # Flags for gcc/binutils
  130. # ------------------------------------------------------------------------------
  131. INCFLAGS = \
  132. -I. \
  133. -D$(ARCH_DEFINE) \
  134. -D$(MODEL_DEFINE) \
  135. $(APPLICATION_DEFINE) \
  136. $(PROJECT_CONFIGURATION) \
  137. -DF_CPU=$(F_CPU) \
  138. -DF_CRYSTAL=$(F_CRYSTAL) \
  139. -DSAMPLE_RATE=$(SAMPLE_RATE) \
  140. -DUSE_STDPERIPH_DRIVER \
  141. -D$(SYSCLOCK)=$(F_CPU)
  142. CCFLAGS = \
  143. -g -O2 -Wall -Werror \
  144. -Wno-unused-local-typedefs \
  145. -fasm \
  146. -finline \
  147. -finline-functions \
  148. -finline-functions-called-once \
  149. -ffast-math \
  150. -fdata-sections \
  151. -ffunction-sections \
  152. $(INCFLAGS) \
  153. $(ARCHFLAGS)
  154. CPPFLAGS = -fno-exceptions -fno-rtti
  155. ASFLAGS = $(ARCHFLAGS)
  156. LDFLAGS = \
  157. -Wl,-Map=$(BUILD_DIR)$(TARGET).map \
  158. -Wl,--gc-sections \
  159. -T $(LINKER_SCRIPT) \
  160. $(ARCHFLAGS) \
  161. $(INCFLAGS) \
  162. -L$(STM32_PATH)
  163. # ------------------------------------------------------------------------------
  164. # Files and directories for the system firmware
  165. # ------------------------------------------------------------------------------
  166. FW_BUILD_DIR = $(BUILD_ROOT)stm_firmware/
  167. FW_CORE_DIR = $(STM32_PATH)/CMSIS/CM3_$(FAMILY)
  168. FW_STARTUP_DIR = $(FW_CORE_DIR)/startup/gcc
  169. FW_STDDRIVER_SRCDIR = $(FW_STDDRIVER_DIR)/src
  170. FW_STDDRIVER_INCDIR = $(FW_STDDRIVER_DIR)/inc
  171. FW_USB_DIR = $(STM32_PATH)/STM32_USB-FS-Device_Driver
  172. FW_USB_SRCDIR = $(FW_USB_DIR)/src
  173. FW_USB_INCDIR = $(FW_USB_DIR)/inc
  174. INCFLAGS += -I$(STM32_PATH) -I$(FW_CORE_DIR) -I$(FW_STARTUP_DIR) -I$(FW_STDDRIVER_INCDIR)
  175. VPATH += $(FW_CORE_DIR) $(FW_STARTUP_DIR) $(FW_STDDRIVER_SRCDIR) $(STM32_PATH) $(FW_BUILD_DIR)
  176. CORE_C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(FW_CORE_DIR))))
  177. DRIVERS_C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(FW_STDDRIVER_SRCDIR))))
  178. USB_C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(FW_USB_SRCDIR))))
  179. C_FILES += $(CORE_C_FILES)
  180. C_FILES += $(DRIVERS_C_FILES)
  181. ifeq ($(USB),enabled)
  182. INCFLAGS += -I$(FW_USB_INCDIR)
  183. VPATH += $(FW_USB_SRCDIR)
  184. C_FILES += $(USB_C_FILES)
  185. endif
  186. # ------------------------------------------------------------------------------
  187. # Source compiling and dependency analysis
  188. # ------------------------------------------------------------------------------
  189. $(BUILD_DIR)%.o: %.s
  190. $(CC) -c -x assembler-with-cpp $(ASFLAGS) $< -o $@
  191. $(BUILD_DIR)%.o: %.c
  192. $(CC) -c $(CCFLAGS) -std=c99 $< -o $@
  193. $(BUILD_DIR)%.o: %.cc
  194. $(CXX) -c $(CCFLAGS) $(CPPFLAGS) $< -o $@
  195. $(BUILD_DIR)%.d: %.s
  196. $(CC) -c -x assembler-with-cpp -MM $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o)
  197. $(BUILD_DIR)%.d: %.c
  198. $(CC) -MM $(CCFLAGS) $< -MF $@ -MT $(@:.d=.o)
  199. $(BUILD_DIR)%.d: %.cc
  200. $(CXX) -MM $(CCFLAGS) $(CPPFLAGS) $< -MF $@ -MT $(@:.d=.o)
  201. # ------------------------------------------------------------------------------
  202. # Object file conversion
  203. # ------------------------------------------------------------------------------
  204. $(BUILD_DIR)%.hex: $(BUILD_DIR)%.elf
  205. $(OBJCOPY) -O ihex $< $@
  206. $(BUILD_DIR)%.bin: $(BUILD_DIR)%.elf
  207. $(OBJCOPY) -O binary $< $@
  208. $(BUILD_DIR)%.lss: $(BUILD_DIR)%.elf
  209. $(OBJDUMP) -d -h -S $< > $@
  210. $(BUILD_DIR)%.sym: $(BUILD_DIR)%.elf
  211. $(NM) -n $< > $@
  212. # ------------------------------------------------------------------------------
  213. # What to build
  214. # ------------------------------------------------------------------------------
  215. OBJ_FILES = $(CC_FILES:.cc=.o) $(C_FILES:.c=.o) $(AS_FILES:.s=.o)
  216. OBJS = $(patsubst %,$(BUILD_DIR)%,$(OBJ_FILES)) $(STARTUP_OBJ)
  217. DEPS = $(OBJS:.o=.d)
  218. all: $(BUILD_DIR) $(TARGET_HEX)
  219. # ------------------------------------------------------------------------------
  220. # Resources
  221. # ------------------------------------------------------------------------------
  222. RESOURCE_COMPILER = stmlib/tools/resources_compiler.py
  223. resources: $(TARGET)/resources.cc
  224. $(TARGET)/resources.cc: $(wildcard $(RESOURCES)/*.py)
  225. SAMPLE_RATE=$(SAMPLE_RATE) \
  226. python2.7 $(RESOURCE_COMPILER) $(RESOURCES)/resources.py
  227. # ------------------------------------------------------------------------------
  228. # Main rules
  229. # ------------------------------------------------------------------------------
  230. $(BUILD_DIR):
  231. mkdir -p $(BUILD_DIR)
  232. $(TARGET_ELF): $(OBJS) $(LINKER_SCRIPT)
  233. $(CC) $(LDFLAGS) -o $(TARGET_ELF) $(OBJS)
  234. bin: $(TARGET_BIN)
  235. hex: $(TARGET_HEX)
  236. clean:
  237. $(REMOVE) $(OBJS) $(TARGETS) $(DEPS)
  238. depends: $(DEPS)
  239. $(TARGET_SIZE): $(TARGET_ELF)
  240. $(SIZE) $(TARGET_ELF) > $(TARGET_SIZE)
  241. $(BUILD_DIR)$(TARGET).top_symbols: $(TARGET_ELF)
  242. $(NM) $(TARGET_ELF) --size-sort -C -f bsd -r > $@
  243. size: $(TARGET_SIZE)
  244. cat $(TARGET_SIZE) | awk '{ print $$1+$$2 }' | tail -n1 $(FORMAT_SIZE)
  245. ramsize: $(TARGET_SIZE)
  246. cat $(TARGET_SIZE) | awk '{ print $$2+$$3 }' | tail -n1 $(FORMAT_RAMSIZE)
  247. disassemble: build/$(TARGET)/$(TARGET).lss build/$(TARGET)/$(TARGET).top_symbols
  248. .PHONY: all bin clean depends resources
  249. # ------------------------------------------------------------------------------
  250. # Bootloader merging
  251. # ------------------------------------------------------------------------------
  252. $(COMBO_BIN): $(TARGET_HEX) $(BOOTLOADER_HEX)
  253. cat $(TARGET_HEX) $(BOOTLOADER_HEX) | \
  254. awk -f stmlib/programming/merge_hex.awk > $(COMBO_HEX)
  255. $(OBJCOPY) -I ihex -O binary $(COMBO_HEX) $(COMBO_BIN)
  256. # ------------------------------------------------------------------------------
  257. # Firmware flashing
  258. # ------------------------------------------------------------------------------
  259. upload: $(UPLOAD_COMMAND)
  260. image_serial:
  261. python2.7 $(STM32LOADER_PATH)stm32loader.py \
  262. -p $(PGM_SERIAL_PORT) \
  263. -b $(PGM_SERIAL_BAUD_RATE) \
  264. -r -l 131072 image.bin
  265. upload_serial: $(TARGET_BIN)
  266. python2.7 $(STM32LOADER_PATH)stm32loader.py \
  267. -p $(PGM_SERIAL_PORT) \
  268. -b $(PGM_SERIAL_BAUD_RATE) \
  269. -e $(PGM_SERIAL_VERIFY) \
  270. -a $(BASE_ADDRESS) \
  271. -w $(TARGET_BIN)
  272. upload_serial_no_erase: $(TARGET_BIN)
  273. python2.7 $(STM32LOADER_PATH)stm32loader.py \
  274. -p $(PGM_SERIAL_PORT) \
  275. -b $(PGM_SERIAL_BAUD_RATE) $(PGM_SERIAL_VERIFY)\
  276. -a $(BASE_ADDRESS) \
  277. -w $(TARGET_BIN)
  278. upload_combo_serial: $(COMBO_BIN)
  279. python2.7 $(STM32LOADER_PATH)stm32loader.py \
  280. -p $(PGM_SERIAL_PORT) \
  281. -b $(PGM_SERIAL_BAUD_RATE) \
  282. -e $(PGM_SERIAL_VERIFY) \
  283. -w $(COMBO_BIN)
  284. upload_combo_serial_no_erase: $(COMBO_BIN)
  285. python2.7 $(STM32LOADER_PATH)stm32loader.py \
  286. -p $(PGM_SERIAL_PORT) \
  287. -b $(PGM_SERIAL_BAUD_RATE) $(PGM_SERIAL_VERIFY)\
  288. -w $(COMBO_BIN)
  289. BASE_JTAG_CMD = openocd \
  290. -f $(OPENOCD_SCRIPTS_PATH)interface_$(PGM_INTERFACE).cfg \
  291. -f $(OPENOCD_SCRIPTS_PATH)stm32$(FAMILY)_$(PGM_INTERFACE_TYPE).cfg \
  292. -f $(OPENOCD_SCRIPTS_PATH)prelude_$(FAMILY).cfg \
  293. ERASE_JTAG_CMD = $(BASE_JTAG_CMD) \
  294. -f $(OPENOCD_SCRIPTS_PATH)erase_$(FAMILY).cfg \
  295. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  296. UPLOAD_JTAG_CMD = $(BASE_JTAG_CMD) \
  297. -f $(OPENOCD_SCRIPTS_PATH)erase_$(FAMILY).cfg \
  298. -c "flash write_bank 0 $(TARGET_BIN) 0x0" \
  299. -c "verify_image $(TARGET_BIN)" \
  300. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  301. UPLOAD_JTAG_COMBO_CMD = $(BASE_JTAG_CMD) \
  302. -f $(OPENOCD_SCRIPTS_PATH)erase_$(FAMILY).cfg \
  303. -c "flash write_bank 0 $(COMBO_BIN) 0x0" \
  304. -c "verify_image $(COMBO_BIN)" \
  305. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  306. UPLOAD_JTAG_NO_ERASE_CMD = $(BASE_JTAG_CMD) \
  307. -c "flash write_image erase $(TARGET_BIN) 0x08000000" \
  308. -c "verify_image $(TARGET_BIN)" \
  309. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  310. UPLOAD_JTAG_COMBO_NO_ERASE_CMD = $(BASE_JTAG_CMD) \
  311. -c "flash write_image erase $(COMBO_BIN) 0x08000000" \
  312. -c "verify_image $(COMBO_BIN)" \
  313. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  314. UPLOAD_JTAG_ERASE_FIRST_CMD = $(BASE_JTAG_CMD) \
  315. -c "flash erase_address 0x08000000 16384" \
  316. -c "reset" \
  317. -c "flash write_image erase $(TARGET_BIN) 0x08000000" \
  318. -c "verify_image $(TARGET_BIN)" \
  319. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  320. UPLOAD_JTAG_COMBO_ERASE_FIRST_CMD = $(BASE_JTAG_CMD) \
  321. -c "flash erase_address 0x08000000 16384" \
  322. -c "reset" \
  323. -c "flash write_image erase $(COMBO_BIN) 0x08000000" \
  324. -c "verify_image $(COMBO_BIN)" \
  325. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  326. image_jtag:
  327. $(BASE_JTAG_CMD) \
  328. -c "dump_image image.bin 0x08000000 131072" \
  329. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  330. image_jtag_256k:
  331. $(BASE_JTAG_CMD) \
  332. -c "dump_image image.bin 0x08000000 262144" \
  333. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  334. image_jtag_1M:
  335. $(BASE_JTAG_CMD) \
  336. -c "dump_image image.bin 0x08000000 1048576" \
  337. -f $(OPENOCD_SCRIPTS_PATH)postlude.cfg
  338. debug_server: $(TARGET_BIN)
  339. openocd \
  340. -f $(OPENOCD_SCRIPTS_PATH)interface_$(PGM_INTERFACE).cfg \
  341. -f $(OPENOCD_SCRIPTS_PATH)stm32$(FAMILY)_$(PGM_INTERFACE_TYPE).cfg \
  342. -c "init" \
  343. -c "reset" \
  344. -c "halt"
  345. debug_client:
  346. $(DB) --eval-command="target remote localhost:3333" $(TARGET_ELF)
  347. # Because of a weird OpenOCD bug, this command sometimes fails with an
  348. # "Error: error executing stm32x flash write algorithm" error. Retrying
  349. # immediately always solves it.
  350. erase_jtag:
  351. $(ERASE_JTAG_CMD)
  352. upload_jtag: $(TARGET_BIN)
  353. $(UPLOAD_JTAG_CMD)
  354. upload_combo_jtag: $(COMBO_BIN)
  355. $(UPLOAD_JTAG_COMBO_CMD)
  356. upload_jtag_no_erase: $(TARGET_BIN)
  357. $(UPLOAD_JTAG_NO_ERASE_CMD)
  358. upload_combo_jtag_no_erase: $(COMBO_BIN)
  359. $(UPLOAD_JTAG_COMBO_NO_ERASE_CMD)
  360. upload_jtag_erase_first: $(TARGET_BIN)
  361. $(UPLOAD_JTAG_ERASE_FIRST_CMD)
  362. upload_combo_jtag_erase_first: $(COMBO_BIN)
  363. $(UPLOAD_JTAG_COMBO_ERASE_FIRST_CMD)
  364. # Phony target for killing the system FTDI driver on OS X.
  365. kill_ftdi:
  366. sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
  367. reload_ftdi:
  368. sudo kextload -b com.FTDI.driver.FTDIUSBSerialDriver
  369. .PHONY: upload
  370. .PHONY: image_serial
  371. .PHONY: upload_serial upload_serial_no_erase
  372. .PHONY: upload_combo_serial upload_combo_serial_no_erase
  373. .PHONY: image_jtag image_jtag_1M
  374. .PHONY: erase_jtag
  375. .PHONY: upload_jtag upload_jtag_no_erase upload_jtag_erase_first
  376. .PHONY: upload_combo_jtag upload_combo_jtag_no_erase upload_combo_jtag_erase_first
  377. .PHONY: kill_ftdi reload_ftdi
  378. .PHONY: debug_client debug_server
  379. ifneq ($(MAKECMDGOALS),clean)
  380. -include $(DEPS)
  381. endif