#   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
#   -----
#
#
#   Operate Chipflasher Boards
#
#
#   Usage
#   -----
#
#   To get an overview of targets, type:
#
#       $ make help


# Shell
SHELL                         := /bin/sh


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


# Titles
PROJECT_TITLE                 := Zerocat Chipflasher
PROJECT_BRIEF                 := Flash free firmware to BIOS chips, kick the Management Engine.
MAKEFILE_TITLE                := Operate chip flasher boards with ‘kick2’, the second firmware


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


# Tools
LS                            := ls
TOOLS := $(LS)
SED                           := sed
TOOLS += $(SED)
ECHO                          := echo
TOOLS += $(ECHO)
CONNECT                       := $(ROOT_HOST_SRC)connect
#   No check for `connect`, it will be compiled.
FLASHROM                      := flashrom
TOOLS += $(FLASHROM)


# Tool Flags
LS_FLAGS                      := -l
SED_FLAGS                     := -E
ECHO_FLAGS                    :=
CONNECT_FLAGS                 :=
FLASHROM_FLAGS                :=


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


# Files
FLASHROM_LOG                  := $(ROOT_HOST_START)flashrom.log
CHIP2FILE                     := $(ROOT_HOST_IO)chip2file.txt
FILE2CHIP                     := $(ROOT_HOST_IO)file2chip.txt
BOARD_CFG                     := $(ROOT_FW2_START)board.cfg
PORT_CFG                      := $(ROOT_FW2_START)port.cfg


# Tinned Cans: GET_TTY_PORT
define GET_TTY_PORT
$(strip\
	$(shell\
		$(SED) $(SED_FLAGS)\
			-e '/^(tty_port|TTY_PORT)/!d; s/^.*=[\t ]*//;'\
				$(PORT_CFG);\
	)\
)
endef
# Tinned Cans: GET_TTY_BAUDRATE
define GET_TTY_BAUDRATE
$(strip\
	$(shell\
		$(SED) $(SED_FLAGS)\
			-e '/^(baudrate|BAUDRATE)/!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 :\
	default\
	default-kick2-connect\
	default-kick2-flashrom\
	\
	hello\
	help\
	\
	kick2-connect-230400-RAM\
	kick2-connect-115200-RAM\
	kick2-connect-57600-RAM\
	kick2-connect-38400-RAM\
	kick2-connect-230400-EEPROM\
	kick2-connect-115200-EEPROM\
	kick2-connect-57600-EEPROM\
	kick2-connect-38400-EEPROM\
	\
	kick2-flashrom-115200-RAM\
	kick2-flashrom-57600-RAM\
	kick2-flashrom-38400-RAM\
	kick2-flashrom-115200-EEPROM\
	kick2-flashrom-57600-EEPROM\
	kick2-flashrom-38400-EEPROM\
	\
	config-connect\
	config-terminal\
	config-flashrom\
	\
	config-230400\
	config-115200\
	config-57600\
	config-38400\
	\
	kick2\
	kick2.eeprom\
	\
	ttyS0\
	ttyS1\
	ttyS2\
	ttyS3\
	ttyUSB0\
	ttyUSB1\
	ttyUSB2\
	ttyUSB3\
	\
	use-DTR\
	use-RTS\
	use-RAM\
	use-EEPROM\
	\
	upload\
	upload-RAM\
	upload-RAM-terminal-115200\
	upload-RAM-terminal-57600\
	upload-RAM-terminal-38400\
	upload-EEPROM\
	\
	delay\
	reset\
	\
	connect\
	connect-230400\
	connect-115200\
	connect-57600\
	connect-38400\
	\
	terminal-115200\
	terminal-57600\
	terminal-38400\
	\
	flashrom-115200\
	flashrom-57600\
	flashrom-38400\
	\
	show-config\
	\
	clean-config\
	clean-kick2\
	clean


# Targets
default : default-kick2-connect
	@$(HEADLINE)\
	&& $(DONE);

default-kick2-connect : hello kick2-connect-115200-RAM delay connect-115200
	@$(HEADLINE)\
	&& $(DONE);

default-kick2-flashrom : hello kick2-flashrom-115200-RAM
	@$(HEADLINE)\
	&& $(DONE);

kick2-flashrom-115200-EEPROM :\
	config-flashrom\
		config-115200\
			kick2.eeprom\
				upload-EEPROM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-flashrom-115200-RAM :\
	config-flashrom\
		config-115200\
			kick2\
				upload-RAM-terminal-115200\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-flashrom-57600-EEPROM :\
	config-flashrom\
		config-57600\
			kick2.eeprom\
				upload-EEPROM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-flashrom-57600-RAM :\
	config-flashrom\
		config-57600\
			kick2\
				upload-RAM-terminal-57600\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-flashrom-38400-EEPROM :\
	config-flashrom\
		config-38400\
			kick2.eeprom\
				upload-EEPROM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-flashrom-38400-RAM :\
	config-flashrom\
		config-38400\
			kick2\
				upload-RAM-terminal-38400\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-connect-230400-EEPROM :\
	config-connect\
		config-230400\
			kick2.eeprom\
				upload-EEPROM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-connect-230400-RAM :\
	config-connect\
		config-230400\
			kick2\
				upload-RAM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-connect-115200-EEPROM :\
	config-connect\
		config-115200\
			kick2.eeprom\
				upload-EEPROM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-connect-115200-RAM :\
	config-connect\
		config-115200\
			kick2\
				upload-RAM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-connect-57600-EEPROM :\
	config-connect\
		config-57600\
			kick2.eeprom\
				upload-EEPROM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-connect-57600-RAM :\
	config-connect\
		config-57600\
			kick2\
				upload-RAM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-connect-38400-EEPROM :\
	config-connect\
		config-38400\
			kick2.eeprom\
				upload-EEPROM\
					clean-config
	@$(HEADLINE)\
	&& $(DONE);

kick2-connect-38400-RAM :\
	config-connect\
		config-38400\
			kick2\
				upload-RAM\
					clean-config
	@$(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 for kick2"\
	&& $(ECHO) $(ECHO_FLAGS) "======================="\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "1  Defaults"\
	&& $(ECHO) $(ECHO_FLAGS) "-----------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "default"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Same as default-kick2-connect"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "default-kick2-connect"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Same as kick2-connect-115200-RAM, delay, followed by connect-115200; with greeter"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v2’, close DIP switch #1 to match this configuration, beforehand!"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v1’, configuration is coded in software to match."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "default-kick2-flashrom"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Same as kick2-flashrom-115200-RAM; with greeter"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v2’, close DIP switch #1 to match this configuration, beforehand!"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v1’, configuration is coded in software to match."\
	&& $(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)provide this help output"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "3  Ready-Mades kick2-connect"\
	&& $(ECHO) $(ECHO_FLAGS) "----------------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-connect-230400-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 230400 baud to send ‘kick2’, build for ‘connect’ at 230400 baud, to RAM, and start device."\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)This goal is fully supported on ‘board-v2.2’ (e.g. “Chipflasher v2.1”) only."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-connect-115200-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 115200 baud and send ‘kick2’, build for ‘connect’ at 57600/115200 baud, to RAM, and start device."\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v2’, select the desired RS232 baudrate to be established at start, beforehand, e.g.: DIP switch #1 closed = 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v1’, the RS232 baudrate to be established at start is coded in software: 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-connect-57600-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 57600 baud to send ‘kick2’, build for ‘connect’ at 57600/115200 baud, to RAM, and start device."\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v2’, select the desired RS232 baudrate to be established at start, beforehand, e.g.: DIP switch #1 open = 57600 baud"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v1’, the RS232 baudrate to be established at start is coded in software: 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-connect-38400-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 38400 baud to send ‘kick2’, build for ‘connect’ at 38400 baud, to RAM, and start device."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-connect-230400-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 230400 baud to send ‘kick2’, build for ‘connect’ at 230400 baud, to EEPROM."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-connect-115200-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 115200 baud to send ‘kick2’, build for ‘connect’ at 57600/115200 baud, to EEPROM."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-connect-57600-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 57600 baud to send ‘kick2’, build for ‘connect’ at 57600/115200 baud, to EEPROM."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-connect-38400-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 38400 baud to send ‘kick2’, build for ‘connect’ at 38400 baud, to EEPROM."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "4  Ready-Mades kick2-flashrom"\
	&& $(ECHO) $(ECHO_FLAGS) "-----------------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-flashrom-115200-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 115200 baud to send ‘kick2’, build for ‘flashrom’ and 57600/115200 baud, to RAM, start device, and enter ‘Propeller 1 terminal mode’ for 115200 baud."\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v2’, select the RS232 baudrate beforehand, e.g.: DIP switch #1 closed = 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v1’, the RS232 baudrate to be established at start is coded in software: 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-flashrom-57600-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 57600baud to send ‘kick2’, build for ‘flashrom’ at 57600/115200 baud, to RAM, start device, and enter ‘Propeller 1 terminal mode’ for 57600 baud."\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v2’, select the RS232 baudrate beforehand, e.g.: DIP switch #1 open = 57600 baud"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v1’, this target does not work as the RS232 baudrate to be established at start is coded in software: 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-flashrom-38400-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 38400 baud to send ‘kick2’, build for ‘flashrom’ at 38400 baud, to RAM, start device, and enter ‘Propeller 1 terminal mode’."\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)On ‘board-v1’, this target does not work as the RS232 baudrate to be established at start is coded in software: 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-flashrom-115200-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 115200 baud to send ‘kick2’, build for ‘flashrom’ at 57600/115200 baud, to EEPROM."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-flashrom-57600-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 57600 baud to send ‘kick2’, build for ‘flashrom’ at 57600/115200 baud, to EEPROM."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-flashrom-38400-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Use RS232 at 38400 baud to send ‘kick2’, build for ‘flashrom’ at 38400 baud, to EEPROM."\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "4  Configure & Compile"\
	&& $(ECHO) $(ECHO_FLAGS) "----------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-connect"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure interface to ‘connect’ (default)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-terminal"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure interface to ‘terminal’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-flashrom"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure interface to ‘flashrom’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-230400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure high RS232 baudrate"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-115200"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure standard RS232 baudrate (default)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-57600"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure medium RS232 baudrate"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config-38400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure low RS232 baudrate"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)compile ‘kick2’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2.eeprom"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)compile ‘kick2’ for EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "5  Upload"\
	&& $(ECHO) $(ECHO_FLAGS) "---------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "ttyS0, ttyS1, ttyS2, ttyS3"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)set tty_port to /dev/ttyS0 (default), /dev/ttyS1, /dev/ttyS2, or /dev/ttyS3"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "ttyUSB0, ttyUSB1, ttyUSB2, ttyUSB3"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)set tty_port to /dev/ttyUSB0, /dev/ttyUSB1, /dev/ttyUSB2, or /dev/ttyUSB3"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "use-DTR"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)use DTR line for reset (default)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "use-RTS"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)use RTS line for reset"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "use-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)use free-design RAM as upload target (default)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "use-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)use EEPROM as upload target"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send firmware to RAM or EEPROM according to configuration"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload-RAM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to RAM"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload-RAM-terminal-115200"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to RAM and enter ‘Propeller 1 terminal mode @ 115200 baud’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload-RAM-terminal-57600"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to RAM and enter ‘Propeller 1 terminal mode @ 57600 baud’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload-RAM-terminal-38400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to RAM and enter ‘Propeller 1 terminal mode @ 38400 baud’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "upload-EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "delay"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)delay utility invocation"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "reset"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)reset device (using $(ROOT_FW2_START)Makefile)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "6  Utility Actions"\
	&& $(ECHO) $(ECHO_FLAGS) "------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "### 6.1  Invoke ‘connect’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "connect"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)compile and invoke ‘connect’ according to configuration"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "connect-230400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)compile and invoke ‘connect’, try RS232 at 230400 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "connect-115200"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)compile and invoke ‘connect’, try RS232 at 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "connect-57600"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)compile and invoke ‘connect’, try RS232 at 57600 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "connect-38400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)compile and invoke ‘connect’, try RS232 at 38400 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "### 6.2  Enter ‘Propeller 1 terminal mode’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "terminal-115200"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)enter ‘Propeller 1 terminal mode’, try RS232 at 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "terminal-57600"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)enter ‘Propeller 1 terminal mode’, try RS232 at 57600 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "terminal-38400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)enter ‘Propeller 1 terminal mode’, try RS232 at 38400 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "### 6.3  Invoke ‘flashrom’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "flashrom-115200"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)invoke ‘flashrom’ for verbose probe, try RS232 at 115200 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "flashrom-57600"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)invoke ‘flashrom’ for verbose probe, try RS232 at 57600 baud"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "flashrom-38400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)invoke ‘flashrom’ for verbose probe, try RS232 at 38400 baud"\
	&& $(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 firmware2 defaults, keep configuration for port and reset line"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-kick2"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)make kick2 build folder clean"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)make files and folders clean, remove configuration files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(DONE);

#   configure tty_port
ttyS0 ttyS1 ttyS2 ttyS3 ttyUSB0 ttyUSB1 ttyUSB2 ttyUSB3 : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(@)\
	&& $(DONE);

#   configure reset line to DTR (default) or RTS
use-DTR use-RTS : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(@)\
	&& $(DONE);

#   configure memory to RAM (default) or EEPROM
use-RAM use-EEPROM : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(@)\
	&& $(DONE);

#   configure kick2 with interface for connect, flashrom or terminal
config-connect config-flashrom config-terminal : $(ROOT_FW2_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(@)\
	&& $(DONE);

#   configure kick2 for 230400, 115200, 57600, or 38400 baud, and configure upload speed
config-230400 config-115200 config-57600 config-38400 : $(ROOT_FW2_SRC)Makefile $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(subst config-,config-RS232_,$@)\
	&& $(MAKE)\
		-C $(ROOT_FW2_START)\
			$(@)\
	&& $(DONE);

#   compile `kick2` or `kick2.eeprom`
kick2 kick2.eeprom : $(ROOT_FW2_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			clean-kick2\
	&& $(MAKE)\
		-C $(<D)\
			$(@)\
	&& $(DONE);

#   send `kick2` to RAM or `kick2.eeprom` to EEPROM
upload upload-RAM upload-EEPROM : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(@)\
	&& $(DONE);

#   send `kick2` to RAM, start terminal mode at 115200, 57600, or 38400 baud, accept exit sequence
upload-RAM-terminal-115200 upload-RAM-terminal-57600 upload-RAM-terminal-38400 : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(subst upload-RAM-terminal-,config-,$(@))\
	&& $(MAKE)\
		-C $(<D)\
			upload-RAM-terminal\
	&& $(DONE);

#   delay: start of connect in order to match kick2 handshake time window
#   reset: reset chip flasher device, use firmware2/start/Makefile
delay reset : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(@)\
	&& $(DONE);

#   compile and invoke `connect` according to configuration
connect : $(BOARD_CFG)
	@$(HEADLINE)\
	&& $(MAKE)\
		connect-$(GET_TTY_BAUDRATE)\
	&& $(DONE);

#   compile and invoke `connect`, use RS232 at 230400 or 115200 or 57600 or 38400 baud
connect-230400 connect-115200 connect-57600 connect-38400 : $(ROOT_HOST_SRC)Makefile $(PORT_CFG)
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			clean\
	&& $(MAKE)\
		-C $(<D)\
			all\
	&& $(CONNECT)\
		$(ROOT_HOST_IO)$(CHIP2FILE)\
		$(ROOT_HOST_IO)$(FILE2CHIP)\
		$(GET_TTY_PORT)\
		$(subst connect-,B,$@)\
	&& $(DONE);

#   start propeller-load terminal, use RS232 at 115200 or 57600 or 38400 baud
terminal-115200 terminal-57600 terminal-38400 : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(subst terminal-,config-,$(@))\
	&& $(MAKE)\
		-C $(<D)\
			terminal\
	&& $(DONE);

#   probe with flashrom, use RS232 at 115200 or 57600 or 38400 baud
flashrom-115200 flashrom-57600 flashrom-38400 : $(PORT_CFG)
	@$(HEADLINE)\
	&& port=$(GET_TTY_PORT)\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p $(subst flashrom-,serprog:dev=$${port}:,$@)\
		-o $(FLASHROM_LOG)\
		-V\
	&& $(DONE);

#   tty port pointer
$(PORT_CFG) : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(@F)\
	&& $(DONE);

#   build connect utility, force build with updated timings
.PHONY : $(CONNECT)
$(CONNECT) : $(ROOT_HOST_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(@D)\
			fast-kick2-timings\
			$(@F)\
	&& $(DONE);

show-config : $(ROOT_FW2_SRC)Makefile $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(ROOT_FW2_SRC)\
			$(@)\
	&& $(MAKE)\
		-C $(ROOT_FW2_START)\
			$(@)\
	&& $(DONE);

clean-config : $(ROOT_FW2_SRC)Makefile $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			$(@)\
	&& $(MAKE)\
		-C $(ROOT_FW2_START)\
			$(@)\
	&& $(DONE);

clean-kick2 : $(ROOT_FW2_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(ROOT_FW2_SRC)\
			$(@)\
	&& $(DONE);

clean : hello $(ROOT_FW2_SRC)Makefile $(ROOT_FW2_START)Makefile $(ROOT_HOST_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(ROOT_FW2_SRC)\
			$(@)\
	&& $(MAKE)\
		-C $(ROOT_FW2_START)\
			$(@)\
	&& $(MAKE)\
		-C $(ROOT_HOST_SRC)\
			$(@)\
	&& $(RM) $(RM_FLAGS)\
		$(FLASHROM_LOG)\
	&& $(DONE);
