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