Thanks for the review! I've attached an updated patch to address your comments.
I'm still not sure what the best course of action is for dealing with the D16 versus Q16 evil twin scenario. Let's see if Carl-Daniel has further comments.
New patch is: Signed-off-by: David Hendricks dhendrix@google.com
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
On Tue, 12 Apr 2011 12:58:35 -0700 David Hendricks dhendrix@google.com wrote:
Hello, The attached patch adds support for the following Eon SPI flash chips: EN25Q40, EN25Q80, EN25Q32A/B, EN25Q64, and EN25Q128
I was going to add support for the EN25Q16 as well, but found that it
shares
the same ID as the EN25D16 but has different write protection
capabilities.
So I added a comment instead.
I do not have real hardware to test with at the moment, so I left the
status
as untested.
Datasheets available from Eon @
http://www.eonssi.com/products/products.aspx
hello david and thanks for your patch.
i can confirm that the EN25D16 shares the ID with EN25Q16. there is also a EN25QH16 but with another ID 7015h (and an upcoming EN25QH256 w/o data sheet yet).
Thanks for pointing that out. I've added the EN25QH16 to the patch.
As we discussed on IRC, this particular chip supports "Serial Flash Discoverable Parameters" (SFDP). I tried to add support using the values listed in Table 9 of their datasheet, and left a TODO to update the probe routine later on.
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
Index: flashchips.h
--- flashchips.h (revision 1285) +++ flashchips.h (working copy) @@ -232,7 +232,12 @@ #define EON_EN25B64 0x2017 /* Same as P64 */ #define EON_EN25B64T 0x46 #define EON_EN25B64B 0x36 +#define EON_EN25Q40 0x3013
ok
+#define EON_EN25Q80 0x3014
i could only find references to a chip named EN25Q80A... either add a comment or rename to EON_EN25Q80A?
Appended "A" to the name.
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
#define EON_EN25D16 0x3015
i think the twin's name should be noted here too. since the D is untested i would also suggest using Q as the variable name here, because there is no other D supported yet... so -#define EON_EN25D16 0x3015 +#define EON_EN25Q16 0x3015 /* Same as D16 */ or so..
Added a comment to the line with the EON_EN25D16 #define.
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
+#define EON_EN25Q32 0x3016
correct; similar to the EON_EN25Q80 there seem to exist 3 versions: 'A', 'B' and no suffix.
Added comment next to the #define.
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
somewhere below... +#define EON_EN25QH16 0x7015
Done. I rearranged the EN25Q* #defines a bit so they're in alphabetical order with respect to the other EN25* chips.
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
Index: flashchips.c
--- flashchips.c (revision 1285) +++ flashchips.c (working copy) @@ -2807,6 +2807,8 @@ },
{
/* Note: EN25Q16 is an evil twin which shares the model ID
but has different write protection capabilities */ .vendor = "Eon", .name = "EN25D16",
change according to the macro name chosen (if applicable see above)
The EN25D16 was there first... I'm not sure if we should change it. I imagine the D16 is out of production, but I assume *somebody* is using it.
WWCDD? (What Would Carl-Daniel Do?)
.bustype = CHIP_BUSTYPE_SPI,
@@ -2814,6 +2816,7 @@ .model_id = EON_EN25D16, .total_size = 2048, .page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
true for the Q, did not check D
The EN25D16's datasheet no longer appears to be listed, but it is still available here: http://www.eonssi.com/upfile/p2008929181445.pdf (found via google :-))
It The D16 manual states, "The Write Status Register (WRSR) instruction allows new values to be written to the Status Register. Before it can be accepted, a Write Enable (WREN) instruction must previously have been executed."
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
.tested = TEST_UNTESTED, .probe = probe_spi_rdid, .probe_timing = TIMING_ZERO,
.block_erase = spi_block_erase_52, is not supported by the Q version. add a comment please. other erasers seem to be ok with the Q version.
Done. Nice catch!
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
.voltage = {2700, 3600}, (for the Q version)
Same as the D version (the original EN25Q* patch came before the .voltage member was added)
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
@@ -3083,6 +3086,171 @@
{ .vendor = "Eon",
.name = "EN25Q40",
.bustype = CHIP_BUSTYPE_SPI,
.manufacture_id = EON_ID_NOPREFIX,
.model_id = EON_EN25Q40,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.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_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
Added .voltage.
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
},
{
.vendor = "Eon",
.name = "EN25Q80(A)",
.bustype = CHIP_BUSTYPE_SPI,
.manufacture_id = EON_ID_NOPREFIX,
.model_id = EON_EN25Q80,
depends on macro name choice above
Updated to EON_EN25Q80A.
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.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_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
Added the .voltage member.
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
},
{
.vendor = "Eon",
.name = "EN25Q32(A)(B)",
i think that should be (A/B)
Fixed.
On Wed, Jun 22, 2011 at 9:15 AM, Stefan Tauner < stefan.tauner@student.tuwien.ac.at> wrote:
.bustype = CHIP_BUSTYPE_SPI,
.manufacture_id = EON_ID_NOPREFIX,
.model_id = EON_EN25Q32,
.total_size = 4096,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.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_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25Q64",
.bustype = CHIP_BUSTYPE_SPI,
.manufacture_id = EON_ID_NOPREFIX,
.model_id = EON_EN25Q64,
.total_size = 8192,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.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,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25Q128",
.bustype = CHIP_BUSTYPE_SPI,
.manufacture_id = EON_ID_NOPREFIX,
.model_id = EON_EN25Q128,
.total_size = 16384,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
Added .voltage members.
},
{
.vendor = "Eon", .name = "EN29F010", .bustype = CHIP_BUSTYPE_PARALLEL, .manufacture_id = EON_ID,
although the comment of the array indicates "alphabetically" sorted, it seems most of it is sorted by chipsize (if pushed). that means the entries above should be sorted like the IDs in flashchips.h
also please add a comment to all chips with the respective OTP (=one time programmable) area size. we don't support that yet, nor do we warn the user (yet), but i am sure there is a patch to lure with such a comment... ;) 512B: Q128 Q64 Q32B (QH16)
256B: Q80A Q40
128B: Q16 (but D16 has 512B, oh my...)
Done -- Added the comments above the feature_bits.
most of this are rather small problems. hence if everything i put into
this review was at least briefly considered.. it is Acked-by: Stefan Tauner stefan.tauner@student.tuwien.ac.at -- Kind regards/Mit freundlichen Grüßen, Stefan Tauner
flashrom mailing list flashrom@flashrom.org http://www.flashrom.org/mailman/listinfo/flashrom