#   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  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 buggy 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                          := \r\t\t\t
TAB2                          := \r\t\t\t\t\t


# Suffixes
.SUFFIXES :


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


# Utilities
WHEREIS                       := $(shell command -v whereis;)
WHEREIS_FLAGS                 := -b
$(if $(strip $(WHEREIS)),,    $(error Cannot find whereis 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                     := -r
$(if $(strip $(SED)),,        $(error Cannot find sed utility))

ECHO                          := $(shell $(WHEREIS) $(WHEREIS_FLAGS) echo | $(CUT) $(CUT_FLAGS) -f2;)
ECHO_FLAGS                    := -e
$(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
TTY_PORT                      = $(ROOT_HOST_START)tty_port_pointer
FW1_BOARD_CONFIG              = $(ROOT_FW1_START)board.cfg
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 Chipflasher Boards
DELAY_KICK_RAM                := 3s


# Tinned Cans
define HEADER
$(strip\
	$(ECHO) $(ECHO_FLAGS)\
		"\n$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)"\
		"\n$(M5) $(PROJECT_TITLE)"\
		"\n$(M5) – $(PROJECT_BRIEF)"\
		"\n$(M5) $(MAKEFILE_TITLE)"\
		"\n$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)$(M5)"\
)
endef
define HEADLINE
$(strip\
	$(ECHO) $(ECHO_FLAGS)\
		"$(M5) Process target “$@” $(M5)$(M5)"\
)
endef
define DONE
$(strip\
	$(ECHO) $(ECHO_FLAGS)\
		"... successfully processed: “$@”"\
		"\n"\
)
endef
define GRANT_KICK_SOME_SECONDS
$(strip\
	$(ECHO) $(ECHO_FLAGS)\
		"Granting ‘kick’ some seconds to get started ..."\
	&& $(SLEEP) $(SLEEP_FLAGS)\
		$(DELAY_KICK_RAM)\
	&& $(ECHO) $(ECHO_FLAGS)\
		"... done."\
)
endef
define KICK2_CONFIG_BAUDRATE
$(strip\
	$(MAKE)\
		-C $(<D)\
			config-baud$(subst kick2-,,$@)\
	&& $(MAKE)\
		-C $(<D)\
			config-RS232_BAUD$(subst kick2-,,$@)\
	&& $(MAKE)\
		-C $(ROOT_FW2_START)\
			config-baud$(subst kick2-,,$@)\
)
endef
define KICK_CONFIG_BAUDRATE
$(strip\
	$(MAKE)\
		-C $(<D)\
			config-baud$(subst kick-,,$@)\
)
endef


# Built-in Special Targets
#~ .SECONDARY :                  # Uncomment for debugging
.PHONY :\
	default\
	\
	kick2-flashrom-115200-eeprom\
	kick2-flashrom-115200-ram\
	kick2-flashrom-57600-eeprom\
	kick2-flashrom-57600-ram\
	kick2-flashrom-38400-eeprom\
	kick2-flashrom-38400-ram\
	\
	kick2-connect-115200-eeprom\
	kick2-connect-115200-ram\
	kick2-connect-57600-eeprom\
	kick2-connect-57600-ram\
	kick2-connect-38400-eeprom\
	kick2-connect-38400-ram\
	\
	kick-v2-connect-115200-eeprom\
	kick-v2-connect-115200-ram\
	kick-v2-connect-57600-eeprom\
	kick-v2-connect-57600-ram\
	kick-v2-connect-38400-eeprom\
	kick-v2-connect-38400-ram\
	\
	kick-v1-connect-115200-eeprom\
	kick-v1-connect-115200-ram\
	kick-v1-connect-57600-eeprom\
	kick-v1-connect-57600-ram\
	kick-v1-connect-38400-eeprom\
	kick-v1-connect-38400-ram\
	\
	hello\
	help\
	\
	kick2-flashrom\
	kick2-connect\
	kick2-115200\
	kick2-57600\
	kick2-38400\
	\
	kick-115200\
	kick-57600\
	kick-38400\
	kick-v2\
	kick-v1\
	\
	reset-kick2\
	reset-kick\
	\
	kick2\
	kick\
	\
	kick2-eeprom\
	kick2-ram\
	kick-eeprom\
	kick-ram\
	\
	connect-115200\
	connect-57600\
	connect-38400\
	\
	flashrom-115200\
	flashrom-57600\
	flashrom-38400\
	\
	clean-config-kick2\
	clean-config-kick\
	clean-config\
	clean


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

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

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

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

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

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

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

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

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

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

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

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

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

kick-v2-connect-115200-eeprom :\
	kick-v2\
		kick-115200\
			kick\
				kick-eeprom\
					clean-config-kick\
						reset-kick
	@$(HEADLINE)\
	&& $(DONE);

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

kick-v2-connect-57600-eeprom :\
	kick-v2\
		kick-57600\
			kick\
				kick-eeprom\
					clean-config-kick\
						reset-kick
	@$(HEADLINE)\
	&& $(DONE);

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

kick-v2-connect-38400-eeprom :\
	kick-v2\
		kick-38400\
			kick\
				kick-eeprom\
					clean-config-kick\
						reset-kick
	@$(HEADLINE)\
	&& $(DONE);

kick-v2-connect-38400-ram :\
	kick-v2\
		kick-38400\
			kick\
				kick-ram\
					clean-config-kick
	@$(HEADLINE)\
	&& $(GRANT_KICK_SOME_SECONDS)\
	&& $(DONE);

kick-v1-connect-115200-eeprom :\
	kick-v1\
		kick-115200\
			kick\
				kick-eeprom\
					clean-config-kick\
						reset-kick
	@$(HEADLINE)\
	&& $(DONE);

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

kick-v1-connect-57600-eeprom :\
	kick-v1\
		kick-57600\
			kick\
				kick-eeprom\
					clean-config-kick\
						reset-kick
	@$(HEADLINE)\
	&& $(DONE);

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

kick-v1-connect-38400-eeprom :\
	kick-v1\
		kick-38400\
			kick\
				kick-eeprom\
					clean-config-kick\
						reset-kick
	@$(HEADLINE)\
	&& $(DONE);

kick-v1-connect-38400-ram :\
	kick-v1\
		kick-38400\
			kick\
				kick-ram\
					clean-config-kick
	@$(HEADLINE)\
	&& $(GRANT_KICK_SOME_SECONDS)\
	&& $(DONE);

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

#   display help information
help : hello
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS)\
		"\nList of Targets"\
		"\n==============="\
		"\n"\
		"\nDefault"\
		"\n-------"\
		"\n"\
		"\ndefault$(TAB2)Same as kick2-connect-115200-ram, followed by connect-115200, with greeter"\
		"\n"\
		"\nHelp"\
		"\n----"\
		"\n"\
		"\nhello$(TAB2)greeter"\
		"\nhelp$(TAB2)provide this help output"\
		"\n"\
		"\nFirmware2 Actions (‘kick2’)"\
		"\n---------------------------"\
		"\n"\
		"\n### Ready-Mades"\
		"\n"\
		"\nkick2-flashrom-115200-eeprom$(TAB2)Send ‘kick2’, build for ‘flashrom’ at 115200baud, to EEPROM."\
		"\n$(TAB2)On ‘board v2’, open DIP switch #4 to match this configuration."\
		"\nkick2-flashrom-115200-ram$(TAB2)Send ‘kick2’, build for ‘flashrom’ at 115200baud, to RAM."\
		"\n$(TAB2)On ‘board v2’, open DIP switch #4 to match this configuration."\
		"\nkick2-flashrom-57600-eeprom$(TAB2)Send ‘kick2’, build for ‘flashrom’ at 57600baud, to EEPROM."\
		"\n$(TAB2)On ‘board v2’, close DIP switch #4 to match this configuration."\
		"\nkick2-flashrom-57600-ram$(TAB2)Send ‘kick2’, build for ‘flashrom’ at 57600baud, to RAM."\
		"\n$(TAB2)On ‘board v2’, close DIP switch #4 to match this configuration."\
		"\nkick2-flashrom-38400-eeprom$(TAB2)Send ‘kick2’, build for ‘flashrom’ at 38400baud, to EEPROM."\
		"\nkick2-flashrom-38400-ram$(TAB2)Send ‘kick2’, build for ‘flashrom’ at 38400baud, to RAM."\
		"\nkick2-connect-115200-eeprom$(TAB2)Send ‘kick2’, build for ‘connect’ at 115200baud, to EEPROM."\
		"\nkick2-connect-115200-ram$(TAB2)Send ‘kick2’, build for ‘connect’ at 115200baud, to RAM."\
		"\nkick2-connect-57600-eeprom$(TAB2)Send ‘kick2’, build for ‘connect’ at 57600baud, to EEPROM."\
		"\nkick2-connect-57600-ram$(TAB2)Send ‘kick2’, build for ‘connect’ at 57600baud, to RAM."\
		"\nkick2-connect-38400-eeprom$(TAB2)Send ‘kick2’, build for ‘connect’ at 38400baud, to EEPROM."\
		"\nkick2-connect-38400-ram$(TAB2)Send ‘kick2’, build for ‘connect’ at 38400baud, to RAM."\
		"\n"\
		"\n### Configure"\
		"\n"\
		"\nkick2-flashrom$(TAB2)configure interface to ‘flashrom’"\
		"\nkick2-connect$(TAB2)configure interface to ‘connect’ (default)"\
		"\nkick2-115200$(TAB2)high speed (default)"\
		"\nkick2-57600$(TAB2)medium speed"\
		"\nkick2-38400$(TAB2)low speed"\
		"\n"\
		"\n### Compile"\
		"\n"\
		"\nkick2$(TAB2)compile ‘kick2’"\
		"\n"\
		"\n### Upload"\
		"\n"\
		"\nkick2-eeprom$(TAB2)send ‘kick2’ to EEPROM"\
		"\nkick2-ram$(TAB2)send ‘kick2’ to RAM"\
		"\nreset-kick2$(TAB2)reset device (using $(ROOT_FW2_START)Makefile)"\
		"\n"\
		"\nFirmware1 Actions (‘kick’)"\
		"\n--------------------------"\
		"\n"\
		"\n### Ready-Mades"\
		"\n"\
		"\nkick-v2-connect-115200-eeprom$(TAB2)Send ‘kick’, build for ‘board v2’ and ‘connect’ at 115200baud, to EEPROM."\
		"\nkick-v2-connect-115200-ram$(TAB2)Send ‘kick’, build for ‘board v2’ and ‘connect’ at 115200baud, to RAM."\
		"\nkick-v2-connect-57600-eeprom$(TAB2)Send ‘kick’, build for ‘board v2’ and ‘connect’ at 57600baud, to EEPROM."\
		"\nkick-v2-connect-57600-ram$(TAB2)Send ‘kick’, build for ‘board v2’ and ‘connect’ at 57600baud, to RAM."\
		"\nkick-v2-connect-38400-eeprom$(TAB2)Send ‘kick’, build for ‘board v2’ and ‘connect’ at 38400baud, to EEPROM."\
		"\nkick-v2-connect-38400-ram$(TAB2)Send ‘kick’, build for ‘board v2’ and ‘connect’ at 38400baud, to RAM."\
		"\nkick-v1-connect-115200-eeprom$(TAB2)Send ‘kick’, build for ‘board v1’ and ‘connect’ at 115200baud, to EEPROM."\
		"\nkick-v1-connect-115200-ram$(TAB2)Send ‘kick’, build for ‘board v1’ and ‘connect’ at 115200baud, to RAM."\
		"\nkick-v1-connect-57600-eeprom$(TAB2)Send ‘kick’, build for ‘board v1’ and ‘connect’ at 57600baud, to EEPROM."\
		"\nkick-v1-connect-57600-ram$(TAB2)Send ‘kick’, build for ‘board v1’ and ‘connect’ at 57600baud, to RAM."\
		"\nkick-v1-connect-38400-eeprom$(TAB2)Send ‘kick’, build for ‘board v1’ and ‘connect’ at 38400baud, to EEPROM."\
		"\nkick-v1-connect-38400-ram$(TAB2)Send ‘kick’, build for ‘board v1’ and ‘connect’ at 38400baud, to RAM."\
		"\n"\
		"\n### Configure"\
		"\n"\
		"\nkick-v2$(TAB2)board v2, e.g. Chipflasher v2"\
		"\nkick-v1$(TAB2)board v1, e.g. Chipflasher board-edition-1"\
		"\n"\
		"\nThese goals will modify ‘$(FW1_BOARD_CONFIG)’,"\
		"\nthe rate set will be used to patch the firmware before upload"\
		"\nand to process the upload at given speed:"\
		"\n"\
		"\nkick-115200$(TAB2)high speed (default)"\
		"\nkick-57600$(TAB2)medium speed"\
		"\nkick-38400$(TAB2)low speed"\
		"\n"\
		"\n### Compile"\
		"\n"\
		"\nkick$(TAB2)compile ‘kick’"\
		"\n"\
		"\n### Upload"\
		"\n"\
		"\nkick-eeprom$(TAB2)send ‘kick’ to EEPROM"\
		"\nkick-ram$(TAB2)send ‘kick’ to RAM"\
		"\nreset-kick$(TAB2)reset device (using $(ROOT_FW1_START)Makefile)"\
		"\n"\
		"\nUtility Actions"\
		"\n---------------"\
		"\n"\
		"\n### Invoke ‘connect’"\
		"\n"\
		"\nconnect-115200$(TAB2)compile and invoke ‘connect’, use RS232 at 115200baud"\
		"\nconnect-57600$(TAB2)compile and invoke ‘connect’, use RS232 at 57600baud"\
		"\nconnect-38400$(TAB2)compile and invoke ‘connect’, use RS232 at 38400baud"\
		"\n"\
		"\n### Invoke ‘flashrom’"\
		"\n"\
		"\nflashrom-115200$(TAB2)invoke ‘flashrom’ for probe, use RS232 at 115200baud"\
		"\nflashrom-57600$(TAB2)invoke ‘flashrom’ for probe, use RS232 at 57600baud"\
		"\nflashrom-38400$(TAB2)invoke ‘flashrom’ for probe, use RS232 at 38400baud"\
		"\n"\
		"\nClean"\
		"\n-----"\
		"\n"\
		"\nclean-config-kick2$(TAB2)reset firmware2 configurations to default values"\
		"\nclean-config-kick$(TAB2)reset firmware1 configurations to default values"\
		"\nclean-config$(TAB2)reset configurations to default values"\
		"\nclean$(TAB2)make files and folders clean"\
		"\n"\
	&& $(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-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)\
			all\
	&& $(DONE);

#   send `kick2` 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);

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

#   configure `kick' for board v2
kick-v2 : $(ROOT_FW1_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			config-BOARD_V2\
	&& $(DONE);

#   configure `kick' for board v1
kick-v1 : $(ROOT_FW1_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			config-BOARD_V1\
	&& $(DONE);

kick-115200 : $(ROOT_FW1_START)Makefile
	@$(HEADLINE)\
	&& $(KICK_CONFIG_BAUDRATE)\
	&& $(DONE);

kick-57600 : $(ROOT_FW1_START)Makefile
	@$(HEADLINE)\
	&& $(KICK_CONFIG_BAUDRATE)\
	&& $(DONE);

kick-38400 : $(ROOT_FW1_START)Makefile
	@$(HEADLINE)\
	&& $(KICK_CONFIG_BAUDRATE)\
	&& $(DONE);

#   compile `kick'
kick : $(ROOT_FW1_SRC)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			all\
	&& $(DONE);

#   send `kick' to EEPROM
kick-eeprom : $(ROOT_FW1_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			kick-eeprom\
	&& $(DONE);

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

#   reset chipflasher device, trigger two times
#   use firmware1 Makefile
reset-kick : $(ROOT_FW1_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			reset\
	&& $(DONE);

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

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

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

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

#   compile and invoke `connect`, use RS232 at 115200baud
connect-115200 : $(ROOT_HOST_SRC)Makefile $(TTY_PORT) $(CONNECT)
	@$(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 $(TTY_PORT) $(CONNECT)
	@$(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 $(TTY_PORT) $(CONNECT)
	@$(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-kick2 : $(ROOT_FW2_SRC)Makefile $(ROOT_FW2_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			clean-config\
	&& $(MAKE)\
		-C $(ROOT_FW2_START)\
			clean-config\
	&& $(DONE);

clean-config-kick : $(ROOT_FW1_SRC)Makefile $(ROOT_FW1_START)Makefile
	@$(HEADLINE)\
	&& $(MAKE)\
		-C $(<D)\
			clean-config\
	&& $(MAKE)\
		-C $(ROOT_FW1_START)\
			clean-config\
	&& $(DONE);

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

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