#   Zerocat Chipflasher --- Flash free firmware, kick the Management Engine.
#
#   Copyright (C) 2016  kai <kmx@posteo.net>
#   Copyright (C) 2016, 2017, 2018, 2020, 2021, 2022, 2023, 2024, 2025, 2026  Kai Mertens <kmx@posteo.net>
#
#   This file is part of Zerocat Chipflasher.
#
#   Zerocat Chipflasher is free software: you can redistribute it and/or
#   modify it under the terms of the GNU General Public License as
#   published by the Free Software Foundation, either version 3 of the
#   License, or (at your option) any later version.
#
#   Zerocat Chipflasher is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
#   General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with Zerocat Chipflasher.
#   If not, see <http://www.gnu.org/licenses/>.


#   Documentation
#   =============
#
#
#   Brief
#   -----
#
#
#   Upload, start ‘kick2’, the Chipflasher’s new firmware
#
#
#   Usage
#   -----
#
#
#   To get an overview of targets, type:
#
#           make help
#
#   To start ‘connect’, type:
#
#           make connect
#
#   To load ‘kick2’ into RAM and start ‘connect’, type:
#
#           make upload-RAM-connect
#


# Shell
SHELL                         := /bin/sh


# White Space
EMPTY                         :=
SPACE                         := $(EMPTY) $(EMPTY)
COMMA                         := ,
M5                            := xxxxx
TAB1                          := $(SPACE)$(SPACE)$(SPACE)$(SPACE)


# ANSI Color Escape Sequences
FG_DEFAULT                    := "\e[39m"
FG_BLACK                      := "\e[30m"
FG_RED                        := "\e[31m"
FG_GREEN                      := "\e[32m"
FG_YELLOW                     := "\e[33m"
FG_BLUE                       := "\e[34m"
FG_MAGENTA                    := "\e[35m"
FG_CYAN                       := "\e[36m"
FG_DARKGRAY                   := "\e[90m"


# Titles
MAKEFILE_TITLE                := Upload ‘kick2’ to chip flasher’s RAM or EEPROM.
PROJECT_TITLE                 := Zerocat Chipflasher
PROJECT_BRIEF                 := Flash free firmware to BIOS chips, kick the Management Engine.


# Root Paths
ROOT_DOC                      := ../../doc/
ROOT_HOST_START               := ../../host/start/
ROOT_HOST_SRC                 := ../../host/src/
ROOT_FW2_START                := $(EMPTY)
ROOT_FW2_SRC                  := ../src/
ROOT_FW2_IO                   := $(ROOT_FW2_START)


# Tools
CP                            := cp
TOOLS := $(CP)
LN                            := ln
TOOLS += $(LN)
LS                            := ls
TOOLS += $(LS)
RM                            := rm
TOOLS += $(RM)
GIT                           := git
TOOLS += $(GIT)
SED                           := sed
TOOLS += $(SED)
SET                           := set
TOOLS += $(SET)
ECHO                          := echo
TOOLS += $(ECHO)
SLEEP                         := sleep
TOOLS += $(SLEEP)
PRINTF                        := printf
TOOLS += $(PRINTF)
CONNECT                       := $(ROOT_HOST_SRC)connect
#   No check for `connect`, it will be compiled.
FLASHROM                      := flashrom
TOOLS += $(FLASHROM)
PROPLOAD                      := propeller-load
TOOLS += $(PROPLOAD)


# Tool Flags
CP_FLAGS                      :=
LN_FLAGS                      := -sf
LS_FLAGS                      := -l
RM_FLAGS                      := -f
GIT_FLAGS                     :=
SED_FLAGS                     := -E
SET_FLAGS                     := -f
ECHO_FLAGS                    :=
SLEEP_FLAGS                   :=
PRINTF_FLAGS                  :=
CONNECT_FLAGS                 :=
FLASHROM_FLAGS                :=
PROPLOAD_FLAGS                := -i -v -v -v -m


# Tool Check
CHECK=$(if $(strip $(shell command -v $(TOOL))),,$(error $(TOOL) -- No such tool))
$(foreach TOOL,$(TOOLS),$(CHECK))


# Project Numbers
include $(ROOT_DOC)project-numbers.mk


# Files
SPIN_PCB                      := $(ROOT_FW2_SRC)PCB.spin
FLASHROM_LOG                  := $(ROOT_FW2_START)flashrom.log
PORT_CFG_TMPL                 := $(ROOT_FW2_START)port.cfg.tmpl
PORT_CFG                      := $(subst .tmpl,,$(PORT_CFG_TMPL))
BOARD_CFG_TMPL                := $(ROOT_FW2_START)board.cfg.tmpl
BOARD_CFG                     := $(subst .tmpl,,$(BOARD_CFG_TMPL))
CHIP2FILE                     := $(ROOT_FW2_IO)chip2file.txt
FILE2CHIP                     := $(ROOT_FW2_IO)file2chip.txt
KICK2                         := $(ROOT_FW2_SRC)kick2
KICK2_EEPROM                  := $(ROOT_FW2_SRC)kick2.eeprom


# Tinned Cans: GET_TTY_BAUDRATE_SERPROG
define GET_TTY_BAUDRATE_SERPROG
$(strip\
	$(shell\
		$(SED) $(SED_FLAGS)\
			-e '/^#.*define.*_CFG_BAUDRATE_/!d; s/^.*_CFG_BAUDRATE_//;'\
				$(SPIN_PCB);\
	)\
)
endef
# Tinned Cans: GET_TTY_PORT
define GET_TTY_PORT
$(strip\
	$(shell\
		$(SED) $(SED_FLAGS)\
			-e '/^(tty_port|TTY_PORT)/!d; s/^.*=[\t ]*//g;'\
				$(PORT_CFG);\
	)\
)
endef
# Tinned Cans: SET_TTY_PORT ($@ points to port device name)
define SET_TTY_PORT
$(strip\
	$(SED) $(SED_FLAGS)\
		-i -e '/^(tty_port|TTY_PORT)/!d;' -e's,=.*,= /dev/$@,g;'\
			$(PORT_CFG);\
)
endef
# Tinned Cans: GET_TTY_BAUDRATE
define GET_TTY_BAUDRATE
$(strip\
	$(shell\
		$(SED) $(SED_FLAGS)\
			-e '/^baudrate:/!d; s/^.*\:[\t ]*//;'\
				$(BOARD_CFG);\
	)\
)
endef
# Tinned Cans: SET_TTY_BAUDRATE ($@ points to rate value)
define SET_TTY_BAUDRATE
$(strip\
	$(SED) $(SED_FLAGS)\
		-i\
		-e 's/^baudrate/#baudrate/;'\
		-e's/(\#)($(subst config-,baudrate: ,$(@)))$$/\2/;'\
			$(BOARD_CFG)\
)
endef
# Tinned Cans: SET_RESET_LINE ($@ points to signal)
define SET_RESET_LINE
$(strip\
	$(SED) $(SED_FLAGS)\
		-i\
		-e 's/^reset/#reset/;'\
		-e's/(\#)($(subst use-,reset: ,$(@)))$$/\2/;'\
			$(BOARD_CFG)\
)
endef
# Tinned Cans: SET_MEMORY_TYPE ($@ points to port device name)
define SET_MEMORY_TYPE
$(strip\
	$(SED) $(SED_FLAGS)\
		-i\
		-e 's/^memory/#memory/;'\
		-e's/(\#)($(subst use-,memory: ,$(@)))$$/\2/;'\
			$(BOARD_CFG)\
)
endef
# Tinned Cans: GET_MEMORY_TYPE
define GET_MEMORY_TYPE
$(strip\
	$(shell\
		$(SED) $(SED_FLAGS)\
			-e '/^memory:/!d; s/^.*\:[\t ]*//;'\
				$(BOARD_CFG);\
	)\
)
endef


# Tinned Cans: HEADER, HEADLINE, DONE
include $(ROOT_DOC)tinned-headers.mk


# Remove corrupted files
.DELETE_ON_ERROR :


# Suffixes, to be checked for old fashioned suffix rules
.SUFFIXES :


# Intermediate Targets
#~ .INTERMEDIATE :


# Secondary Targets, enable empty list for debugging
#~ .SECONDARY :


# Phony Targets
.PHONY :\
	all\
	\
	hello\
	help\
	\
	ttyS0\
	ttyS1\
	ttyS2\
	ttyS3\
	ttyUSB0\
	ttyUSB1\
	ttyUSB2\
	ttyUSB3\
	\
	use-DTR\
	use-RTS\
	use-RAM\
	use-EEPROM\
	\
	config-230400\
	config-115200\
	config-57600\
	config-38400\
	\
	upload\
	upload-RAM\
	upload-RAM-connect\
	upload-RAM-terminal\
	upload-EEPROM\
	\
	delay\
	reset\
	\
	connect\
	terminal\
	flashrom\
	\
	show-config\
	\
	clean-config\
	clean


# Targets
#   all: same as upload-RAM, with greeter
all : hello upload-RAM
	@$(HEADLINE)\
	&& $(DONE);

#   display greeting
#     provided with all, clean and help
hello :
	@$(HEADER)\
	&& $(DONE);

#   display help information
help : hello
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "List of Goals (‘kick2’)"\
	&& $(ECHO) $(ECHO_FLAGS) "======================="\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "1  Default Goal"\
	&& $(ECHO) $(ECHO_FLAGS) "---------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "all"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)same as upload-RAM, with greeter"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "2  Help"\
	&& $(ECHO) $(ECHO_FLAGS) "-------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "hello"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)greeter"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "help"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)this short overview"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "3  Configure"\
	&& $(ECHO) $(ECHO_FLAGS) "------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "These goals help you to modify ‘$(PORT_CFG)’ and to set the port:"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "ttyS0, ttyS1, ttyS2, ttyS3, "\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)set port to /dev/ttyS0 (default) or /dev/ttyS1..3"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "ttyUSB0, ttyUSB1, ttyUSB2, ttyUSB3"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)set port to /dev/ttyUSB0..3"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "These goals help you to modify ‘$(BOARD_CFG)’ and to set the target memory:"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "use-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Store firmware in RAM and start (default)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "use-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Store firmware in EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "These goals help you to modify ‘$(BOARD_CFG)’ and to set the reset line:"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "use-DTR"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use DTR as reset line (default)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "use-RTS"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RTS as reset line"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "These goals help you to modify ‘$(BOARD_CFG)’ and to set an individual baudrate:"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-230400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)high speed"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-115200"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)standard speed (default)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-57600"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)medium speed"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-38400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)low speed"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "The rate set will be used by the ‘propeller-load’ utility"\
	&& $(ECHO) $(ECHO_FLAGS) "a) to upload the firmware at the given speed,"\
	&& $(ECHO) $(ECHO_FLAGS) "b) to pass the baudrate as an argument to ‘connect’ or ‘flashrom’."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "The firmware itself will not be patched, it should have been compiled with the same rate."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "4  Upload"\
	&& $(ECHO) $(ECHO_FLAGS) "---------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send firmware to EEPROM or free-design RAM, as configured"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "reset"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)reset chip flasher device"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "5  Ready-Mades"\
	&& $(ECHO) $(ECHO_FLAGS) "--------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload-RAM-connect"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to free-design RAM, run, and start ‘connect’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload-RAM-terminal"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to free-design RAM, run, and start terminal mode"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to EEPROM, don't run"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "6  Utilities"\
	&& $(ECHO) $(ECHO_FLAGS) "------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "connect"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)start ‘connect’, the host utility, which will talk to ‘kick2’ stored in EEPROM or free-design RAM"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "terminal"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)reset device, start in terminal mode"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "flashrom"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)invoke ‘flashrom’ without options, just probe chip."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "7  Clean"\
	&& $(ECHO) $(ECHO_FLAGS) "--------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-config"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)restore defaults, keep configuration for port and reset line"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)make files and folders clean, remove configuration files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(DONE);

ttyS0 ttyS1 ttyS2 ttyS3 ttyUSB0 ttyUSB1 ttyUSB2 ttyUSB3 : $(PORT_CFG)
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "Process \`$(<)' ..."\
	&& if [ -e /dev/$(@) ]\
		; then\
			$(PRINTF) $(PRINTF_FLAGS) "%bSuccess:%b \`/dev/$(@)' -- device available\n" $(FG_GREEN) $(FG_DEFAULT)\
			&& $$($(SET_TTY_PORT))\
		; else\
			$(PRINTF) $(PRINTF_FLAGS) "%bFailure:%b \`/dev/$(@)' -- no such device\n" $(FG_RED) $(FG_DEFAULT)\
		; fi\
		&& $(PRINTF) $(PRINTF_FLAGS) "%bHint:%b \`$$( $(SED) $(SED_FLAGS) -e'/^(tty_port|TTY_PORT)/!d;' $<; )'\n" $(FG_CYAN) $(FG_DEFAULT)\
	&& $(ECHO) $(ECHO_FLAGS) "... \`$(<)' processed."\
	&& $(DONE);

use-DTR use-RTS : $(BOARD_CFG)
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "Process \`$(<)' ..."\
	&& $$($(SET_RESET_LINE))\
	&& $(PRINTF) $(PRINTF_FLAGS) "%bHint:%b \`$$( $(SED) $(SED_FLAGS) -e'/^(reset|RESET)/!d;' $<; )'\n" $(FG_CYAN) $(FG_DEFAULT)\
	&& $(ECHO) $(ECHO_FLAGS) "... \`$(<)' processed."\
	&& $(DONE);

use-RAM use-EEPROM : $(BOARD_CFG)
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "Process \`$(<)' ..."\
	&& $$($(SET_MEMORY_TYPE))\
	&& $(PRINTF) $(PRINTF_FLAGS) "%bHint:%b \`$$( $(SED) $(SED_FLAGS) -e'/^(memory|MEMORY)/!d;' $<; )'\n" $(FG_CYAN) $(FG_DEFAULT)\
	&& $(ECHO) $(ECHO_FLAGS) "... \`$(<)' processed."\
	&& $(DONE);

config-230400 config-115200 config-57600 config-38400 : $(BOARD_CFG)
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "Process \`$(<)' ..."\
	&& $$($(SET_TTY_BAUDRATE))\
	&& $(PRINTF) $(PRINTF_FLAGS) "%bHint:%b \`$$( $(SED) $(SED_FLAGS) -e'/^(baudrate|BAUDRATE)/!d;' $<; )'\n" $(FG_CYAN) $(FG_DEFAULT)\
	&& $(ECHO) $(ECHO_FLAGS) "... \`$(<)' processed."\
	&& $(DONE);

#   send kick2 to RAM or EEPROM, according to configuration
MEMORY_TYPE=$(GET_MEMORY_TYPE)
ifeq ($(MEMORY_TYPE),EEPROM)
upload : $(KICK2_EEPROM) $(BOARD_CFG) $(PORT_CFG)
else
upload : $(KICK2) $(BOARD_CFG) $(PORT_CFG)
endif
	@$(HEADLINE)\
	&& memtype="$(MEMORY_TYPE)"\
	&& if [ "$${memtype}" == "EEPROM" ]\
		; then\
			args="-e $(<)"\
		; else\
			args="-r $(<)"\
		; fi\
	&& $(PROPLOAD) $(PROPLOAD_FLAGS)\
		-p $(GET_TTY_PORT)\
		-b $(basename $(BOARD_CFG))\
		$${args}\
	&& $(DONE);

#   send kick2 to RAM and run
upload-RAM : $(KICK2) $(BOARD_CFG) $(PORT_CFG)
	@$(HEADLINE)\
	&& $(PROPLOAD) $(PROPLOAD_FLAGS)\
		-p $(GET_TTY_PORT)\
		-b $(basename $(BOARD_CFG))\
		-r\
			$<\
	&& $(DONE);

#   send kick2 to EEPROM, don't run
upload-EEPROM : $(KICK2_EEPROM) $(BOARD_CFG) $(PORT_CFG)
	-@$(HEADLINE)\
	&& $(PRINTF) $(PRINTF_FLAGS) "%b" $(FG_DARKGRAY)\
	&& $(PROPLOAD) $(PROPLOAD_FLAGS)\
		-p $(GET_TTY_PORT)\
		-b $(basename $(BOARD_CFG))\
		-e\
			$<;
	@$(PRINTF) $(PRINTF_FLAGS) "%b\n" $(FG_DEFAULT)\
	&& $(DONE);

#   send kick2 to RAM, run, and start a propeller-terminal
upload-RAM-terminal : $(KICK2) $(BOARD_CFG) $(PORT_CFG)
	-@$(HEADLINE)\
	&& $(PRINTF) $(PRINTF_FLAGS) "%b" $(FG_DARKGRAY)\
	&& $(PROPLOAD) $(PROPLOAD_FLAGS)\
		-p $(GET_TTY_PORT)\
		-b $(basename $(BOARD_CFG))\
		-r -t -q\
			$<;
	@$(PRINTF) $(PRINTF_FLAGS) "%b\n" $(FG_DEFAULT)\
	&& $(DONE);

#   send kick2 to RAM and start connect
upload-RAM-connect : upload-RAM delay connect
	@$(HEADLINE)\
	&& $(DONE);

#   start connect
connect : $(CONNECT) $(BOARD_CFG) $(PORT_CFG)
	@$(HEADLINE)\
	&& $(CONNECT) $(CONNECT_FLAGS)\
		$(ROOT_FW2_IO)$(CHIP2FILE)\
		$(ROOT_FW2_IO)$(FILE2CHIP)\
		$(GET_TTY_PORT)\
		B$(GET_TTY_BAUDRATE)\
	&& $(DONE);

#   start propeller-load terminal
terminal : $(BOARD_CFG) $(PORT_CFG)
	-@$(HEADLINE)\
	&& $(PRINTF) $(PRINTF_FLAGS) "%b" $(FG_DARKGRAY)\
	&& $(PROPLOAD) $(PROPLOAD_FLAGS)\
		-p $(GET_TTY_PORT)\
		-b $(basename $(BOARD_CFG))\
		-o255,5000\
		-r -t -q;
	@$(PRINTF) $(PRINTF_FLAGS) "%b\n" $(FG_DEFAULT)\
	&& $(DONE);

#   start flashrom with no operation, just probe chip
flashrom : $(PORT_CFG)
	@$(HEADLINE)\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$(GET_TTY_PORT):$(GET_TTY_BAUDRATE_SERPROG)\
		-V\
		-o $(FLASHROM_LOG)\
	&& $(DONE);

#   delay utility invocation
delay :
	@$(HEADLINE)\
	&& $(SLEEP) $(SLEEP_FLAGS) 7s\
	&& $(DONE);

#   reset chip flasher device
reset : $(BOARD_CFG) $(PORT_CFG)
	@$(HEADLINE)\
	&& $(PROPLOAD) $(PROPLOAD_FLAGS)\
		-p $(GET_TTY_PORT)\
		-b $(basename $(BOARD_CFG))\
		-o -r\
	&& $(DONE);

#   port configuration
#     Device /dev/ttyS0 is default value and therefor added as dependency.
$(PORT_CFG) : $(PORT_CFG_TMPL) /dev/ttyS0
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "Process \`$(<)' ..."\
	&& $(CP) $(CP_FLAGS) $< $@\
	&& $(ECHO) $(ECHO_FLAGS) "... \`$(<)' processed."\
	&& $(DONE);

#   upload configuration
$(BOARD_CFG) : $(BOARD_CFG_TMPL)
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "Process \`$(<)' ..."\
	&& $(CP) $(CP_FLAGS) $< $@\
	&& $(ECHO) $(ECHO_FLAGS) "... \`$(<)' processed."\
	&& $(DONE);

#   connect utility
$(CONNECT) :
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(@D)\
			$(@F)\
	&& $(DONE);

show-config : $(BOARD_CFG) $(PORT_CFG)
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Process \`$(<)':"\
	&& $(SED) $(SED_FLAGS) -e '/^baudrate/!d;' -e's,^,* ,;' $(BOARD_CFG)\
	&& $(SED) $(SED_FLAGS) -e '/^memory/!d;' -e's,^,* ,;' $(BOARD_CFG)\
	&& $(SED) $(SED_FLAGS) -e '/^reset/!d;' -e's,^,* ,;' $(BOARD_CFG)\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Process \`$(word 2, $^)':"\
	&& $(SED) $(SED_FLAGS) -e '/^tty_port/!d;' -e's,^,* ,;' $(PORT_CFG)\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(DONE);

clean-config : config-115200
	@$(HEADLINE)\
	&& $(DONE);

clean :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS) $(PORT_CFG)\
	&& $(RM) $(RM_FLAGS) $(BOARD_CFG)\
	&& $(DONE);
