qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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