[flashrom] Voltage & form-factor spreadsheet

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Thu Mar 31 02:16:47 CEST 2011


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/





More information about the flashrom mailing list