Updated patch with better/increased context for better reviewing and
against latest svn.
Signoff in patch.
Convert the following chips to use struct eraseblock:
AT25DF021
AT25DF041A
AT25DF081
AT25DF161
AT25DF321
AT25DF321A
AT25DF641
AT25F512B
AT25FS010
AT25FS040
AT26DF041
AT26DF081A
AT26DF161
AT26DF161A
AT26F004
AT29C512
AT29C010A
AT29C020
AT29C040A
AT49BV512
AT49F002(N)
AT49F002(N)T
Third revision of patch includes:
spi_block_erase_c7 for all SPI Atmel chips.
spi_block_erase_d8 for some chip that support alternate commands for certain
block sizes.
Updated patch with better/increased context for better reviewing and against
latest svn.
A possible future patch would to add spi_block_erase_d7 to spi.c as an
alternate to spi_block_erase_20. Only some SPI chips support d7.
Signed-off-by: Sean Nelson <[email protected]>
diff --git a/flashchips.c b/flashchips.c
index 786d53a..0b0c7bb 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -294,15 +294,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_25DF021,
.total_size = 256,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 64} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 8} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 4} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT25DF041A",
@@ -310,15 +329,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_25DF041A,
.total_size = 512,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 128} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 16} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 8} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {512 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {512 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT25DF081",
@@ -326,15 +364,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_25DF081,
.total_size = 1024,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 256} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 32} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 16} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT25DF161",
@@ -342,31 +399,69 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_25DF161,
.total_size = 2048,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 512} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 64} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 32} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {2 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {2 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT25DF321",
.bustype = CHIP_BUSTYPE_SPI,
.manufacture_id = ATMEL_ID,
.model_id = AT_25DF321,
.total_size = 4096,
.page_size = 256,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PRW,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 1024} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 128} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 64} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT25DF321A",
@@ -374,15 +469,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_25DF321A,
.total_size = 4096,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 1024} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 128} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 64} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT25DF641",
@@ -390,15 +504,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_25DF641,
.total_size = 8192,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 2048} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 256} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT25F512B",
@@ -406,15 +539,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_25F512B,
.total_size = 64,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 16} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 2} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {32 * 1024, 2} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {64 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {64 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT25FS010",
@@ -422,15 +574,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_25FS010,
.total_size = 128,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 32} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 4} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {32 * 1024, 4} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {128 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {128 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT25FS040",
@@ -438,15 +609,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_25FS040,
.total_size = 512,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 128} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {64 * 1024, 8} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 8} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {512 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {512 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT26DF041",
@@ -455,14 +645,21 @@ struct flashchip flashchips[] = {
.model_id = AT_26DF041,
.total_size = 512,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
.erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 128} },
+ .block_erase = spi_block_erase_20,
+ }
+ },
.write = NULL /* Incompatible Page write */,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT26DF081A",
@@ -470,15 +667,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_26DF081A,
.total_size = 1024,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 256} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 32} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 16} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT26DF161",
@@ -486,15 +702,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_26DF161,
.total_size = 2048,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 512} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 64} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 32} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {2 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {2 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT26DF161A",
@@ -502,15 +737,34 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_26DF161A,
.total_size = 2048,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 512} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 64} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 32} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {2 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {2 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = spi_chip_write_256,
.read = spi_chip_read,
},
/*The AT26DF321 has the same ID as the AT25DF321. */
/*{
.vendor = "Atmel",
@@ -535,64 +789,104 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_26F004,
.total_size = 512,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
- .erase = spi_chip_erase_60_c7,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 64} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 8} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 4} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {512 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {512 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
.write = NULL /* Incompatible Page write */,
.read = spi_chip_read,
},
{
.vendor = "Atmel",
.name = "AT29C512",
.bustype = CHIP_BUSTYPE_PARALLEL,
.manufacture_id = ATMEL_ID,
.model_id = AT_29C512,
.total_size = 64,
.page_size = 128,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PRW,
.probe = probe_jedec,
.probe_timing = 10000, /* 10mS, Enter=Exec */
- .erase = erase_chip_jedec,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
.write = write_jedec,
.read = read_memmapped,
},
{
.vendor = "Atmel",
.name = "AT29C010A",
.bustype = CHIP_BUSTYPE_PARALLEL,
.manufacture_id = ATMEL_ID,
.model_id = AT_29C010A,
.total_size = 128,
.page_size = 128,
- .tested = TEST_OK_PRE,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10000, /* 10mS, Enter=Exec */
- .erase = erase_chip_jedec,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
.write = write_jedec, /* FIXME */
.read = read_memmapped,
},
{
.vendor = "Atmel",
.name = "AT29C020",
.bustype = CHIP_BUSTYPE_PARALLEL,
.manufacture_id = ATMEL_ID,
.model_id = AT_29C020,
.total_size = 256,
.page_size = 256,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PRW,
.probe = probe_jedec,
.probe_timing = 10000, /* 10ms */
- .erase = erase_chip_jedec,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
.write = write_jedec,
.read = read_memmapped,
},
{
.vendor = "Atmel",
.name = "AT29C040A",
@@ -600,15 +894,22 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_29C040A,
.total_size = 512,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = 10000, /* 10 ms */
- .erase = erase_chip_jedec,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {512 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
.write = write_jedec,
.read = read_memmapped,
},
{
.vendor = "Atmel",
.name = "AT45CS1282",
@@ -757,18 +1058,25 @@ struct flashchip flashchips[] = {
.vendor = "Atmel",
.name = "AT49BV512",
.bustype = CHIP_BUSTYPE_PARALLEL,
.manufacture_id = ATMEL_ID,
.model_id = AT_49BV512,
.total_size = 64,
.page_size = 64,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PRW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info
specified */
- .erase = erase_chip_jedec,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
.write = write_49f002,
.read = read_memmapped,
},
{
.vendor = "Atmel",
.name = "AT49F002(N)",
@@ -776,31 +1084,59 @@ struct flashchip flashchips[] = {
.manufacture_id = ATMEL_ID,
.model_id = AT_49F002N,
.total_size = 256,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info
specified */
- .erase = erase_chip_jedec,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {16 * 1024, 1},
+ {8 * 1024, 2},
+ {128 * 1024, 2},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
.write = write_49f002,
.read = read_memmapped,
},
{
.vendor = "Atmel",
.name = "AT49F002(N)T",
.bustype = CHIP_BUSTYPE_PARALLEL,
.manufacture_id = ATMEL_ID,
.model_id = AT_49F002NT,
.total_size = 256,
.page_size = 256,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PRW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info
specified */
- .erase = erase_chip_jedec,
+ .erase = NULL,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {128 * 1024, 2},
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
.write = write_49f002,
.read = read_memmapped,
},
{
.vendor = "AMIC",
.name = "A25L40P",
_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom