#   Zerocat Chipflasher --- Flash free firmware, kick the Management Engine.
#
#   Copyright (C) 2020, 2021, 2022, 2023, 2024, 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/>.


#   Usage
#   -----
#
#
#   To get an overview of targets, type:
#
#           make -C ../../firmware2/test help


# Shell
SHELL                         := /bin/sh


# White Space
EMPTY                         :=
SPACE                         := $(EMPTY) $(EMPTY)
COMMA                         := ,
HASH                          := $(shell echo '#';)
M5                            := zzzzz
TAB1                          := $(SPACE)$(SPACE)$(SPACE)$(SPACE)


# Titles
MAKEFILE_TITLE                := Test device, firmware and target chip.
PROJECT_TITLE                 := Zerocat Chipflasher: ‘kick2’
PROJECT_BRIEF                 := The second firmware, and its interface to flashrom.
PROJECT_REPO                  := git://zerocat.org/zerocat/projects/chipflasher.git


# Root Paths
ROOT_DOC                      := ../../doc/
ROOT_FW2_START                := ../../firmware2/start/


# Tools
CD                            := cd
TOOLS := $(CD)
RM                            := rm
TOOLS += $(RM)
CAT                           := cat
TOOLS += $(CAT)
GIT                           := git
TOOLS += $(GIT)
SED                           := sed
TOOLS += $(SED)
SET                           := set
TOOLS += $(SET)
DATE                          := date
TOOLS += $(DATE)
DIFF                          := diff
TOOLS += $(DIFF)
ECHO                          := echo
TOOLS += $(ECHO)
GREP                          := grep
TOOLS += $(GREP)
READ                          := read
TOOLS += $(READ)
SLEEP                         := sleep
TOOLS += $(SLEEP)
SORT                          := sort
TOOLS += $(SORT)
UNIQ                          := uniq
TOOLS += $(UNIQ)
WGET                          := wget
TOOLS += $(WGET)
MKTEMP                        := mktemp
TOOLS += $(MKTEMP)
MARKDOWN                      := markdown
TOOLS += $(MARKDOWN)
CONNECT                       := $(ROOT_HOST_SRC)connect
# Do not check, will be compiled
SREC_CAT                      := srec_cat
TOOLS += $(SREC_CAT)
SREC_CMP                      := srec_cmp
TOOLS += $(SREC_CMP)
SREC_INFO                     := srec_info
TOOLS += $(SREC_INFO)
FLASHROM                      := flashrom
TOOLS += $(FLASHROM)


# Tool Flags
CD_FLAGS                      :=
RM_FLAGS                      := -f
CAT_FLAGS                     :=
GIT_FLAGS                     :=
SED_FLAGS                     := -E
SET_FLAGS                     := -f
DATE_FLAGS                    :=
DIFF_FLAGS                    :=
ECHO_FLAGS                    :=
GREP_FLAGS                    :=
READ_FLAGS                    :=
SLEEP_FLAGS                   :=
WGET_FLAGS                    := --page-requisites --convert-links
MKTEMP_FLAGS                  :=
MARKDOWN_FLAGS                :=
CONNECT_FLAGS                 :=
SREC_CAT_FLAGS                :=
SREC_CMP_FLAGS                :=
SREC_INFO_FLAGS               :=
FLASHROM_FLAGS                :=
SORT_FLAGS                    :=
UNIQ_FLAGS                    :=


# 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


# Settings
CONFIG                        := settings.conf
FLASHROM_DEVICE               = $$($(SED) $(SED_FLAGS) -e '/^device=/!d; s/^.*=//;' $(CONFIG);)
FLASHROM_BAUDRATE             = $$($(SED) $(SED_FLAGS) -e '/^baudrate=/!d; s/^.*=//;' $(CONFIG);)
FLASHROM_SPISPEED             = $$($(SED) $(SED_FLAGS) -e '/^spispeed=/!d; s/^.*=//;' $(CONFIG);)


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


# 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\
	\
	config\
	\
	probe\
	probe-chip\
	test-zeros-LF\
	test-zeros-HF\
	test-rand-LF\
	test-rand-HF\
	test-fakeROM\
	\
	clean-test-fakeROM\
	clean-config\
	clean


# Targets
#   Reset skin, generate all documents
all : hello
	@$(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 Targets"\
	&& $(ECHO) $(ECHO_FLAGS) "==============="\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "Prerequisite: The device is up and running."\
	&& $(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)run all targets"\
	&& $(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, provided with targets all, clean and help"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "help"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)list available targets"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "3  Config"\
	&& $(ECHO) $(ECHO_FLAGS) "---------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "config"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)set up configuration file"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "4  Actions"\
	&& $(ECHO) $(ECHO_FLAGS) "----------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "test-zeros-LF"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)flash just zeros with lowest frequency"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "test-zeros-HF"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)flash just zeros with highest frequency"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "test-rand-LF"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)flash random bytes with lowest frequency"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "test-rand-HF"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)flash random bytes with highest frequency"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "test-fakeROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)test READ, VERIFY, ERASE, WRITE and ERASE-WRITE with a fake ROM"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "5  Clean"\
	&& $(ECHO) $(ECHO_FLAGS) "--------"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-test-fakeROM"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove generated, fake ROM and test report"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean-config"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove configuration file"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(ECHO) $(ECHO_FLAGS) "clean"\
	&& $(ECHO) $(ECHO_FLAGS) "$(TAB1)remove all generated files"\
	&& $(ECHO) $(ECHO_FLAGS) ""\
	&& $(DONE);

#   store settings in a file
settings.conf :
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS) "# settings for flashrom" > $@\
	&& $(ECHO) $(ECHO_FLAGS) "" >> $@\
	&& $(ECHO) $(ECHO_FLAGS) "device=$(ROOT_FW2_START)tty_port_pointer" >> $@\
	&& $(READ) $(READ_FLAGS)\
		-p "baudrate: "\
		-r baudrate\
	&& $(ECHO) $(ECHO_FLAGS) "baudrate=$${baudrate}" >> $@\
	&& $(READ) $(READ_FLAGS)\
		-p "spispeed: "\
		-r spispeed\
	&& $(ECHO) $(ECHO_FLAGS) "spispeed=$${spispeed}" >> $@\
	&& $(DONE);

#   retrieve chip info: probe
probe : settings.conf
	-@$(HEADLINE)\
	&& device=$(FLASHROM_DEVICE)\
	&& baudrate=$(FLASHROM_BAUDRATE)\
	&& spispeed=$(FLASHROM_SPISPEED)\
	&& $(ECHO) $(ECHO_FLAGS) "device: $${device}"\
	&& $(ECHO) $(ECHO_FLAGS) "baudrate: $${baudrate}"\
	&& $(ECHO) $(ECHO_FLAGS) "spispeed: $${spispeed}"\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$${device}:$${baudrate},spispeed=$${spispeed}\
	&& $(DONE);

#   dedicated probe
probe-chip : probe
	@$(HEADLINE)\
	&& device=$(FLASHROM_DEVICE)\
	&& baudrate=$(FLASHROM_BAUDRATE)\
	&& spispeed=$(FLASHROM_SPISPEED)\
	&& $(ECHO) $(ECHO_FLAGS) "device: $${device}"\
	&& $(ECHO) $(ECHO_FLAGS) "baudrate: $${baudrate}"\
	&& $(ECHO) $(ECHO_FLAGS) "spispeed: $${spispeed}"\
	&& $(READ) $(READ_FLAGS)\
		-p "chipname: " -r chipname\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$${device}:$${baudrate},spispeed=$${spispeed}\
		-c "$${chipname}"\
	&& $(DONE);

#   test random bytes with high frequency clock
test-rand-HF : probe
	@$(HEADLINE)\
	&& $(READ) $(READ_FLAGS)\
		-p "chipname: " -r chipname\
	&& $(READ) $(READ_FLAGS)\
		-p "chipsize: 0x" -r chipsize\
	&& spispeed=40M\
	&& $(SREC_CAT) $(SREC_CAT_FLAGS)\
		-gen 0x00000000 0x$${chipsize} -rand\
		-o rom-0x$${chipsize}.zero.bin -raw\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$(FLASHROM_DEVICE):$(FLASHROM_BAUDRATE),spispeed=$${spispeed}\
		-V\
		-c "$${chipname}"\
		-w "rom-0x$${chipsize}.rand.bin"\
	&& $(DONE);

#   test random bytes with low frequency clock
test-rand-LF : probe
	@$(HEADLINE)\
	&& $(READ) $(READ_FLAGS)\
		-p "chipname: " -r chipname\
	&& $(READ) $(READ_FLAGS)\
		-p "chipsize: 0x" -r chipsize\
	&& spispeed=3M\
	&& $(SREC_CAT) $(SREC_CAT_FLAGS)\
		-gen 0x00000000 0x$${chipsize} -rand\
		-o rom-0x$${chipsize}.zero.bin -raw\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$(FLASHROM_DEVICE):$(FLASHROM_BAUDRATE),spispeed=$${spispeed}\
		-V\
		-c "$${chipname}"\
		-w "rom-0x$${chipsize}.rand.bin"\
	&& $(DONE);

#   test zeros with high frequency clock
test-zeros-HF : probe
	@$(HEADLINE)\
	&& $(READ) $(READ_FLAGS)\
		-p "chipname: " -r chipname\
	&& $(READ) $(READ_FLAGS)\
		-p "chipsize: 0x" -r chipsize\
	&& spispeed=40M\
	&& $(SREC_CAT) $(SREC_CAT_FLAGS)\
		-gen 0x00000000 0x$${chipsize} -const 0x00\
		-o rom-0x$${chipsize}.zero.bin -raw\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$(FLASHROM_DEVICE):$(FLASHROM_BAUDRATE),spispeed=$${spispeed}\
		-V\
		-c "$${chipname}"\
		-w "rom-0x$${chipsize}.zero.bin"\
	&& $(DONE);

#   test zeros with low frequency clock
test-zeros-LF : probe
	@$(HEADLINE)\
	&& $(READ) $(READ_FLAGS)\
		-p "chipname: " -r chipname\
	&& $(READ) $(READ_FLAGS)\
		-p "chipsize: 0x" -r chipsize\
	&& spispeed=3M\
	&& $(SREC_CAT) $(SREC_CAT_FLAGS)\
		-gen 0x00000000 0x$${chipsize} -const 0x00\
		-o rom-0x$${chipsize}.zero.bin -raw\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=$(FLASHROM_DEVICE):$(FLASHROM_BAUDRATE),spispeed=$${spispeed}\
		-V\
		-c "$${chipname}"\
		-w "rom-0x$${chipsize}.zero.bin"\
	&& $(DONE);

#   test flashrom READ, VERIFY, ERASE, WRITE, ERASE-WRITE with a fake ROM,
#   FIXME: How to redirect error status into log file??
test-fakeROM : probe
	@$(HEADLINE)\
	&& $(ECHO) $(ECHO_FLAGS)\
	&& $(ECHO) $(ECHO_FLAGS) "=== TEST SETUP ==="\
	&& $(READ) $(READ_FLAGS) -p "target: " -r target\
	&& $(READ) $(READ_FLAGS) -p "comment: " -r comment\
	&& $(READ) $(READ_FLAGS) -p "DIPSW 1-6 (e.g. xoooox, or ------): " -r dipsw\
	&& $(READ) $(READ_FLAGS) -p "baudrate: " -r baudrate\
	&& $(READ) $(READ_FLAGS) -p "spispeed: " -r spispeed\
	&& $(READ) $(READ_FLAGS) -p "chipname: " -r chipname\
	&& $(READ) $(READ_FLAGS) -p "chipsize: 0x" -r chipsize\
	&& $(ECHO) $(ECHO_FLAGS)\
	&& {\
		$(ECHO) $(ECHO_FLAGS) "=== TEST FAKE ROM ==="\
		&& $(ECHO) $(ECHO_FLAGS) "Project: $(PROJECT_TITLE)"\
		&& $(ECHO) $(ECHO_FLAGS) "Brief:   $(PROJECT_BRIEF)"\
		&& $(ECHO) $(ECHO_FLAGS) "Branch:  $(PROJECT_BRANCH)"\
		&& $(ECHO) $(ECHO_FLAGS) "Commit:  $(PROJECT_NUMBER)"\
		&& $(DATE) $(DATE_FLAGS);\
	} 2>&1 > $@.txt\
	&& {\
		$(ECHO) $(ECHO_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS) "=== SUMMARY ==="\
		&& $(ECHO) $(ECHO_FLAGS) "target:    $${target}"\
		&& $(ECHO) $(ECHO_FLAGS) "comment:   $${comment}"\
		&& $(ECHO) $(ECHO_FLAGS) "DIPSW 1-6: $${dipsw}"\
		&& $(ECHO) $(ECHO_FLAGS) "baudrate:  $${baudrate}"\
		&& $(ECHO) $(ECHO_FLAGS) "spispeed:  $${spispeed}"\
		&& $(ECHO) $(ECHO_FLAGS) "chipname:  $${chipname}"\
		&& $(ECHO) $(ECHO_FLAGS) "chipsize:  0x$${chipsize}"\
		&& $(ECHO) $(ECHO_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS) "=== FILES ==="\
		&& backup_target="$${target}.backup.bin"\
		&& rom_fake="rom-0x$${chipsize}.fake.bin"\
		&& chunk=$$((0x$${chipsize}/4))\
		&& $(SREC_CAT) $(SREC_CAT_FLAGS)\
			-gen $$((chunk*0)) $$((chunk*1)) -rand\
			-gen $$((chunk*1)) $$((chunk*2)) -const 0x00\
			-gen $$((chunk*2)) $$((chunk*3)) -const 0xff\
			-gen $$((chunk*3)) $$((chunk*4)) -rand\
			-o $${rom_fake} -raw\
		&& $(ECHO) $(ECHO_FLAGS) "$${backup_target}"\
		&& $(ECHO) $(ECHO_FLAGS) "$${rom_fake}"\
		&& $(ECHO) $(ECHO_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS) "=== START OF TEST ==="\
		&& $(DATE) $(DATE_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS) "--- READ ---";\
	} 2>&1 >> $@.txt\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=/dev/ttyS0:$${baudrate},spispeed=$${spispeed}\
		-V\
		-c "$${chipname}"\
		-r "$${backup_target}"\
			2>&1 >> $@.txt\
	&& {\
		$(ECHO) $(ECHO_FLAGS) &&\
		$(ECHO) $(ECHO_FLAGS) "--- VERIFY ---";\
	} 2>&1 >> $@.txt\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=/dev/ttyS0:$${baudrate},spispeed=$${spispeed}\
		-V\
		-c "$${chipname}"\
		-v "$${backup_target}"\
			2>&1 >> $@.txt\
	&& {\
		$(ECHO) $(ECHO_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS) "--- ERASE ---";\
	} 2>&1 >> $@.txt\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=/dev/ttyS0:$${baudrate},spispeed=$${spispeed}\
		-V\
		-c "$${chipname}"\
		-E\
			2>&1 >> $@.txt\
	&& {\
		$(ECHO) $(ECHO_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS) "--- WRITE ---";\
	} 2>&1 >> $@.txt\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=/dev/ttyS0:$${baudrate},spispeed=$${spispeed}\
		-V\
		-c "$${chipname}"\
		-w "$${rom_fake}"\
			2>&1 >> $@.txt\
	&& {\
		$(ECHO) $(ECHO_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS) "--- ERASE/WRITE ---";\
	} 2>&1 >> $@.txt\
	&& $(FLASHROM) $(FLASHROM_FLAGS)\
		-p serprog:dev=/dev/ttyS0:$${baudrate},spispeed=$${spispeed}\
		-V\
		-c "$${chipname}"\
		-w "$${backup_target}"\
			2>&1 >> $@.txt\
	&& {\
		$(ECHO) $(ECHO_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS) "=== END OF TEST ==="\
		&& $(DATE) $(DATE_FLAGS)\
		&& $(ECHO) $(ECHO_FLAGS);\
	} 2>&1 >> $@.txt\
	&& $(DONE);

#   clean generated files
clean-test-fakeROM :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		-f\
		$(wildcard *.fake.bin)\
		test-fakeROM.txt\
	&& $(DONE);

#   config
config : $(CONFIG)
	@$(HEADLINE)\
	&& $(DONE);

#  clean settings
clean-config :
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		-f\
		$(CONFIG)\
	&& $(DONE);

#   clean generated files
clean : hello clean-config clean-test-fakeROM
	@$(HEADLINE)\
	&& $(RM) $(RM_FLAGS)\
		-f\
		$(wildcard rom-*.rand.bin rom-*.zero.bin)\
	&& $(DONE);
