Project

General

Profile

#include "spiflash.h"
#include "spi.h"

#include "regs.h"

void readFlashId(int *id1, int *id2)
{
int i=0;
int bytes = 4;
unsigned char * id1c = (unsigned char *)id1;
unsigned char * id2c = (unsigned char *)id2;
unsigned char res;

flashChipSelect();
spiTransferByte(0xab);
for (i=0; i!=bytes; ++i)
{
res = spiTransferByte(0xff);
id1c[i] = res;
}

flashChipDeselect();

flashChipSelect();
spiTransferByte(0x9f);
for (i=0; i!=bytes; ++i)
{
res = spiTransferByte(0xff);
id2c[i] = res;
}

flashChipDeselect();

/* id1c[0] = 0x11;
id1c[1] = 0x22;
id1c[2] = 0x33;
id1c[3] = 0x44;
id2c[0] = 0x55;
id2c[1] = 0x66;
id2c[2] = 0x77;
id2c[3] = 0x88;*/
}

void readFlash(int address, int bytes, u08 * dest)
{
int i=0;
u08 res;
flashChipSelect();
spiTransferByte(0x03);
res = spiTransferByte((address>>16)&0xff);
res = spiTransferByte((address>>8)&0xff);
res = spiTransferByte(address&0xff);
for (i=0; i!=bytes; ++i)
{
res = spiTransferByte(0xff);
dest[i] = res;
}
flashChipDeselect();
}

void waitWriteComplete()
{
u08 res;
while (true)
{
flashChipSelect();
spiTransferByte(0x5); // read status: check if done
res = spiTransferByte(0xff);
flashChipDeselect();
if (0==res&0x1)
{
break;
}
}
}

int flashSectorSize()
{
int sectorSize; /* Size for D8 erase... */

unsigned int id1,id2;
readFlashId(&id1,&id2);
id2 = id2>>8;
if (id2==0x20ba18)
{
sectorSize = 64*1024;
}
else if (id2==0x202018)
{
sectorSize = 256*1024;
}
else if (id2==0x012018)
{
sectorSize = 64*1024;
}
else if (id2==0x1c7018)
{
sectorSize = 64*1024;
}
else
{
sectorSize = -1;
}
return sectorSize;
}

void eraseFlash(int address, int bytes)
{
u08 res;

int sectorSize = flashSectorSize();
if (sectorSize<0)
{
return;
}

while (bytes>0)
{
flashChipSelect();
spiTransferByte(0x6); // write enable
flashChipDeselect();
flashChipSelect();
spiTransferByte(0xd8); // erase sector
res = spiTransferByte((address>>16)&0xff);
res = spiTransferByte((address>>8)&0xff);
res = spiTransferByte(address&0xff);

flashChipDeselect();

bytes = bytes-sectorSize;
address = address+sectorSize;

waitWriteComplete();
}
}

void writeFlash(int address, int totalbytes, u08 * dest)
{
u08 res;
while(totalbytes>0)
{
int bytes = totalbytes;
int i;
if (bytes>256)
bytes=256; // Have to write in chunks of 256 bytes

flashChipSelect();
spiTransferByte(0x6); // write enable
flashChipDeselect();
flashChipSelect();
spiTransferByte(0x2); // write bytes
res = spiTransferByte((address>>16)&0xff);
res = spiTransferByte((address>>8)&0xff);
res = spiTransferByte(address&0xff);
for (i=0; i!=bytes; ++i)
{
spiTransferByte(dest[i]);
}
flashChipDeselect();

totalbytes-=bytes;
address+=bytes;
dest+=bytes;
waitWriteComplete();
}
}


    (1-1/1)