On Sat, 2010-07-24 at 10:16 +0200, Carl-Daniel Hailfinger wrote: > General remark: Can you order the eraseblock definitions by eraseblock > size (smallest one first)? This allows us to use a better reflashing > granularity in the first write/erase attempt, and reserves bigger > granularities for the case where smaller granularities fail.
Got it, done. > I can't find the 52h SPI opcode in the datasheet. > I can't find the 60h SPI opcode in the datasheet. > (etc.) Changed these. I found other versions of the datasheets that suggested these were valid and had been inadvertently omitted... but I think I'm probably erring on the wrong side of caution by doing that. > Can you add a comment so it looks like this: > > .unlock = NULL, /* Two-byte status reg */ Done. I made a careless mistake, which is that only the 032 and Q032 chips have the two-byte status reg and more complex protection features. The smaller-capacity ones can still use the standard spi_disable_blockprotect unlock function. I have corrected this in the patch. One other feature of the A25L032 and A25LQ032 chips which Flashrom may want to be aware of: they have 64 bytes of one-time-programmable memory on them. Is reading/writing this outside the scope of Flashrom? I assume they'd be used for serial numbers or crypto keys... and it might be misleading to assume Flashrom was completely backing up/restoring a BIOS image if it can't read and write this OTP region. Revised patch is attached, with revised description. Dan
This patch should enable read/write/erase support for these chips. Unlock functionality is *not* implemented yet for A25L032 or A25LQ032, because they have more complex protection features than simply BPx block-protect bits. Datasheets: http://www.amictechnology.com/pdf/A25L512.pdf http://www.amictechnology.com/pdf/A25L010.pdf http://www.amictechnology.com/pdf/A25L020.pdf http://www.amictechnology.com/pdf/A25L040.pdf http://www.amictechnology.com/pdf/A25L080.pdf http://www.amictechnology.com/pdf/A25L016.pdf http://www.amictechnology.com/pdf/A25L032.pdf http://www.amictechnology.com/pdf/A25LQ032.pdf IDs: 0x37 0x3010 is A25L512 (uniform 4k sectors) 0x37 0x3011 is A25L010 (uniform 4k sectors) 0x37 0x3012 is A25L020 (uniform 4k sectors) 0x37 0x3013 is A25L040 (uniform 4k sectors) 0x37 0x3014 is A25L080 (uniform 4k sectors) 0x37 0x3015 is A25L016 (uniform 4k sectors) 0x37 0x3016 is A25L032 (uniform 4k sectors) 0x37 0x4016 is A25LQ032 (uniform 4k sectors, has quad-rate read) Please note that the IDs of the newer chips all use AMIC_ID_NOPREFIX instead of AMIC_ID, and that means they use probe_spi_rdid instead of probe_spi_rdid4. Signed-off-by: Dan Lenski <[email protected]> --- flashchips.c | 244 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ flashchips.h | 8 ++ 2 files changed, 252 insertions(+), 0 deletions(-) diff --git a/flashchips.c b/flashchips.c index c6d265e..abe5f24 100644 --- a/flashchips.c +++ b/flashchips.c @@ -1532,6 +1532,250 @@ struct flashchip flashchips[] = { { .vendor = "AMIC", + .name = "A25L512", + .bustype = CHIP_BUSTYPE_SPI, + .manufacture_id = AMIC_ID_NOPREFIX, + .model_id = AMIC_A25L512, + .total_size = 64, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 16 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { { 64 * 1024, 1 } }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { { 64 * 1024, 1 } }, + .block_erase = spi_block_erase_c7, + } + }, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "AMIC", + .name = "A25L010", + .bustype = CHIP_BUSTYPE_SPI, + .manufacture_id = AMIC_ID_NOPREFIX, + .model_id = AMIC_A25L010, + .total_size = 128, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 32 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { { 64 * 1024, 2 } }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { { 128 * 1024, 1 } }, + .block_erase = spi_block_erase_c7, + } + }, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "AMIC", + .name = "A25L020", + .bustype = CHIP_BUSTYPE_SPI, + .manufacture_id = AMIC_ID_NOPREFIX, + .model_id = AMIC_A25L020, + .total_size = 256, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 64 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { { 64 * 1024, 4 } }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { { 256 * 1024, 1 } }, + .block_erase = spi_block_erase_c7, + } + }, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "AMIC", + .name = "A25L040", + .bustype = CHIP_BUSTYPE_SPI, + .manufacture_id = AMIC_ID_NOPREFIX, + .model_id = AMIC_A25L040, + .total_size = 512, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 128 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { { 64 * 1024, 8 } }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { { 512 * 1024, 1 } }, + .block_erase = spi_block_erase_c7, + } + }, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "AMIC", + .name = "A25L080", + .bustype = CHIP_BUSTYPE_SPI, + .manufacture_id = AMIC_ID_NOPREFIX, + .model_id = AMIC_A25L080, + .total_size = 1024, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 256 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { { 64 * 1024, 16 } }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { { 1024 * 1024, 1 } }, + .block_erase = spi_block_erase_c7, + } + }, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "AMIC", + .name = "A25L016", + .bustype = CHIP_BUSTYPE_SPI, + .manufacture_id = AMIC_ID_NOPREFIX, + .model_id = AMIC_A25L016, + .total_size = 2048, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 512 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { { 64 * 1024, 32 } }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { { 2048 * 1024, 1 } }, + .block_erase = spi_block_erase_c7, + } + }, + .unlock = spi_disable_blockprotect, + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "AMIC", + .name = "A25L032", + .bustype = CHIP_BUSTYPE_SPI, + .manufacture_id = AMIC_ID_NOPREFIX, + .model_id = AMIC_A25L032, + .total_size = 4096, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 1024 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { { 64 * 1024, 64 } }, + .block_erase = spi_block_erase_52, + }, { + .eraseblocks = { { 64 * 1024, 64 } }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { { 4096 * 1024, 1 } }, + .block_erase = spi_block_erase_60, + }, { + .eraseblocks = { { 4096 * 1024, 1 } }, + .block_erase = spi_block_erase_c7, + } + }, + .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */ + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "AMIC", + .name = "A25LQ032", + .bustype = CHIP_BUSTYPE_SPI, + .manufacture_id = AMIC_ID_NOPREFIX, + .model_id = AMIC_A25LQ032, + .total_size = 4096, + .page_size = 256, + .tested = TEST_UNTESTED, + .probe = probe_spi_rdid, + .probe_timing = TIMING_ZERO, + .block_erasers = + { + { + .eraseblocks = { { 4 * 1024, 1024 } }, + .block_erase = spi_block_erase_20, + }, { + .eraseblocks = { { 64 * 1024, 64 } }, + .block_erase = spi_block_erase_52, + }, { + .eraseblocks = { { 64 * 1024, 64 } }, + .block_erase = spi_block_erase_d8, + }, { + .eraseblocks = { { 4096 * 1024, 1 } }, + .block_erase = spi_block_erase_60, + }, { + .eraseblocks = { { 4096 * 1024, 1 } }, + .block_erase = spi_block_erase_c7, + } + }, + .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */ + .write = spi_chip_write_256, + .read = spi_chip_read, + }, + + { + .vendor = "AMIC", .name = "A29002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMIC_ID_NOPREFIX, diff --git a/flashchips.h b/flashchips.h index 3e2befa..0b16e3b 100644 --- a/flashchips.h +++ b/flashchips.h @@ -88,6 +88,14 @@ #define AMIC_A25L80P 0x2014 /* Seems that no A25L80PT exists */ #define AMIC_A25L16PT 0x2025 #define AMIC_A25L16PU 0x2015 +#define AMIC_A25L512 0x3010 +#define AMIC_A25L010 0x3011 +#define AMIC_A25L020 0x3012 +#define AMIC_A25L040 0x3013 +#define AMIC_A25L080 0x3014 +#define AMIC_A25L016 0x3015 +#define AMIC_A25L032 0x3016 +#define AMIC_A25LQ032 0x4016 #define AMIC_A29002B 0x0d #define AMIC_A29002T 0x8C /* Same as A290021T */ #define AMIC_A29040B 0x86 -- 1.7.0.4
_______________________________________________ flashrom mailing list [email protected] http://www.flashrom.org/mailman/listinfo/flashrom
