This is just a quick hack, that could be expanded. What do you think?

Signed-off-by: Stefan Tauner <[email protected]>
---
 dummyflasher.c |   34 +++++++++++++++++++++++++++++++---
 1 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/dummyflasher.c b/dummyflasher.c
index 99f81f5..4ccfd9c 100644
--- a/dummyflasher.c
+++ b/dummyflasher.c
@@ -55,6 +55,7 @@ static unsigned int emu_jedec_be_52_size = 0;
 static unsigned int emu_jedec_be_d8_size = 0;
 static unsigned int emu_jedec_ce_60_size = 0;
 static unsigned int emu_jedec_ce_c7_size = 0;
+static uint8_t emu_status = 0;
 #endif
 #endif
 
@@ -126,6 +127,9 @@ int dummy_init(void)
 {
        char *bustext = NULL;
        char *tmp = NULL;
+#if EMULATE_SPI_CHIP
+       char *status = NULL;
+#endif
 #if EMULATE_CHIP
        struct stat image_stat;
 #endif
@@ -178,6 +182,14 @@ int dummy_init(void)
                goto dummy_init_out;
        }
 #if EMULATE_SPI_CHIP
+       status = extract_programmer_param("status");
+       if (status) {
+               emu_status = atoi(status);
+               msg_pdbg("Initial status register is set to 0x%02x.\n",
+                        emu_status);
+               free(status);
+       }
+
        if (!strcmp(tmp, "M25P10.RES")) {
                emu_chip = EMULATE_ST_M25P10_RES;
                emu_chip_size = 128 * 1024;
@@ -385,10 +397,26 @@ static int emulate_spi_chip_response(unsigned int 
writecnt,
                if (readcnt > 2)
                        readarr[2] = 0x4a;
                break;
-       case JEDEC_RDSR:
-               memset(readarr, 0, readcnt);
+       case JEDEC_RDSR: {
+               uint8_t tmp_status = emu_status;
                if (aai_active)
-                       memset(readarr, 1 << 6, readcnt);
+                       tmp_status |= 1 << 6;
+               memset(readarr, tmp_status, readcnt);
+               break;
+       }
+       case JEDEC_WREN:
+               emu_status |= (1 << 1);
+               break;
+       case JEDEC_WRSR:
+               if (!(emu_status & (1 << 1))) {
+                       msg_perr("WRSR attempted, but WEL is 0!\n");
+                       return 1;
+               }
+               if (aai_active) {
+                       msg_perr("WRSR attempted during AAI sequence!\n");
+                       return 1;
+               }
+               emu_status = writearr[1] & 0xFC; /* resets WEL and WIP */
                break;
        case JEDEC_READ:
                offs = writearr[1] << 16 | writearr[2] << 8 | writearr[3];
-- 
1.7.1


_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to