[flashrom] [PATCH] Let the dummy programmer emulate SPI payload limitations.

Stefan Tauner stefan.tauner at student.tuwien.ac.at
Tue Oct 2 04:32:05 CEST 2012


As long as a programmer's check_trans code does not rely on the previous
invocation of its init function one can trivially set that programmer's
check_trans function instead of the dummy's default one. This allows for
even better testing of the SPI infrastructure code under near realworld
conditions.

FIXME: add other programmers
FIXME: add manpage doc

Signed-off-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>
---
While continuing working on this patch set, i got a little idea.
This is the result and i love it. Refactoring this stuff pays off! :)
NB: This patch might not apply to the previous patch set, preview only.

 dummyflasher.c |   15 ++++++++++++++-
 programmer.h   |    2 ++
 wbsio_spi.c    |    2 +-
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/dummyflasher.c b/dummyflasher.c
index edd5714..d2f277b 100644
--- a/dummyflasher.c
+++ b/dummyflasher.c
@@ -119,7 +119,7 @@ static uint32_t dummy_chip_readl(const struct flashctx *flash,
 static void dummy_chip_readn(const struct flashctx *flash, uint8_t *buf,
 			     const chipaddr addr, size_t len);
 
-static const struct spi_programmer spi_programmer_dummyflasher = {
+static struct spi_programmer spi_programmer_dummyflasher = {
 	.type		= SPI_CONTROLLER_DUMMY,
 	.max_data_read	= MAX_DATA_READ_UNLIMITED,
 	.max_data_write	= MAX_DATA_UNSPECIFIED,
@@ -374,6 +374,19 @@ int dummy_init(void)
 		msg_pdbg("Initial status register is set to 0x%02x.\n",
 			 emu_status);
 	}
+	tmp = extract_programmer_param("spi_prog");
+	if (tmp) {
+		if (!strcmp(tmp, "wbsio")) {
+			spi_programmer_dummyflasher.check_trans = wbsio_spi_check_trans;
+			msg_pdbg("Using SPI payload limitations of the %s programmer.\n", tmp);
+		} else {
+			msg_perr("Error: emulation of a programmer requested, "
+				 "but the programmer could not be parsed \"%s\".\n", tmp);
+			free(tmp);
+			return 1;
+		}
+	}
+	free(tmp);
 #endif
 
 	msg_pdbg("Filling fake flash chip with 0xff, size %i\n", emu_chip_size);
diff --git a/programmer.h b/programmer.h
index a438ec6..aa82c2e 100644
--- a/programmer.h
+++ b/programmer.h
@@ -586,6 +586,8 @@ int mcp6x_spi_init(int want_spi);
 int sb600_probe_spi(struct pci_dev *dev);
 
 /* wbsio_spi.c */
+int wbsio_spi_check_trans(struct flashctx *flash, unsigned int writecnt, unsigned int readcnt,
+				 const unsigned char *writearr);
 int wbsio_check_for_spi(void);
 #endif
 
diff --git a/wbsio_spi.c b/wbsio_spi.c
index 66f9e51..0b15ff5 100644
--- a/wbsio_spi.c
+++ b/wbsio_spi.c
@@ -108,7 +108,7 @@ static uint8_t determine_mode(struct flashctx *flash, unsigned int writecnt, uns
 	return 0;
 }
 
-static int wbsio_spi_check_trans(struct flashctx *flash, unsigned int writecnt, unsigned int readcnt,
+int wbsio_spi_check_trans(struct flashctx *flash, unsigned int writecnt, unsigned int readcnt,
 				 const unsigned char *writearr)
 {
 	if (determine_mode(flash, writecnt, readcnt, writearr) == 0)
-- 
Kind regards, Stefan Tauner





More information about the flashrom mailing list