SST 39VF1601

Jamie Guinan guinan at bluebutton.com
Mon Apr 5 14:46:22 EDT 2004


On 5 Apr 2004, Thayne Harbaugh wrote:

> On Fri, 2004-04-02 at 16:30, Jamie Guinan wrote:
> > Hello,
> > 
> > I've been struggling to get a pair of these chips working, under Linux
> > 2.6.4, on a custom ARM board based on the Sharp/LogicPD LPD7A404.  I have
> > two 1Mbx16 chips side-by-side for 32-bit data access.
> > 
> > The chip is not CFI compliant, as is the case with a similar chip
> > mentioned in this thread,
> > 
> >    http://lists.infradead.org/pipermail/linux-mtd/2002-May/005059.html
> > 
> > but unfortunately that thread kind of petered out without a clear
> > solution.
> 
> I read the thread - it sounds interesting re. the  three write sequence
> rather than the typical two.  Sick.  SST seems to be quite creative in
> thinking up ways to make their parts non-standard.  I could go on about
> some of their other parts that they claim have particular *features*
> that are better know to me as *bugs* and lack of attention to details,
> but this is a family mailing list and my comments wouldn't be
> appropriate.

Acknowledged.  :)

<snip>

> > [1]
> > 
> > #define SST39VF1601     0x234b
> > 
> > ...
> > 
> >          }, {
> >                 .mfr_id         = MANUFACTURER_SST,
> >                 .dev_id         = SST39VF1601,
> >                 .name           = "SST 39VF1601",
> >                 /* I don't think this is supported.*/
> >                 .uaddr          = {
> >                   [0] = MTD_UADDR_UNNECESSARY,
> >                   [1] = MTD_UADDR_UNNECESSARY,
> 
> Shouldn't this be MTD_UADDR_0x5555_0x2AAA?

I tried that, and the code goes through this path in jedec_probe_chip():

		switch(unlockpass++) {
		case 0:
			cfi->addr_unlock1 |= cfi->addr_unlock1 << 4;
			cfi->addr_unlock2 |= cfi->addr_unlock2 << 4;
			goto retry;

which leaves the values as follows,

  cfi->addr_unlock1 = 0xaaaa 
  cfi->addr_unlock2 = 0x5554

Then later in jedec_match() it fails this test,

	DEBUG( MTD_DEBUG_LEVEL3, "MTD %s(): check unlock addrs 0x%.4x 0x%.4x\n",
	       __func__, cfi->addr_unlock1, cfi->addr_unlock2 );
	if ( MTD_UADDR_UNNECESSARY != uaddr && MTD_UADDR_DONT_CARE != uaddr
	     && ( unlock_addrs[uaddr].addr1 != cfi->addr_unlock1
		  || unlock_addrs[uaddr].addr2 != cfi->addr_unlock2 ) ) {
		DEBUG( MTD_DEBUG_LEVEL3,
		       "MTD %s(): 0x%.4x 0x%.4x did not match\n",
		       __func__,
		       unlock_addrs[uaddr].addr1,
		       unlock_addrs[uaddr].addr2 );
		goto match_done;
	}

I could try adding a new enum uaddr MTD_UADDR_0x5554_0xAAAA and
corresponding unlock_addrs[] entry, if that doesn't sound
unreasonable.

> >                   [2] = MTD_UADDR_UNNECESSARY,
> >                 },
> >                 .DevSize        = SIZE_128KiB,
> >                 .CmdSet         = P_ID_AMD_STD,
> >                 .NumEraseRegions= 1,
> >                 .regions        = {
> >                         ERASEINFO(0x01000,64),
> 
> Shouldn't this be ERASEINFO(0x00800, 64)?

The chip supports 2k sector or 32k block erase, so I think either of
ERASEINFO(0x00800,1024) ERASEINFO(0x08000,64) or should work.

Btw, current DEBUG messages look like,
  Search for id:(bf 234b) interleave(2) type(2)
  MTD jedec_match(): Check fit 0x00000000 + 0x00200000 = 0x00200000
  MTD jedec_match(): check unlock addrs 0xaaaa 0x5554
  MTD jedec_match(): 0x5555 0x2aaa did not match

Cheers,
-Jamie




More information about the linux-mtd mailing list