On 24.07.2010 00:26, Daniel Lenski wrote:
This patch should enable read/write/erase support for these chips, but does *not* implement unlock functionality for them yet, 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 dlenski@gmail.com
Thanks for your patch! Review follows.
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.
diff --git a/flashchips.c b/flashchips.c index c6d265e..29dad48 100644 --- a/flashchips.c +++ b/flashchips.c @@ -1532,6 +1532,292 @@ 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 = { { 64 * 1024, 1 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 64 * 1024, 1 } },
.block_erase = spi_block_erase_52,
I can't find the 52h SPI opcode in the datasheet.
}, {
.eraseblocks = { { 4 * 1024, 16 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 1} },
.block_erase = spi_block_erase_60,
I can't find the 60h SPI opcode in the datasheet.
}, {
.eraseblocks = { { 64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = NULL,
Can you add a comment so it looks like this:
.unlock = NULL, /* Two-byte status reg */
.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 = { { 64 * 1024, 2 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 64 * 1024, 2 } },
.block_erase = spi_block_erase_52,
I can't find 52h.
}, {
.eraseblocks = { { 4 * 1024, 32 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 128 * 1024, 1} },
.block_erase = spi_block_erase_60,
I can't find 60h.
}, {
.eraseblocks = { { 128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = NULL,
.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 = { { 64 * 1024, 4 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 64 * 1024, 4 } },
.block_erase = spi_block_erase_52,
I can't find 52h.
}, {
.eraseblocks = { { 4 * 1024, 64 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 256 * 1024, 1} },
.block_erase = spi_block_erase_60,
I can't find 60h.
}, {
.eraseblocks = { { 256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = NULL,
.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 = { { 64 * 1024, 8 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 64 * 1024, 8 } },
.block_erase = spi_block_erase_52,
I can't find 52h.
}, {
.eraseblocks = { { 4 * 1024, 128 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 512 * 1024, 1} },
.block_erase = spi_block_erase_60,
I can't find 60h.
}, {
.eraseblocks = { { 512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = NULL,
.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 = { { 64 * 1024, 16 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 64 * 1024, 16 } },
.block_erase = spi_block_erase_52,
I can't find 52h.
}, {
.eraseblocks = { { 4 * 1024, 256 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
I can't find 60h.
}, {
.eraseblocks = { { 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = NULL,
.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 = { { 64 * 1024, 32 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 64 * 1024, 32 } },
.block_erase = spi_block_erase_52,
I can't find 52h.
}, {
.eraseblocks = { { 4 * 1024, 512 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 2048 * 1024, 1} },
.block_erase = spi_block_erase_60,
I can't find 60h.
}, {
.eraseblocks = { { 2048 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = NULL,
.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 = { { 64 * 1024, 64 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 64 * 1024, 64 } },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 4 * 1024, 1024 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 4096 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { { 4096 * 1024, 1} },
.block_erase = spi_block_erase_c7,
Can you use the order 20, 52, d8, 60, c7 here?
}
},
.unlock = NULL,
.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 = { { 64 * 1024, 64 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 64 * 1024, 64 } },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 4 * 1024, 1024 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 4096 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { { 4096 * 1024, 1} },
.block_erase = spi_block_erase_c7,
Can you use the order 20, 52, d8, 60, c7 here?
}
},
.unlock = NULL,
.write = spi_chip_write_256,
.read = spi_chip_read,
- },
- {
.name = "A29002B", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = AMIC_ID_NOPREFIX,.vendor = "AMIC",
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
Looks good otherwise.
Regards, Carl-Daniel