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(a)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