[flashrom] Voltage & form-factor spreadsheet

Steven Zakulec spzakulec at gmail.com
Mon May 30 17:59:57 CEST 2011


On Sun, Apr 3, 2011 at 10:27 PM, Steven Zakulec <spzakulec at gmail.com> wrote:

>
>
> On Wed, Mar 30, 2011 at 8:16 PM, Carl-Daniel Hailfinger <
> c-d.hailfinger.devel.2006 at gmx.net> wrote:
>
>> Am 22.03.2011 01:22 schrieb Steven Zakulec:
>>
>>  On Tue, Oct 12, 2010 at 8:51 PM, Carl-Daniel Hailfinger wrote:
>>>
>>>
>>>> Hi Steven,
>>>>
>>>> thanks a lot for this comprehensive list of flash chip voltages and form
>>>> factors..
>>>>
>>>> On 13.10.2010 01:49, Steven Zakulec wrote:
>>>>
>>>>
>>>>> Hello, some weeks ago I asked carldani what I could do to help the
>>>>> flashrom project, and he mentioned that they could really use someone
>>>>> to go thru all the chips in flashchips.c and get the voltage range and
>>>>> form factor(s) for each chip listed there.
>>>>>
>>>>> This is the result of that project: a spreadsheet with the chip name,
>>>>> voltage range, form factors, connector type (pins, leads, etc).  This
>>>>> covers all the chips as of v1143.
>>>>> If anyone else is interested, I also have a short text file with all
>>>>> of the form factor acronyms I came across and what they mean (I
>>>>> grabbed the definition from the datasheet).
>>>>>
>>>>> There's a few missing chips, and some values that I wasn't quite sure
>>>>> about.  Comments would be greatly appreciated.
>>>>>
>>>>>
>>>>>
>>>> I thought I had seen some SPI chips which were available for disjoint
>>>> voltage ranges, e.g. 1.8-2.5V and 2.7-3.6V. Maybe the names were
>>>> different for the various versions with different voltages. I hope I'll
>>>> stumble over such a datasheet again.
>>>>
>>>> OK, now the next question is how we can store this info in struct
>>>> flashchip. Suggestion:
>>>>
>>>> struct voltage {
>>>> uint8_t minvoltage_decivolt;
>>>> uint8_t maxvoltage_decivolt;
>>>> };
>>>>
>>>> Values would be in 1/10 volts. I haven't seen any flash chip datasheets
>>>> with greater precision, and with such an encoding even 12V can be
>>>> expressed.
>>>>
>>>> For the form factor, I'd just use a large bitfield with one bit per
>>>> available form factor.
>>>> uint32_t formfactors;
>>>>
>>>> #define PLCC32 (1<<  0)
>>>> #define TSOP32 (1<<  1)
>>>> #define TSOP40 (1<<  2)
>>>> ...
>>>>
>>>> Example:
>>>>
>>>>        {
>>>>                .vendor         = "SST",
>>>>                .name           = "SST49LF008A",
>>>>                .bustype        = CHIP_BUSTYPE_FWH, /* A/A Mux */
>>>>                .manufacture_id = SST_ID,
>>>>                .model_id       = SST_SST49LF008A,
>>>>                .total_size     = 1024,
>>>>                .page_size      = 64 * 1024,
>>>>                .feature_bits   = FEATURE_REGISTERMAP |
>>>> FEATURE_EITHER_RESET,
>>>>                .tested         = TEST_OK_PRE,
>>>>                .probe          = probe_jedec,
>>>>                .probe_timing   = 1,        /* 150 ns */
>>>>                .block_erasers  =
>>>>                {
>>>>                        {
>>>>                                .eraseblocks = { {4 * 1024, 256} },
>>>>                                .block_erase = erase_sector_jedec,
>>>>                        }, {
>>>>                                .eraseblocks = { {64 * 1024, 16} },
>>>>                                .block_erase = erase_block_jedec,
>>>>                        }, {
>>>>                                .eraseblocks = { {1024 * 1024, 1} },
>>>>                                .block_erase = NULL, /* AA 55 80 AA 55
>>>> 10,
>>>> only in A/A mux mode */
>>>>                        }
>>>>                },
>>>>                .printlock      = printlock_sst_fwhub,
>>>>                .unlock         = unlock_sst_fwhub,
>>>>                .write          = write_jedec_1,
>>>>                .read           = read_memmapped,
>>>>                .voltages       = { 30, 36 },
>>>>                .formfactors    = TSOP32|TSOP40|PLCC32,
>>>>          },
>>>>
>>>> Regards,
>>>> Carl-Daniel
>>>>
>>>> --
>>>> http://www.hailfinger.org/
>>>>
>>>> I've included a patch (not working currently) that does pretty much what
>>>>
>>>>
>>> you indicated above (just the voltage part).  It fails to compile
>>> correctly,
>>> and has the struct called voltage instead of voltages, but should
>>> otherwise
>>> be identical to what you proposed.  While filling in what I had, I did
>>> come
>>> across some chips that offered separate ranges (usually 5 V +-10% and a
>>> 12V
>>> fast erase or program).  I've listed those in comments next to the
>>> voltage
>>> field.
>>>
>>>
>>
>> Right. Please note that those chips usually can't handle 12V on
>> data/address pins, and have a separate pin for supplying 12V for
>> write/erase.
>>
>> So it is correct to list them like other 5V chips, and add a comment about
>> separate 12V programming voltage (please be precise if you describe when the
>> chip needs 12V).  So far I've seen the following ways of using 12V:
>> - never/optional/always for erase
>> - never/optional/always for write
>> We could handle that either with feature bits or with separate voltage
>> feature bits. Not sure. A comment will suffice for now until we can actually
>> handle this.
>>
>>
>>
>>
>>  The form-factor half is more complicated- in my original spreadsheet,
>>> there's 29 form factors- I listed the pins/etc separate from the form
>>> factor, so there are a very large amount of form factors consequently.
>>> Ideas on how to handle this would be appreciated.
>>>
>>>
>>
>> Can we postpone form factors and concentrate on voltages first?
>>
>>  Index: flash.h
>>> ===================================================================
>>> --- flash.h     (revision 1282)
>>> +++ flash.h     (working copy)
>>> @@ -138,7 +138,12 @@
>>>        int (*unlock) (struct flashchip *flash);
>>>        int (*write) (struct flashchip *flash, uint8_t *buf, int start,
>>> int len);
>>>        int (*read) (struct flashchip *flash, uint8_t *buf, int start, int
>>> len);
>>> +       struct voltage {
>>>
>>> +               uint8_t minvoltage_decivolt;
>>> +               uint8_t maxvoltage_decivolt;
>>> +               };
>>>
>>>
>>
>> Please remove one tab above so the } is below s of struct voltage.
>>
>> By the way, I'd prefer
>>
>> +       struct {
>> +               uint8_t min;
>> +               uint8_t max;
>> +       } voltage;
>>
>>
>> We do not use long variable names elsewhere. And yes, I know that I
>> suggested this code some time ago. Since then I have learned a few things
>> about the usefulness of short code. And please move the word "voltage" to
>> the end of the struct declaration so it works.
>>
>>
>>
>>> +
>>>
>>>
>>
>> No additional empty line.
>>
>>
>>         /* Some flash devices have an additional register space. */
>>>        chipaddr virtual_memory;
>>>        chipaddr virtual_registers;
>>>
>>>
>>
>>  Index: flashchips.c
>>> ===================================================================
>>> --- flashchips.c        (revision 1282)
>>> +++ flashchips.c        (working copy)
>>> @@ -54,6 +54,7 @@
>>>         * .unlock              = Chip unlock function
>>>         * .write               = Chip write function
>>>         * .read                = Chip read function
>>> +        * .voltage             = Voltage min and max range
>>>
>>>
>>
>> Voltage min and max range in decivolt
>>
>>
>>         */
>>>
>>>        {
>>> @@ -111,6 +113,7 @@
>>>
>>>                },
>>>                .write          = write_jedec_1,
>>>                .read           = read_memmapped,
>>> +               .voltage        = { 50 },
>>>
>>>
>>
>> If this chip indeed has zero tolerance, please write {50, 50} explicitly.
>>
>>
>>         },
>>>
>>>        {
>>>   @@ -1283,6 +1313,7 @@
>>>                .unlock         = spi_disable_blockprotect_at25df,
>>>                .write          = spi_chip_write_256,
>>>                .read           = spi_chip_read,
>>> +               .voltage        = { 23, 36 }, /* Datasheet says 2.3-3.6V
>>> or 2.7-3.6V */
>>>
>>>
>>
>> Another feature bit maybe? FEATURE_VOLTAGE_SUBRANGE or something like
>> that. You can postpone this.
>>
>>
>>         },
>>>
>>>        {
>>> @@ -1320,6 +1351,7 @@
>>>                .unlock         = spi_disable_blockprotect_at25df,
>>>                .write          = spi_chip_write_256,
>>>                .read           = spi_chip_read,
>>> +               .voltage        = { 23, 36 }, /* Datasheet says 2.3-3.6V
>>> or 2.7-3.6V */
>>>
>>>
>>
>> Stylistic choice: All other data in curly brackets has no space after {
>> and no space before }.
>>
>>
>>         },
>>>
>>>        {
>>> @@ -1357,6 +1389,7 @@
>>>                .unlock         = spi_disable_blockprotect_at25df,
>>>                .write          = spi_chip_write_256,
>>>                .read           = spi_chip_read,
>>> +               .voltage        = { 17, 19 }, /* Datasheet says range is
>>> 1.65-1.95 V */
>>>
>>>
>>
>> Maybe use 16,20 instead?
>>
>>
>>
>>         },
>>>
>>>        {
>>>   @@ -2144,6 +2204,7 @@
>>>
>>>                },
>>>                .write          = write_jedec_1,
>>>                .read           = read_memmapped,
>>> +               .voltage        = { 5, 5 },
>>>
>>>
>>
>> Really 0.5V or did you mean 5.0V here?
>>
>>
>>         },
>>>
>>>        {
>>> @@ -2175,6 +2236,7 @@
>>>
>>>                },
>>>                .write          = write_jedec_1,
>>>                .read           = read_memmapped,
>>> +               .voltage        = { 5, 5 },
>>>
>>>
>>
>> Same.
>>
>>
>>         },
>>>
>>>        {
>>> @@ -2206,6 +2268,7 @@
>>>
>>>                },
>>>                .write          = write_jedec_1,
>>>                .read           = read_memmapped,
>>> +               .voltage        = { 5, 5 },
>>>
>>>
>>
>> Same.
>>
>>
>>         },
>>>
>>>        {
>>>
>>>
>>
>>  @@ -3460,6 +3560,7 @@
>>>                },
>>>                .write          = write_82802ab,
>>>                .read           = read_memmapped,
>>> +               .voltage        = { 114, 126 } /*Offers 5V read in
>>> addition, some chips offer 12V +-10% read/write */
>>>
>>>
>>
>> Are you sure the chip is a pure 12V chip? Most "12V" chips I know are
>> actually 5V chips and the 12V is only required for write/erase and sometimes
>> special forms of ID.
>>
>>
>>         },
>>>
>>>        {
>>> @@ -3483,6 +3584,7 @@
>>>                .unlock         = unlock_28f004s5,
>>>                .write          = write_82802ab,
>>>                .read           = read_memmapped,
>>> +               .voltage        = { 5, 5 }, /*Also offers 12V write */
>>>
>>>
>>
>> Please use the same phrasing as for the other chips:
>> "Also has 12V fast program"
>>
>>
>>         },
>>>
>>>        {
>>>
>>>
>>
>> Looks good otherwise. Some of my comments apply to multiple lines, but I
>> picked only one line for each to keep the mail short.
>>
>> Please resend this with the comments addressed and a Signed-off-by
>> statement. Then we just need someone to cross-check the voltage values and
>> we're good to go.
>>
>>
>> Regards,
>> Carl-Daniel
>>
>> --
>> http://www.hailfinger.org/
>>
>>
> I believe I've addressed all the comments.
> Signed-off-by: Steven Zakulec <spzakulec at gmail.com>
>

Hi, this is the latest version of the patch, taking into account Peter's
request to me to change the struct to uint16_t and the values to milliwatts.
Signed-off-by: Steven Zakulec <spzakulec at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.flashrom.org/pipermail/flashrom/attachments/20110530/2e5d360f/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: voltage_patch-v3.patch
Type: text/x-patch
Size: 36195 bytes
Desc: not available
URL: <http://www.flashrom.org/pipermail/flashrom/attachments/20110530/2e5d360f/attachment.patch>


More information about the flashrom mailing list