Index: dummyflasher.c |
diff --git a/dummyflasher.c b/dummyflasher.c |
index 473e45e9c3193915206e445147daed0f142117d4..7cdbcdc8a3d7003855d844c62159a93080203402 100644 |
--- a/dummyflasher.c |
+++ b/dummyflasher.c |
@@ -22,6 +22,7 @@ |
#include "flash.h" |
#include "chipdrivers.h" |
#include "programmer.h" |
+#include "flashchips.h" |
/* Remove the #define below if you don't want SPI flash chip emulation. */ |
#define EMULATE_SPI_CHIP 1 |
@@ -37,12 +38,20 @@ |
#endif |
#if EMULATE_CHIP |
+/* The name of variable-size virtual chip. A 4MB flash example: |
+ * flashrom -p dummy:emulate=VIRTUAL-4194304 |
+ */ |
+#define VIRTUAL_CHIP_NAME "VIRTUAL" |
+#endif |
+ |
+#if EMULATE_CHIP |
static uint8_t *flashchip_contents = NULL; |
enum emu_chip { |
EMULATE_NONE, |
EMULATE_ST_M25P10_RES, |
EMULATE_SST_SST25VF040_REMS, |
EMULATE_SST_SST25VF032B, |
+ EMULATE_VIRTUAL, |
Stefan Reinauer
2011/04/01 17:47:06
Since this emulates a Winbond, should it be called
Louis
2011/04/02 01:48:52
My initial attempt is to emulate any size of flash
dhendrix
2011/04/02 23:43:32
SGTM.
Louis
2011/04/07 02:28:14
Done.
|
}; |
static enum emu_chip emu_chip = EMULATE_NONE; |
static char *emu_persistent_image = NULL; |
@@ -156,6 +165,32 @@ int dummy_init(void) |
msg_pdbg("Emulating SST SST25VF032B SPI flash chip (RDID, AAI " |
"write)\n"); |
} |
+ if (!strncmp(tmp, VIRTUAL_CHIP_NAME, strlen(VIRTUAL_CHIP_NAME))) { |
+ char *size_str; |
+ emu_chip = EMULATE_VIRTUAL; |
+ strtok(tmp, "-"); // prefix is discarded. |
+ if (NULL == (size_str = strtok(NULL, "-")) || !*size_str) { |
+ msg_perr("Please specify flash size, " |
+ "example: %s-65536\n", VIRTUAL_CHIP_NAME); |
Stefan Reinauer
2011/04/01 17:47:06
Can we use KB instead of bytes here? 64, 128, 256,
Louis
2011/04/02 01:48:52
This is intentional for
-p dummy:VIRTUAL-`stat
dhendrix
2011/04/02 23:43:32
Good point... if desired, maybe we can add somethi
dhendrix
2011/04/02 23:43:32
I think it would be better to treat size (and pote
Louis
2011/04/07 02:28:14
Done.
Louis
2011/04/07 02:28:14
Done.
|
+ free(tmp); |
+ return 1; |
+ } |
+ emu_chip_size = atoi(size_str); |
+ if (emu_chip_size & (emu_chip_size - 1)) { |
+ msg_perr("Specified flash size is not power of 2.\n"); |
+ free(tmp); |
+ return 1; |
+ } |
+ emu_max_byteprogram_size = 256; |
+ emu_max_aai_size = 0; |
+ emu_jedec_se_size = 4 * 1024; |
+ emu_jedec_be_52_size = 32 * 1024; |
+ emu_jedec_be_d8_size = 64 * 1024; |
+ emu_jedec_ce_60_size = emu_chip_size; |
+ emu_jedec_ce_c7_size = emu_chip_size; |
+ msg_pdbg("Emulating virtual SPI flash chip (size=%d bytes)\n", |
+ emu_chip_size); |
+ } |
#endif |
if (emu_chip == EMULATE_NONE) { |
msg_perr("Invalid chip specified for emulation: %s\n", tmp); |
@@ -305,15 +340,29 @@ static int emulate_spi_chip_response(unsigned int writecnt, unsigned int readcnt |
readarr[1] = 0x44; |
break; |
case JEDEC_RDID: |
- if (emu_chip != EMULATE_SST_SST25VF032B) |
- break; |
- /* Respond with SST_SST25VF032B. */ |
- if (readcnt > 0) |
- readarr[0] = 0xbf; |
- if (readcnt > 1) |
- readarr[1] = 0x25; |
- if (readcnt > 2) |
- readarr[2] = 0x4a; |
+ if (emu_chip == EMULATE_SST_SST25VF032B) { |
+ /* Respond with SST_SST25VF032B. */ |
+ if (readcnt > 0) |
+ readarr[0] = 0xbf; |
+ if (readcnt > 1) |
+ readarr[1] = 0x25; |
+ if (readcnt > 2) |
+ readarr[2] = 0x4a; |
+ } else if (emu_chip == EMULATE_VIRTUAL) { |
+ /* Winbond W25X series flashes are easy to map. |
+ * 128KB -- ID: 0x3011 |
+ * 256KB -- ID: 0x3012 |
+ * : : |
+ * 8192KB -- ID: 0x3017 |
+ * TODO: map more chips in future for other sizes. |
Stefan Reinauer
2011/04/01 17:47:06
Should we make sure we only pass sizes supported b
Louis
2011/04/02 01:48:52
Will refine this to support any size.
On 2011/04/
|
+ */ |
+ uint16_t dev_id = WINBOND_NEX_W25X10; |
+ int size = emu_chip_size >> 17; |
+ for (; size >>= 1; dev_id++); |
+ if (readcnt > 0) readarr[0] = WINBOND_NEX_ID; |
+ if (readcnt > 1) readarr[1] = dev_id >> 8; |
+ if (readcnt > 2) readarr[2] = dev_id & 0xff; |
+ } |
break; |
case JEDEC_RDSR: |
memset(readarr, 0, readcnt); |
@@ -495,6 +544,7 @@ int dummy_spi_send_command(unsigned int writecnt, unsigned int readcnt, |
case EMULATE_ST_M25P10_RES: |
case EMULATE_SST_SST25VF040_REMS: |
case EMULATE_SST_SST25VF032B: |
+ case EMULATE_VIRTUAL: |
if (emulate_spi_chip_response(writecnt, readcnt, writearr, |
readarr)) { |
msg_perr("Invalid command sent to flash chip!\n"); |