flash.mk 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. # Hey Emacs, this is a -*- makefile -*-
  2. ##############################################################################
  3. # Architecture or project specific options
  4. #
  5. # Autodetect teensy loader
  6. ifndef TEENSY_LOADER_CLI
  7. ifneq (, $(shell which teensy-loader-cli 2>/dev/null))
  8. TEENSY_LOADER_CLI ?= teensy-loader-cli
  9. else
  10. TEENSY_LOADER_CLI ?= teensy_loader_cli
  11. endif
  12. endif
  13. define EXEC_TEENSY
  14. $(TEENSY_LOADER_CLI) -mmcu=$(MCU) -w -v $(BUILD_DIR)/$(TARGET).hex
  15. endef
  16. teensy: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
  17. $(call EXEC_TEENSY)
  18. DFU_PROGRAMMER ?= dfu-programmer
  19. GREP ?= grep
  20. define EXEC_DFU
  21. if [ "$(1)" ]; then \
  22. echo "Flashing '$(1)' for EE_HANDS split keyboard support." ;\
  23. fi; \
  24. if ! $(DFU_PROGRAMMER) $(MCU) get bootloader-version >/dev/null 2>/dev/null; then\
  25. printf "$(MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY)" ;\
  26. sleep $(BOOTLOADER_RETRY_TIME) ;\
  27. while ! $(DFU_PROGRAMMER) $(MCU) get bootloader-version >/dev/null 2>/dev/null; do\
  28. printf "." ;\
  29. sleep $(BOOTLOADER_RETRY_TIME) ;\
  30. done ;\
  31. printf "\n" ;\
  32. fi; \
  33. $(DFU_PROGRAMMER) $(MCU) get bootloader-version ;\
  34. if $(DFU_PROGRAMMER) --version 2>&1 | $(GREP) -q 0.7 ; then\
  35. $(DFU_PROGRAMMER) $(MCU) erase --force; \
  36. if [ "$(1)" ]; then \
  37. $(DFU_PROGRAMMER) $(MCU) flash --force --eeprom $(QUANTUM_PATH)/split_common/$(1);\
  38. fi; \
  39. $(DFU_PROGRAMMER) $(MCU) flash --force $(BUILD_DIR)/$(TARGET).hex;\
  40. else \
  41. $(DFU_PROGRAMMER) $(MCU) erase; \
  42. if [ "$(1)" ]; then \
  43. $(DFU_PROGRAMMER) $(MCU) flash-eeprom $(QUANTUM_PATH)/split_common/$(1);\
  44. fi; \
  45. $(DFU_PROGRAMMER) $(MCU) flash $(BUILD_DIR)/$(TARGET).hex;\
  46. fi; \
  47. $(DFU_PROGRAMMER) $(MCU) reset
  48. endef
  49. dfu: $(BUILD_DIR)/$(TARGET).hex cpfirmware check-size
  50. $(call EXEC_DFU)
  51. dfu-start:
  52. $(DFU_PROGRAMMER) $(MCU) reset
  53. $(DFU_PROGRAMMER) $(MCU) start
  54. dfu-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep
  55. if $(DFU_PROGRAMMER) --version 2>&1 | $(GREP) -q 0.7 ; then\
  56. $(DFU_PROGRAMMER) $(MCU) flash --force --eeprom $(BUILD_DIR)/$(TARGET).eep;\
  57. else\
  58. $(DFU_PROGRAMMER) $(MCU) flash-eeprom $(BUILD_DIR)/$(TARGET).eep;\
  59. fi
  60. $(DFU_PROGRAMMER) $(MCU) reset
  61. dfu-split-left: $(BUILD_DIR)/$(TARGET).hex cpfirmware check-size
  62. $(call EXEC_DFU,eeprom-lefthand.eep)
  63. dfu-split-right: $(BUILD_DIR)/$(TARGET).hex cpfirmware check-size
  64. $(call EXEC_DFU,eeprom-righthand.eep)
  65. AVRDUDE_PROGRAMMER ?= avrdude
  66. define EXEC_AVRDUDE
  67. list_devices() { \
  68. if $(GREP) -q -s icrosoft /proc/version; then \
  69. wmic.exe path Win32_SerialPort get DeviceID 2>/dev/null | LANG=C perl -pne 's/COM(\d+)/COM.($$1-1)/e' | sed 's!COM!/dev/ttyS!' | xargs echo -n | sort; \
  70. elif [ "`uname`" = "FreeBSD" ]; then \
  71. ls /dev/tty* | grep -v '\.lock$$' | grep -v '\.init$$'; \
  72. else \
  73. ls /dev/tty*; \
  74. fi; \
  75. }; \
  76. USB= ;\
  77. printf "Waiting for USB serial port - reset your controller now (Ctrl+C to cancel)"; \
  78. TMP1=`mktemp`; \
  79. TMP2=`mktemp`; \
  80. list_devices > $$TMP1; \
  81. while [ -z "$$USB" ]; do \
  82. sleep $(BOOTLOADER_RETRY_TIME); \
  83. printf "."; \
  84. list_devices > $$TMP2; \
  85. USB=`comm -13 $$TMP1 $$TMP2 | $(GREP) -o '/dev/tty.*'`; \
  86. mv $$TMP2 $$TMP1; \
  87. done; \
  88. rm $$TMP1; \
  89. echo ""; \
  90. echo "Device $$USB has appeared; assuming it is the controller."; \
  91. if $(GREP) -q -s 'MINGW\|MSYS\|icrosoft' /proc/version; then \
  92. USB=`echo "$$USB" | LANG=C perl -pne 's/\/dev\/ttyS(\d+)/COM.($$1+1)/e'`; \
  93. echo "Remapped USB port to $$USB"; \
  94. sleep 1; \
  95. else \
  96. printf "Waiting for $$USB to become writable."; \
  97. while [ ! -w "$$USB" ]; do sleep $(BOOTLOADER_RETRY_TIME); printf "."; done; echo ""; \
  98. fi; \
  99. if [ -z "$(1)" ]; then \
  100. $(AVRDUDE_PROGRAMMER) -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex; \
  101. else \
  102. $(AVRDUDE_PROGRAMMER) -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex -U eeprom:w:$(QUANTUM_PATH)/split_common/$(1); \
  103. fi
  104. endef
  105. avrdude: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
  106. $(call EXEC_AVRDUDE)
  107. avrdude-loop: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
  108. while true; do \
  109. $(call EXEC_AVRDUDE) ; \
  110. done
  111. avrdude-split-left: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
  112. $(call EXEC_AVRDUDE,eeprom-lefthand.eep)
  113. avrdude-split-right: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
  114. $(call EXEC_AVRDUDE,eeprom-righthand.eep)
  115. define EXEC_USBASP
  116. if $(AVRDUDE_PROGRAMMER) -p $(AVRDUDE_MCU) -c usbasp 2>&1 | grep -q "could not find USB device with"; then \
  117. printf "$(MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY)" ;\
  118. sleep $(BOOTLOADER_RETRY_TIME) ;\
  119. until $(AVRDUDE_PROGRAMMER) -p $(AVRDUDE_MCU) -c usbasp 2>&1 | (! grep -q "could not find USB device with"); do\
  120. printf "." ;\
  121. sleep $(BOOTLOADER_RETRY_TIME) ;\
  122. done ;\
  123. printf "\n" ;\
  124. fi
  125. $(AVRDUDE_PROGRAMMER) -p $(AVRDUDE_MCU) -c usbasp -U flash:w:$(BUILD_DIR)/$(TARGET).hex
  126. endef
  127. usbasp: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
  128. $(call EXEC_USBASP)
  129. BOOTLOADHID_PROGRAMMER ?= bootloadHID
  130. # bootloadHid executable has no cross platform detect methods
  131. # so keep running bootloadHid if the output contains "The specified device was not found"
  132. define EXEC_BOOTLOADHID
  133. until $(BOOTLOADHID_PROGRAMMER) -r $(BUILD_DIR)/$(TARGET).hex 2>&1 | tee /dev/stderr | grep -v "device was not found"; do\
  134. printf "$(MSG_BOOTLOADER_NOT_FOUND)" ;\
  135. sleep 5 ;\
  136. done
  137. endef
  138. bootloadhid: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
  139. $(call EXEC_BOOTLOADHID)
  140. HID_BOOTLOADER_CLI ?= hid_bootloader_cli
  141. define EXEC_HID_LUFA
  142. $(HID_BOOTLOADER_CLI) -mmcu=$(MCU) -w -v $(BUILD_DIR)/$(TARGET).hex
  143. endef
  144. hid_bootloader: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
  145. $(call EXEC_HID_LUFA)
  146. flash: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
  147. ifneq ($(strip $(PROGRAM_CMD)),)
  148. $(UNSYNC_OUTPUT_CMD) && $(PROGRAM_CMD)
  149. else ifeq ($(strip $(BOOTLOADER)), caterina)
  150. $(UNSYNC_OUTPUT_CMD) && $(call EXEC_AVRDUDE)
  151. else ifeq ($(strip $(BOOTLOADER)), halfkay)
  152. $(UNSYNC_OUTPUT_CMD) && $(call EXEC_TEENSY)
  153. else ifeq (dfu,$(findstring dfu,$(BOOTLOADER)))
  154. $(UNSYNC_OUTPUT_CMD) && $(call EXEC_DFU)
  155. else ifneq (,$(filter $(BOOTLOADER), usbasploader USBasp))
  156. $(UNSYNC_OUTPUT_CMD) && $(call EXEC_USBASP)
  157. else ifneq (,$(filter $(BOOTLOADER), bootloadhid bootloadHID))
  158. $(UNSYNC_OUTPUT_CMD) && $(call EXEC_BOOTLOADHID)
  159. else ifeq ($(strip $(BOOTLOADER)), qmk-hid)
  160. $(UNSYNC_OUTPUT_CMD) && $(call EXEC_HID_LUFA)
  161. else
  162. $(PRINT_OK); $(SILENT) || printf "$(MSG_FLASH_BOOTLOADER)"
  163. endif