#   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  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


#   Workaround for GNU Make < 4.3
#   =============================
#
#   Finalize commands within a $(shell) function with semicolon, e.g.:
#
#           $(shell echo;)


# Shell
SHELL                         := /bin/sh


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


# 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/


# Utilities
LS                            := $(shell command -v ls;)
LS_FLAGS                      := -l
$(if $(strip $(LS)),,         $(error Cannot find ls utility))

CAT                           := $(shell command -v cat;)
CAT_FLAGS                     :=
$(if $(strip $(CAT)),,        $(error Cannot find cat utility))

CUT                           := $(shell command -v cut;)
CUT_FLAGS                     := -d' '
$(if $(strip $(CUT)),,        $(error Cannot find cut utility))

SED                           := $(shell command -v sed;)
SED_FLAGS                     := -E
$(if $(strip $(SED)),,        $(error Cannot find sed utility))

ECHO                          := $(shell command -v echo;)
ECHO_FLAGS                    :=
$(if $(strip $(ECHO)),,       $(error Cannot find echo utility))

SLEEP                         := $(shell command -v sleep;)
SLEEP_FLAGS                   :=
$(if $(strip $(SLEEP)),,      $(error Cannot find sleep utility))

CONNECT                       := $(ROOT_HOST_SRC)connect
CONNECT_FLAGS                 :=
#   No check for `connect`, it will be compiled.

FLASHROM                      := $(shell command -v flashrom;)
FLASHROM_FLAGS                :=
$(if $(strip $(FLASHROM)),,   $(error Cannot find flashrom utility))


# Files
PTR_TTY_PORT                  = $(ROOT_HOST_START)tty_port_pointer
FW2_BOARD_CONFIG              = $(ROOT_FW2_START)board.cfg
FLASHROM_LOG                  := $(ROOT_HOST_START)flashrom.log
CHIP2FILE                     := $(ROOT_HOST_IO)chip2file.txt
FILE2CHIP                     := $(ROOT_HOST_IO)file2chip.txt


# Settings
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
TTY_PORT                      = $(strip\
	$(shell\
		$(LS) $(LS_FLAGS) $(PTR_TTY_PORT)\
		| $(SED) $(SED_FLAGS) -e's/(.*-> )(.*)/\2/' -\
	)\
)


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


# Tinned Cans: KICK2_CONFIG_BAUDRATE
define KICK2_CONFIG_BAUDRATE
$(strip\
	$(MAKE)\
		-C $(<D)\
			config-RS232_$(subst kick2-,,$@)\
	&& $(MAKE)\
		-C $(ROOT_FW2_START)\
			config-baud$(subst kick2-,,$@)\
)
endef


# 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\
	\
	hello\
	help\
	\
	kick2-flashrom-115200-ram\
	kick2-flashrom-57600-ram\
	kick2-flashrom-38400-ram\
	kick2-flashrom-115200-eeprom\
	kick2-flashrom-57600-eeprom\
	kick2-flashrom-38400-eeprom\
	\
	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\
	kick2-connect\
	kick2-230400\
	kick2-115200\
	kick2-57600\
	kick2-38400\
	\
	kick2-reset\
	\
	kick2\
	kick2.eeprom\
	\
	kick2-ram\
	kick2-ram-terminal-230400\
	kick2-ram-terminal-115200\
	kick2-ram-terminal-57600\
	kick2-ram-terminal-38400\
	kick2-eeprom\
	\
	delay-connect\
	connect-230400\
	connect-115200\
	connect-57600\
	connect-38400\
	\
	terminal-230400\
	terminal-115200\
	terminal-57600\
	terminal-38400\
	\
	flashrom-230400\
	flashrom-115200\
	flashrom-57600\
	flashrom-38400\
	\
	clean-config\
	clean


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

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

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

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

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

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

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

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

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

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

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

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

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

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

kick2-connect-38400-ram :\
	kick2-connect\
		kick2-38400\
			kick2\
				kick2-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"\
	&& $(ECHO) $(ECHO_FLAGS) "============="\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Default Goal"\
	&& $(ECHO) $(ECHO_FLAGS) "------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "default"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)Same as kick2-connect-115200-ram, delay-connect, followed by connect-115200; with greeter"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(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) "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) "Firmware2 Actions (‘kick2’)"\
	&& $(ECHO) $(ECHO_FLAGS) "---------------------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "### Ready-Mades kick2-connect"\
	&& $(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) ""\
	&& $(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 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-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) "### Ready-Mades kick2-flashrom"\
	&& $(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) "### Upload"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-ram"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to RAM"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-ram-terminal-230400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to RAM and enter ‘Propeller 1 terminal mode @ 230400 baud’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-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) "kick2-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) "kick2-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) "kick2-eeprom"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)send ‘kick2’ to EEPROM"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-reset"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)reset device (using $(ROOT_FW2_START)Makefile)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "### Compile"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)compile ‘kick2’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "### Configure"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-connect"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure interface to ‘connect’ (default)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-flashrom"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure interface to ‘flashrom’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-230400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure high RS232 baudrate"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-115200"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure standard RS232 baudrate (default)"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-57600"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure medium RS232 baudrate"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "kick2-38400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)configure low RS232 baudrate"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Utility Actions"\
	&& $(ECHO) $(ECHO_FLAGS) "---------------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "### Invoke ‘connect’"\
	&& $(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) "### Enter ‘Propeller 1 terminal mode’"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "terminal-230400"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)enter ‘Propeller 1 terminal mode’, try RS232 at 230400 baud"\
	&& $(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) "### 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) "Clean"\
	&& $(ECHO) $(ECHO_FLAGS) "-----"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-config"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)reset firmware2 configurations to default values"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)make files and folders clean"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(DONE);

#   configure interface to `flashrom`
kick2-flashrom : $(ROOT_FW2_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			config-flashrom\
	&& $(DONE);

#   configure interface to `connect`
kick2-connect : $(ROOT_FW2_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			config-connect\
	&& $(DONE);

kick2-230400 : $(ROOT_FW2_SRC)Makefile $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(KICK2_CONFIG_BAUDRATE)\
	&& $(DONE);

kick2-115200 : $(ROOT_FW2_SRC)Makefile $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(KICK2_CONFIG_BAUDRATE)\
	&& $(DONE);

kick2-57600 : $(ROOT_FW2_SRC)Makefile $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(KICK2_CONFIG_BAUDRATE)\
	&& $(DONE);

kick2-38400 : $(ROOT_FW2_SRC)Makefile $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(KICK2_CONFIG_BAUDRATE)\
	&& $(DONE);

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

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

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

#   send `kick2` to RAM
kick2-ram : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			kick2-ram\
	&& $(DONE);

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

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

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

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

#   reset chipflasher device, trigger up to three times,
#   use firmware2 Makefile
kick2-reset : $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			reset\
	&& $(DONE);

#   start propeller-load terminal, use RS232 at 230400baud
terminal-230400 : $(ROOT_FW2_START)Makefile | $(TTY_PORT)
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			config-baud230400\
	&& $(MAKE)\
		-C $(<D)\
			terminal\
	&& $(DONE);

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

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

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

#   probe with flashrom, use RS232 at 115200baud
flashrom-115200 : | $(TTY_PORT)
	@$(HEADLINE)\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$(TTY_PORT):$(subst flashrom-,,$@)\
		-o $(FLASHROM_LOG)\
		-V\
	&& $(DONE);

#   probe with flashrom, use RS232 at 57600baud
flashrom-57600 : | $(TTY_PORT)
	@$(HEADLINE)\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$(TTY_PORT):$(subst flashrom-,,$@)\
		-o $(FLASHROM_LOG)\
		-V\
	&& $(DONE);

#   probe with flashrom, use RS232 at 38400baud
flashrom-38400 : | $(TTY_PORT)
	@$(HEADLINE)\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$(TTY_PORT):$(subst flashrom-,,$@)\
		-o $(FLASHROM_LOG)\
		-V\
	&& $(DONE);

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

#   delay start of connect in order to match kick2 handshake time window
delay-connect :
	@$(HEADLINE)\
	&& $(SLEEP) $(SLEEP_FLAGS) 10s\
	&& $(DONE);

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

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

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

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

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

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