diff --git a/82802ab.c b/82802ab.c index 1316939fb8a7436756217f9159082b7991177237..3aa76b4b793d8d31a3aded10d8dcf3c909748a45 100644 --- a/82802ab.c +++ b/82802ab.c @@ -205,3 +205,52 @@ int write_82802ab(struct flashchip *flash, uint8_t *buf) return 0; } + +int unlock_28f004s5(struct flashrom *flash) +{ + chipaddr bios = flash->virtual_memory; + uint8_t mcfg, bcfg, need_unlock = 0, can_unlock = 0; + + /* Clear status register */ + chip_writeb(0x50, bios); + + /* Read identifier codes */ + chip_writeb(0x90, bios); + + /* Read master lock-bit */ + mcfg = chip_readb(bios + 0x3); + msg_cinfo("master lock is "); + if (mcfg) { + msg_cdbg("locked!\n"); + } else { + msg_cdbg("unlocked!\n"); + can_unlock = 1; + } + + /* Read block lock-bits */ + for (i = 0; i < flash->total_size * 1024; i+= (64 * 1024)) { + bcfg = chip_readb(bios + i + 2); // read block lock config + msg_cdbg("block lock at %06x is %slocked!\n", i, bcfg ? "" : "un"); + if (bcfg) { + need_unlock = 1; + } + } + + /* Reset chip */ + chip_writeb(0xFF, bios); + + /* Unlock: clear block lock-bits, if needed */ + if (can_unlock && need_unlock) { + chip_writeb(0x60, bios); + chip_writeb(0xD0, bios); + chip_writeb(0xFF, bios); + } + + /* Error: master locked or a block is locked */ + if (!can_unlock && need_unlock) { + msg_cerr("At least one block is locked and lockdown is active!\n"); + return -1; + } + + return 0; +} diff --git a/flashchips.c b/flashchips.c index 86c766bec22f964e951f478baac4f071177cf6f7..1d239da6ea1af6831c617f5320d34162f5551eb8 100644 --- a/flashchips.c +++ b/flashchips.c @@ -2316,7 +2316,7 @@ struct flashchip flashchips[] = { .model_id = P28F001BXB, .total_size = 128, .page_size = 128 * 1024, /* 8k + 2x4k + 112k */ - .tested = TEST_BAD_WRITE, + .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .block_erasers = @@ -2330,7 +2330,7 @@ struct flashchip flashchips[] = { .block_erase = erase_block_82802ab, }, }, - .write = NULL, + .write = write_82802ab, .read = read_memmapped, }, @@ -2342,7 +2342,7 @@ struct flashchip flashchips[] = { .model_id = P28F001BXT, .total_size = 128, .page_size = 128 * 1024, /* 112k + 2x4k + 8k */ - .tested = TEST_BAD_WRITE, + .tested = TEST_UNTESTED, .probe = probe_jedec, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ .block_erasers = @@ -2356,7 +2356,7 @@ struct flashchip flashchips[] = { .block_erase = erase_block_82802ab, }, }, - .write = NULL, + .write = write_82802ab, .read = read_memmapped, }, @@ -2368,7 +2368,6 @@ struct flashchip flashchips[] = { .model_id = E_28F004S5, .total_size = 512, .page_size = 256, - .feature_bits = FEATURE_REGISTERMAP, .tested = TEST_UNTESTED, .probe = probe_82802ab, .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ @@ -2379,7 +2378,7 @@ struct flashchip flashchips[] = { .block_erase = erase_block_82802ab, }, }, - .unlock = unlock_82802ab, + .unlock = unlock_28f004s5, .write = write_82802ab, .read = read_memmapped, },