diff --git a/apps/flash.c b/apps/flash.c new file mode 120000 index 0000000..fa8626c --- /dev/null +++ b/apps/flash.c @@ -0,0 +1 @@ +./octonet/flash.c \ No newline at end of file diff --git a/apps/flashprog.c b/apps/flashprog.c index 70e2aa7..b5e5183 100644 --- a/apps/flashprog.c +++ b/apps/flashprog.c @@ -33,379 +33,7 @@ #include #include -#define DDB_MAGIC 'd' - -static uint32_t linknr = 0; - -struct ddb_id { - __u16 vendor; - __u16 device; - __u16 subvendor; - __u16 subdevice; - __u32 hw; - __u32 regmap; -}; - -struct ddb_flashio { - __u8 *write_buf; - __u32 write_len; - __u8 *read_buf; - __u32 read_len; - __u32 link; -}; - -#define IOCTL_DDB_FLASHIO _IOWR(DDB_MAGIC, 0x00, struct ddb_flashio) -#define IOCTL_DDB_ID _IOR(DDB_MAGIC, 0x03, struct ddb_id) - - -int flashio(int ddb, uint8_t *wbuf, uint32_t wlen, uint8_t *rbuf, uint32_t rlen) -{ - struct ddb_flashio fio = { - .write_buf=wbuf, - .write_len=wlen, - .read_buf=rbuf, - .read_len=rlen, - .link=linknr, - }; - - return ioctl(ddb, IOCTL_DDB_FLASHIO, &fio); -} - -enum { - UNKNOWN_FLASH = 0, - ATMEL_AT45DB642D = 1, - SSTI_SST25VF016B = 2, - SSTI_SST25VF032B = 3, - SSTI_SST25VF064C = 4, - SPANSION_S25FL116K = 5, -}; - - -int flashread(int ddb, uint8_t *buf, uint32_t addr, uint32_t len) -{ - uint8_t cmd[4]= {0x03, (addr >> 16) & 0xff, - (addr >> 8) & 0xff, addr & 0xff}; - - return flashio(ddb, cmd, 4, buf, len); -} - -int flashdump(int ddb, uint32_t addr, uint32_t len) -{ - int i, j; - uint8_t buf[32]; - int bl = sizeof(buf); - - for (j=0; j= 8192; - int i; - - if (BlockErase) { - for(i = 0; i < BufferSize; i += 8192 ) { - uint8_t Cmd[4]; - if( (i & 0xFFFF) == 0 ) - printf(" Erase %08x\n",FlashOffset + i); - Cmd[0] = 0x50; // Block Erase - Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - err = flashio(dev,Cmd,4,NULL,0); - if( err < 0 ) break; - - while( 1 ) - { - Cmd[0] = 0xD7; // Read Status register - err = flashio(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x80) == 0x80 ) break; - } - } - } - - for(i = 0; i < BufferSize; i += 1024 ) - { - uint8_t Cmd[4 + 1024]; - if( (i & 0xFFFF) == 0 ) - { - printf(" Program %08x\n",FlashOffset + i); - } - Cmd[0] = 0x84; // Buffer 1 - Cmd[1] = 0x00; - Cmd[2] = 0x00; - Cmd[3] = 0x00; - memcpy(&Cmd[4],&Buffer[i],1024); - - err = flashio(dev,Cmd,4 + 1024,NULL,0); - if( err < 0 ) break; - - Cmd[0] = BlockErase ? 0x88 : 0x83; // Buffer to Main Memory (with Erase) - Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - - err = flashio(dev,Cmd,4,NULL,0); - if( err < 0 ) break; - - while( 1 ) - { - Cmd[0] = 0xD7; // Read Status register - err = flashio(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x80) == 0x80 ) break; - } - if( err < 0 ) break; - } - return err; -} - - -int FlashWritePageMode(int dev, uint32_t FlashOffset, uint8_t *Buffer, int BufferSize, uint8_t LockBits) -{ - int err = 0, i, j; - uint8_t Cmd[260]; - - if( (BufferSize % 4096) != 0 ) - return -1; // Must be multiple of sector size - - do { - Cmd[0] = 0x50; // EWSR - err = flashio(dev, Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x01; // WRSR - Cmd[1] = 0x00; // BPx = 0, Unlock all blocks - err = flashio(dev, Cmd,2,NULL,0); - if( err < 0 ) break; - - for(i = 0; i < BufferSize; i += 4096 ) { - if( (i & 0xFFFF) == 0 ) { - printf(" Erase %08x\n",FlashOffset + i); - } - - Cmd[0] = 0x06; // WREN - err = flashio(dev, Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x20; // Sector erase ( 4Kb) - Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - err = flashio(dev, Cmd,4,NULL,0); - if( err < 0 ) break; - - while(1) - { - Cmd[0] = 0x05; // RDRS - err = flashio(dev, Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x01) == 0 ) break; - } - if( err < 0 ) break; - - } - if( err < 0 ) break; - - - for (j = BufferSize - 256; j >= 0; j -= 256 ) - { - if( (j & 0xFFFF) == 0 ) - { - printf(" Programm %08x\n",FlashOffset + j); - } - - Cmd[0] = 0x06; // WREN - err = flashio(dev, Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x02; // PP - Cmd[1] = ( (( FlashOffset + j ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + j ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - memcpy(&Cmd[4],&Buffer[j],256); - err = flashio(dev, Cmd,260,NULL,0); - if( err < 0 ) break; - - while(1) - { - Cmd[0] = 0x05; // RDRS - err = flashio(dev, Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x01) == 0 ) break; - } - if( err < 0 ) break; - - } - if( err < 0 ) break; - - Cmd[0] = 0x50; // EWSR - err = flashio(dev, Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x01; // WRSR - Cmd[1] = LockBits; // BPx = 0, Lock all blocks - err = flashio(dev, Cmd,2,NULL,0); - - } while(0); - return err; -} - - -int FlashWriteSSTI_B(int dev, uint32_t FlashOffset, uint8_t *Buffer, int BufferSize) -{ - int err = 0; - uint8_t Cmd[6]; - int i, j; - - // Must be multiple of sector size - if( (BufferSize % 4096) != 0 ) - return -1; - - do { - Cmd[0] = 0x50; // EWSR - err = flashio(dev,Cmd,1,NULL,0); - if( err < 0 ) - break; - - Cmd[0] = 0x01; // WRSR - Cmd[1] = 0x00; // BPx = 0, Unlock all blocks - err = flashio(dev,Cmd,2,NULL,0); - if( err < 0 ) - break; - - for(i = 0; i < BufferSize; i += 4096 ) { - if( (i & 0xFFFF) == 0 ) - printf(" Erase %08x\n",FlashOffset + i); - Cmd[0] = 0x06; // WREN - err = flashio(dev,Cmd,1,NULL,0); - if( err < 0 ) - break; - - Cmd[0] = 0x20; // Sector erase ( 4Kb) - Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - err = flashio(dev,Cmd,4,NULL,0); - if( err < 0 ) - break; - - while(1) { - Cmd[0] = 0x05; // RDRS - err = flashio(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x01) == 0 ) break; - } - if( err < 0 ) break; - } - if( err < 0 ) - break; - for(j = BufferSize - 4096; j >= 0; j -= 4096 ) { - if( (j & 0xFFFF) == 0 ) - printf(" Program %08x\n",FlashOffset + j); - - for(i = 0; i < 4096; i += 2 ) { - if( i == 0 ) { - Cmd[0] = 0x06; // WREN - err = flashio(dev,Cmd,1,NULL,0); - if( err < 0 ) - break; - - Cmd[0] = 0xAD; // AAI - Cmd[1] = ( (( FlashOffset + j ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + j ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - Cmd[4] = Buffer[j+i]; - Cmd[5] = Buffer[j+i+1]; - err = flashio(dev,Cmd,6,NULL,0); - } else { - Cmd[0] = 0xAD; // AAI - Cmd[1] = Buffer[j+i]; - Cmd[2] = Buffer[j+i+1]; - err = flashio(dev,Cmd,3,NULL,0); - } - if( err < 0 ) - break; - - while(1) { - Cmd[0] = 0x05; // RDRS - err = flashio(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x01) == 0 ) break; - } - if( err < 0 ) break; - } - if( err < 0 ) break; - - Cmd[0] = 0x04; // WDIS - err = flashio(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - } - if( err < 0 ) break; - - Cmd[0] = 0x50; // EWSR - err = flashio(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x01; // WRSR - Cmd[1] = 0x1C; // BPx = 0, Lock all blocks - err = flashio(dev,Cmd,2,NULL,0); - } while(0); - return err; -} +#include "flash.h" void get_id(int ddb, struct ddb_id *ddbid) { uint8_t id[4]; @@ -450,8 +78,8 @@ int main(int argc, char **argv) uint32_t FlashOffset = 0x10000; int ddb; int i, err; - int SectorSize=0; - int FlashSize=0; + uint32_t SectorSize=0; + uint32_t FlashSize=0; int Flash; uint32_t svid=0, jump=0, dump=0; @@ -517,32 +145,7 @@ int main(int argc, char **argv) printf("Could not open device\n"); return -1; } - Flash=FlashDetect(ddb); - - switch(Flash) { - case ATMEL_AT45DB642D: - SectorSize = 1024; - FlashSize = 0x800000; - break; - case SSTI_SST25VF016B: - SectorSize = 4096; - FlashSize = 0x200000; - break; - case SSTI_SST25VF032B: - SectorSize = 4096; - FlashSize = 0x400000; - break; - case SSTI_SST25VF064C: - SectorSize = 4096; - FlashSize = 0x800000; - break; - case SPANSION_S25FL116K: - SectorSize = 4096; - FlashSize = 0x200000; - break; - default: - return 0; - } + Flash = flashdetect(ddb, &SectorSize, &FlashSize); get_id(ddb, &ddbid); #if 1 @@ -610,6 +213,10 @@ int main(int argc, char **argv) fname="DVBBridgeV1B_DVBBridgeV1B.bit"; printf("Octopus\n"); break; + case 0x0006: + fname="DVBBridgeV2A_DD01_0006_STD.fpga"; + printf("CineS2 V7\n"); + break; case 0x0007: fname="DVBBridgeV2A_DD01_0007_MXL.fpga"; printf("Octopus 4/8\n"); @@ -619,7 +226,7 @@ int main(int argc, char **argv) printf("Octopus 4/8\n"); break; case 0x0011: - fname="CIBridgeV1B_CIBridgeV1B.bit"; + fname="CIBridgeV1B_CIBridgeV1B.fpga"; printf("Octopus CI\n"); break; case 0x0012: diff --git a/apps/octonet/ddflash.c b/apps/octonet/ddflash.c index 276e257..644d441 100644 --- a/apps/octonet/ddflash.c +++ b/apps/octonet/ddflash.c @@ -58,7 +58,6 @@ static int reboot(uint32_t off) struct ddflash { int fd; struct ddb_id id; - uint32_t type; uint32_t version; uint32_t flash_type; @@ -68,74 +67,9 @@ struct ddflash { uint32_t bufsize; uint32_t block_erase; - uint8_t * buffer; + uint8_t *buffer; }; -int flashio(int ddb, uint8_t *wbuf, uint32_t wlen, uint8_t *rbuf, uint32_t rlen) -{ - struct ddb_flashio fio = { - .write_buf=wbuf, - .write_len=wlen, - .read_buf=rbuf, - .read_len=rlen, - .link=0, - }; - - return ioctl(ddb, IOCTL_DDB_FLASHIO, &fio); -} - -enum { - UNKNOWN_FLASH = 0, - ATMEL_AT45DB642D = 1, - SSTI_SST25VF016B = 2, - SSTI_SST25VF032B = 3, - SSTI_SST25VF064C = 4, - SPANSION_S25FL116K = 5, - SPANSION_S25FL132K = 6, - SPANSION_S25FL164K = 7, -}; - -static int flashread(int ddb, uint8_t *buf, uint32_t addr, uint32_t len) -{ - uint8_t cmd[4]= {0x03, (addr >> 16) & 0xff, - (addr >> 8) & 0xff, addr & 0xff}; - - return flashio(ddb, cmd, 4, buf, len); -} - -static int flashdump(struct ddflash *ddf, uint32_t addr, uint32_t len) -{ - int i, j; - uint8_t buf[32]; - int bl = sizeof(buf); - - for (j = 0; j < len; j += bl, addr += bl) { - flashread(ddf->fd, buf, addr, bl); - for (i = 0; i < bl; i++) { - printf("%02x ", buf[i]); - } - printf("\n"); - } -} - -void dump(const uint8_t *b, int l) -{ - int i, j; - - for (j = 0; j < l; j += 16, b += 16) { - for (i = 0; i < 16; i++) - if (i + j < l) - printf("%02x ", b[i]); - else - printf(" "); - printf(" | "); - for (i = 0; i < 16; i++) - if (i + j < l) - putchar((b[i] > 31 && b[i] < 127) ? b[i] : '.'); - printf("\n"); - } -} - int flashwrite_pagemode(struct ddflash *ddf, int dev, uint32_t FlashOffset, uint8_t LockBits, uint32_t fw_off) { @@ -500,172 +434,6 @@ static int flash_detect(struct ddflash *ddf) } -int FlashWriteAtmel(int dev,uint32_t FlashOffset, uint8_t *Buffer,int BufferSize) -{ - int err = 0; - int BlockErase = BufferSize >= 8192; - int i; - - if (BlockErase) { - for (i = 0; i < BufferSize; i += 8192 ) { - uint8_t cmd[4]; - if ((i & 0xFFFF) == 0 ) - printf(" Erase %08x\n",FlashOffset + i); - cmd[0] = 0x50; // Block Erase - cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - cmd[3] = 0x00; - err = flashio(dev,cmd,4,NULL,0); - if (err < 0 ) break; - - while( 1 ) - { - cmd[0] = 0xD7; // Read Status register - err = flashio(dev,cmd,1,&cmd[0],1); - if (err < 0 ) break; - if ((cmd[0] & 0x80) == 0x80 ) break; - } - } - } - - for (i = 0; i < BufferSize; i += 1024) { - uint8_t cmd[4 + 1024]; - if ((i & 0xFFFF) == 0 ) - { - printf(" Program %08x\n",FlashOffset + i); - } - cmd[0] = 0x84; // Buffer 1 - cmd[1] = 0x00; - cmd[2] = 0x00; - cmd[3] = 0x00; - memcpy(&cmd[4],&Buffer[i],1024); - - err = flashio(dev,cmd,4 + 1024,NULL,0); - if (err < 0 ) break; - - cmd[0] = BlockErase ? 0x88 : 0x83; // Buffer to Main Memory (with Erase) - cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - cmd[3] = 0x00; - - err = flashio(dev,cmd,4,NULL,0); - if (err < 0 ) break; - - while( 1 ) - { - cmd[0] = 0xD7; // Read Status register - err = flashio(dev,cmd,1,&cmd[0],1); - if (err < 0 ) break; - if ((cmd[0] & 0x80) == 0x80 ) break; - } - if (err < 0 ) break; - } - return err; -} - -int FlashWriteSSTI(int dev, uint32_t FlashOffset, uint8_t *Buffer, int BufferSize) -{ - int err = 0; - uint8_t cmd[6]; - int i, j; - - // Must be multiple of sector size - if ((BufferSize % 4096) != 0 ) - return -1; - - do { - cmd[0] = 0x50; // EWSR - err = flashio(dev,cmd,1,NULL,0); - if (err < 0 ) - break; - - cmd[0] = 0x01; // WRSR - cmd[1] = 0x00; // BPx = 0, Unlock all blocks - err = flashio(dev,cmd,2,NULL,0); - if (err < 0 ) - break; - - for (i = 0; i < BufferSize; i += 4096 ) { - if ((i & 0xFFFF) == 0 ) - printf(" Erase %08x\n",FlashOffset + i); - cmd[0] = 0x06; // WREN - err = flashio(dev,cmd,1,NULL,0); - if (err < 0 ) - break; - - cmd[0] = 0x20; // Sector erase ( 4Kb) - cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - cmd[3] = 0x00; - err = flashio(dev,cmd,4,NULL,0); - if (err < 0 ) - break; - - while(1) { - cmd[0] = 0x05; // RDRS - err = flashio(dev,cmd,1,&cmd[0],1); - if (err < 0 ) break; - if ((cmd[0] & 0x01) == 0 ) break; - } - if (err < 0 ) break; - } - if (err < 0 ) - break; - for (j = BufferSize - 4096; j >= 0; j -= 4096 ) { - if ((j & 0xFFFF) == 0 ) - printf(" Program %08x\n",FlashOffset + j); - - for (i = 0; i < 4096; i += 2 ) { - if (i == 0 ) { - cmd[0] = 0x06; // WREN - err = flashio(dev,cmd,1,NULL,0); - if (err < 0 ) - break; - - cmd[0] = 0xAD; // AAI - cmd[1] = ( (( FlashOffset + j ) >> 16) & 0xFF ); - cmd[2] = ( (( FlashOffset + j ) >> 8) & 0xFF ); - cmd[3] = 0x00; - cmd[4] = Buffer[j+i]; - cmd[5] = Buffer[j+i+1]; - err = flashio(dev,cmd,6,NULL,0); - } else { - cmd[0] = 0xAD; // AAI - cmd[1] = Buffer[j+i]; - cmd[2] = Buffer[j+i+1]; - err = flashio(dev,cmd,3,NULL,0); - } - if (err < 0 ) - break; - - while(1) { - cmd[0] = 0x05; // RDRS - err = flashio(dev,cmd,1,&cmd[0],1); - if (err < 0 ) break; - if ((cmd[0] & 0x01) == 0 ) break; - } - if (err < 0 ) break; - } - if (err < 0 ) break; - - cmd[0] = 0x04; // WDIS - err = flashio(dev,cmd,1,NULL,0); - if (err < 0 ) break; - - } - if (err < 0 ) break; - - cmd[0] = 0x50; // EWSR - err = flashio(dev,cmd,1,NULL,0); - if (err < 0 ) break; - - cmd[0] = 0x01; // WRSR - cmd[1] = 0x1C; // BPx = 0, Lock all blocks - err = flashio(dev,cmd,2,NULL,0); - } while(0); - return err; -} - static int get_id(struct ddflash *ddf) { uint8_t id[4]; @@ -677,19 +445,6 @@ static int get_id(struct ddflash *ddf) { ddf->id.subvendor, ddf->id.subdevice, ddf->id.hw, ddf->id.regmap); #endif - if (ddf->id.device == 0x0011) - ddf->type = 1; - if (ddf->id.device == 0x0201) - ddf->type = 2; - if (ddf->id.device == 0x02) - ddf->type = 3; - if (ddf->id.device == 0x03) - ddf->type = 0; - if (ddf->id.device == 0x0300) - ddf->type = 4; - if (ddf->id.device == 0x0320) - ddf->type = 5; - return 0; } diff --git a/apps/octonet/ddtest.c b/apps/octonet/ddtest.c index de71ea1..f5bbb1b 100644 --- a/apps/octonet/ddtest.c +++ b/apps/octonet/ddtest.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -12,8 +13,6 @@ #include "flash.h" -static uint32_t linknr = 0; - typedef int (*COMMAND_FUNCTION)(int dev, int argc, char* argv[], uint32_t Flags); enum { @@ -21,17 +20,6 @@ enum { SILENT_FLAG = 0x00000002, }; -enum { - UNKNOWN_FLASH = 0, - ATMEL_AT45DB642D = 1, - SSTI_SST25VF016B = 2, - SSTI_SST25VF032B = 3, - SSTI_SST25VF064C = 4, - SPANSION_S25FL116K = 5, - SPANSION_S25FL132K = 6, - SPANSION_S25FL164K = 7, -}; - struct SCommand { char* Name; @@ -42,83 +30,6 @@ struct SCommand // -------------------------------------------------------------------------------------------- -void Dump(const uint8_t *b, uint32_t start, int l) -{ - int i, j; - - for (j = 0; j < l; j += 16, b += 16) { - printf("%08x: ", start + j); - for (i = 0; i < 16; i++) - if (i + j < l) - printf("%02x ", b[i]); - else - printf(" "); - printf(" |"); - for (i = 0; i < 16; i++) - if (i + j < l) - putchar((b[i] > 31 && b[i] < 127) ? b[i] : '.'); - printf("|\n"); - } -} - -int readreg(int dev, uint32_t RegAddress, uint32_t *pRegValue) -{ - struct ddb_reg reg = { .reg = RegAddress }; - int ret; - - ret = ioctl(dev, IOCTL_DDB_READ_REG, ®); - if (ret < 0) - return ret; - if (pRegValue) - *pRegValue = reg.val; - return 0; -} - -int writereg(int dev, uint32_t RegAddress, uint32_t RegValue) -{ - struct ddb_reg reg = { .reg = RegAddress, .val = RegValue}; - - return ioctl(dev, IOCTL_DDB_WRITE_REG, ®); -} - -int FlashIO(int ddb, uint8_t *wbuf, uint32_t wlen, uint8_t *rbuf, uint32_t rlen) -{ - struct ddb_flashio fio = { - .write_buf=wbuf, - .write_len=wlen, - .read_buf=rbuf, - .read_len=rlen, - .link=linknr, - }; - - return ioctl(ddb, IOCTL_DDB_FLASHIO, &fio); -} - -int flashread(int ddb, uint8_t *buf, uint32_t addr, uint32_t len) -{ - int ret; - uint8_t cmd[4]; - uint32_t l; - - while (len) { - cmd[0] = 3; - cmd[1] = (addr >> 16) & 0xff; - cmd[2] = (addr >> 8) & 0xff; - cmd[3] = addr & 0xff; - - if (len > 1024) - l = 1024; - else - l = len; - ret = FlashIO(ddb, cmd, 4, buf, l); - if (ret < 0) - return ret; - addr += l; - buf += l; - len -= l; - } - return 0; -} int ReadFlash(int ddb, int argc, char *argv[], uint32_t Flags) { @@ -183,61 +94,6 @@ int ReadSave(int ddb, int argc, char *argv[], uint32_t Flags) } -int FlashDetect(int dev) -{ - uint8_t Cmd = 0x9F; - uint8_t Id[3]; - - int r = FlashIO(dev, &Cmd, 1, Id, 3); - if (r < 0) - return r; - - if (Id[0] == 0xBF && Id[1] == 0x25 && Id[2] == 0x41) - r = SSTI_SST25VF016B; - else if (Id[0] == 0xBF && Id[1] == 0x25 && Id[2] == 0x4A) - r = SSTI_SST25VF032B; - else if ( Id[0] == 0xBF && Id[1] == 0x25 && Id[2] == 0x4B ) - r = SSTI_SST25VF064C; - else if ( Id[0] == 0x01 && Id[1] == 0x40 && Id[2] == 0x15 ) - r = SPANSION_S25FL116K; - else if ( Id[0] == 0x01 && Id[1] == 0x40 && Id[2] == 0x16 ) - r = SPANSION_S25FL132K; - else if ( Id[0] == 0x01 && Id[1] == 0x40 && Id[2] == 0x17 ) - r = SPANSION_S25FL164K; - else if ( Id[0] == 0x1F && Id[1] == 0x28) - r = ATMEL_AT45DB642D; - else - r = UNKNOWN_FLASH; - - switch(r) { - case UNKNOWN_FLASH : - printf("Unknown Flash Flash ID = %02x %02x %02x\n",Id[0],Id[1],Id[2]); - break; - case ATMEL_AT45DB642D : - printf("Flash: Atmel AT45DB642D 64 MBit\n"); - break; - case SSTI_SST25VF016B : - printf("Flash: SSTI SST25VF016B 16 MBit\n"); - break; - case SSTI_SST25VF032B : - printf("Flash: SSTI SST25VF032B 32 MBit\n"); - break; - case SSTI_SST25VF064C : - printf("Flash: SSTI SST25VF064C 64 MBit\n"); - break; - case SPANSION_S25FL116K : - printf("Flash: SPANSION S25FL116K 16 MBit\n"); - break; - case SPANSION_S25FL132K : - printf("Flash: SPANSION S25FL132K 32 MBit\n"); - break; - case SPANSION_S25FL164K : - printf("Flash: SPANSION S25FL164K 64 MBit\n"); - break; - } - return r; -} - int FlashChipEraseAtmel(int dev) { int err = 0; @@ -252,12 +108,12 @@ int FlashChipEraseAtmel(int dev) Cmd[1] = ( (( i ) >> 16) & 0xFF ); Cmd[2] = ( (( i ) >> 8) & 0xFF ); Cmd[3] = 0x00; - err = FlashIO(dev,Cmd,4,NULL,0); + err = flashio(dev,Cmd,4,NULL,0); if( err < 0 ) break; while (1) { Cmd[0] = 0xD7; // Read Status register - err = FlashIO(dev,Cmd,1,&Cmd[0],1); + err = flashio(dev,Cmd,1,&Cmd[0],1); if( err < 0 ) break; if( (Cmd[0] & 0x80) == 0x80 ) break; } @@ -275,25 +131,25 @@ int FlashChipEraseSSTI(int dev) do { Cmd[0] = 0x50; // EWSR - err = FlashIO(dev,Cmd,1,NULL,0); + err = flashio(dev,Cmd,1,NULL,0); if( err < 0 ) break; Cmd[0] = 0x01; // WRSR Cmd[1] = 0x00; // BPx = 0, Unlock all blocks - err = FlashIO(dev,Cmd,2,NULL,0); + err = flashio(dev,Cmd,2,NULL,0); if( err < 0 ) break; Cmd[0] = 0x06; // WREN - err = FlashIO(dev,Cmd,1,NULL,0); + err = flashio(dev,Cmd,1,NULL,0); if( err < 0 ) break; Cmd[0] = 0x60; // CHIP Erase - err = FlashIO(dev,Cmd,1,NULL,0); + err = flashio(dev,Cmd,1,NULL,0); if( err < 0 ) break; while(1) { Cmd[0] = 0x05; // RDRS - err = FlashIO(dev,Cmd,1,&Cmd[0],1); + err = flashio(dev,Cmd,1,&Cmd[0],1); if( err < 0 ) break; if( (Cmd[0] & 0x01) == 0 ) break; } @@ -301,12 +157,12 @@ int FlashChipEraseSSTI(int dev) break; Cmd[0] = 0x50; // EWSR - err = FlashIO(dev,Cmd,1,NULL,0); + err = flashio(dev,Cmd,1,NULL,0); if( err < 0 ) break; Cmd[0] = 0x01; // WRSR Cmd[1] = 0x1C; // BPx = 0, Lock all blocks - err = FlashIO(dev,Cmd,2,NULL,0); + err = flashio(dev,Cmd,2,NULL,0); } while(0); @@ -316,286 +172,6 @@ int FlashChipEraseSSTI(int dev) } -int FlashWriteAtmel(int dev,uint32_t FlashOffset,uint8_t * Buffer,int BufferSize) -{ - int err = 0, i; - int BlockErase = BufferSize >= 8192; - uint8_t Cmd[4]; - - if( BlockErase ) { - for(i = 0; i < BufferSize; i += 8192 ) { - if( (i & 0xFFFF) == 0 ) - { - printf(" Erase %08x\n",FlashOffset + i); - } - Cmd[0] = 0x50; // Block Erase - Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - err = FlashIO(dev,Cmd,4,NULL,0); - if( err < 0 ) break; - - while(1) { - Cmd[0] = 0xD7; // Read Status register - err = FlashIO(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x80) == 0x80 ) break; - } - } - } - - for(i = 0; i < BufferSize; i += 1024 ) - { - if( (i & 0xFFFF) == 0 ) - { - printf(" Programm %08x\n",FlashOffset + i); - } - uint8_t Cmd[4 + 1024]; - Cmd[0] = 0x84; // Buffer 1 - Cmd[1] = 0x00; - Cmd[2] = 0x00; - Cmd[3] = 0x00; - memcpy(&Cmd[4],&Buffer[i],1024); - - err = FlashIO(dev,Cmd,4 + 1024,NULL,0); - if( err < 0 ) break; - - Cmd[0] = BlockErase ? 0x88 : 0x83; // Buffer to Main Memory (with Erase) - Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - - err = FlashIO(dev,Cmd,4,NULL,0); - if( err < 0 ) break; - - while(1) - { - Cmd[0] = 0xD7; // Read Status register - err = FlashIO(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x80) == 0x80 ) break; - } - if( err < 0 ) break; - } - return err; -} - -// ************************************************************************************** -// BUG: Erasing and writing an incomplete image will result in an failure to boot golden image. -// FIX: Write the new image from high to low addresses - -int FlashWriteSSTI(int dev,uint32_t FlashOffset,uint8_t * Buffer,int BufferSize) -{ - int err = 0, i, j; - uint8_t Cmd[6]; - - if( (BufferSize % 4096) != 0 ) return -1; // Must be multiple of sector size - - do - { - Cmd[0] = 0x50; // EWSR - err = FlashIO(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x01; // WRSR - Cmd[1] = 0x00; // BPx = 0, Unlock all blocks - err = FlashIO(dev,Cmd,2,NULL,0); - if( err < 0 ) break; - - for (i = 0; i < BufferSize; i += 4096 ) - { - if( (i & 0xFFFF) == 0 ) - { - printf(" Erase %08x\n",FlashOffset + i); - } - - Cmd[0] = 0x06; // WREN - err = FlashIO(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x20; // Sector erase ( 4Kb) - Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - err = FlashIO(dev,Cmd,4,NULL,0); - if( err < 0 ) break; - - while(1) - { - Cmd[0] = 0x05; // RDRS - err = FlashIO(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x01) == 0 ) break; - } - if( err < 0 ) break; - - } - if( err < 0 ) break; - - - for (j = BufferSize - 4096; j >= 0; j -= 4096 ) - { - if( (j & 0xFFFF) == 0 ) - { - printf(" Programm %08x\n",FlashOffset + j); - } - - for (i = 0; i < 4096; i += 2 ) - { - - if( i == 0 ) - { - Cmd[0] = 0x06; // WREN - err = FlashIO(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0xAD; // AAI - Cmd[1] = ( (( FlashOffset + j ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + j ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - Cmd[4] = Buffer[j+i]; - Cmd[5] = Buffer[j+i+1]; - err = FlashIO(dev,Cmd,6,NULL,0); - } - else - { - Cmd[0] = 0xAD; // AAI - Cmd[1] = Buffer[j+i]; - Cmd[2] = Buffer[j+i+1]; - err = FlashIO(dev,Cmd,3,NULL,0); - } - if( err < 0 ) break; - - while(1) - { - Cmd[0] = 0x05; // RDRS - err = FlashIO(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x01) == 0 ) break; - } - if( err < 0 ) break; - } - if( err < 0 ) break; - - Cmd[0] = 0x04; // WDIS - err = FlashIO(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - } - if( err < 0 ) break; - - - Cmd[0] = 0x50; // EWSR - err = FlashIO(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x01; // WRSR - Cmd[1] = 0x1C; // BPx = 0, Lock all blocks - err = FlashIO(dev,Cmd,2,NULL,0); - - } - while(0); - return err; -} - - - -int FlashWritePageMode(int dev, uint32_t FlashOffset, - uint8_t *Buffer,int BufferSize,uint8_t LockBits) -{ - int err = 0; - uint8_t Cmd[260]; - int i, j; - - if( (BufferSize % 4096) != 0 ) return -1; // Must be multiple of sector size - - do - { - Cmd[0] = 0x50; // EWSR - err = FlashIO(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x01; // WRSR - Cmd[1] = 0x00; // BPx = 0, Unlock all blocks - err = FlashIO(dev,Cmd,2,NULL,0); - if( err < 0 ) break; - - for(i = 0; i < BufferSize; i += 4096 ) - { - if( (i & 0xFFFF) == 0 ) - { - printf(" Erase %08x\n",FlashOffset + i); - } - - Cmd[0] = 0x06; // WREN - err = FlashIO(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x20; // Sector erase ( 4Kb) - Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - err = FlashIO(dev,Cmd,4,NULL,0); - if( err < 0 ) break; - - while(1) - { - Cmd[0] = 0x05; // RDRS - err = FlashIO(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x01) == 0 ) break; - } - if( err < 0 ) break; - - } - if( err < 0 ) break; - - - for(j = BufferSize - 256; j >= 0; j -= 256 ) - { - if( (j & 0xFFFF) == 0 ) - { - printf(" Programm %08x\n",FlashOffset + j); - } - - Cmd[0] = 0x06; // WREN - err = FlashIO(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x02; // PP - Cmd[1] = ( (( FlashOffset + j ) >> 16) & 0xFF ); - Cmd[2] = ( (( FlashOffset + j ) >> 8) & 0xFF ); - Cmd[3] = 0x00; - memcpy(&Cmd[4],&Buffer[j],256); - err = FlashIO(dev,Cmd,260,NULL,0); - if( err < 0 ) break; - - while(1) - { - Cmd[0] = 0x05; // RDRS - err = FlashIO(dev,Cmd,1,&Cmd[0],1); - if( err < 0 ) break; - if( (Cmd[0] & 0x01) == 0 ) break; - } - if( err < 0 ) break; - - } - if( err < 0 ) break; - - Cmd[0] = 0x50; // EWSR - err = FlashIO(dev,Cmd,1,NULL,0); - if( err < 0 ) break; - - Cmd[0] = 0x01; // WRSR - Cmd[1] = LockBits; // BPx = 0, Lock all blocks - err = FlashIO(dev,Cmd,2,NULL,0); - - } - while(0); - return err; -} - -// -------------------------------------------------------------------------------------------- int ReadDeviceMemory(int dev,int argc, char* argv[],uint32_t Flags) { @@ -731,7 +307,7 @@ int GetSetRegister(int dev,int argc, char* argv[],uint32_t Flags) // ----------------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------------- -int FlashIOC(int dev,int argc, char* argv[],uint32_t Flags) +int flashioc(int dev,int argc, char* argv[],uint32_t Flags) { uint8_t *Buffer; uint32_t tmp = 0, i; @@ -756,7 +332,7 @@ int FlashIOC(int dev,int argc, char* argv[],uint32_t Flags) Buffer[i] = (uint8_t) tmp; } - if( FlashIO(dev,Buffer,WriteLen,Buffer,ReadLen) < 0 ) + if( flashio(dev,Buffer,WriteLen,Buffer,ReadLen) < 0 ) { return 0; } @@ -1693,7 +1269,7 @@ static int read_sfpd(int dev, uint8_t adr, uint8_t *val) uint8_t cmd[5] = { 0x5a, 0, 0, adr, 00 }; int r; - r = FlashIO(dev, cmd, 5, val, 1); + r = flashio(dev, cmd, 5, val, 1); if (r < 0) return r; return 0; @@ -1705,7 +1281,7 @@ static int read_sst_id(int dev, uint8_t *id) uint8_t buf[9]; int r; - r = FlashIO(dev, cmd, 2, buf, 9); + r = flashio(dev, cmd, 2, buf, 9); if (r < 0) return r; memcpy(id, buf + 1, 8); @@ -1751,7 +1327,7 @@ struct SCommand CommandTable[] = { "register", GetSetRegister, 1, "Get/Set Register : reg |<[0x]regnum> [[0x]value(32)]" }, { "flashread", ReadFlash, 1, "Read Flash : flashread []" }, - { "flashio", FlashIOC, 1, "Flash IO : flashio .. " }, + { "flashio", flashioc, 1, "Flash IO : flashio .. " }, { "flashprog", FlashProg, 1, "Flash Programming : flashprog [
]" }, { "flashprog", FlashProg, 1, "Flash Programming : flashprog -SubVendorID " }, { "flashprog", FlashProg, 1, "Flash Programming : flashprog -Jump
" }, diff --git a/apps/octonet/flash.c b/apps/octonet/flash.c new file mode 100644 index 0000000..7ccfb61 --- /dev/null +++ b/apps/octonet/flash.c @@ -0,0 +1,614 @@ +enum { + UNKNOWN_FLASH = 0, + ATMEL_AT45DB642D = 1, + SSTI_SST25VF016B = 2, + SSTI_SST25VF032B = 3, + SSTI_SST25VF064C = 4, + SPANSION_S25FL116K = 5, + SPANSION_S25FL132K = 6, + SPANSION_S25FL164K = 7, +}; + +static uint32_t linknr = 0; + +int flashio(int ddb, uint8_t *wbuf, uint32_t wlen, uint8_t *rbuf, uint32_t rlen) +{ + struct ddb_flashio fio = { + .write_buf=wbuf, + .write_len=wlen, + .read_buf=rbuf, + .read_len=rlen, + .link=linknr, + }; + + return ioctl(ddb, IOCTL_DDB_FLASHIO, &fio); +} + +int FlashDetect(int dev) +{ + uint8_t Cmd = 0x9F; + uint8_t Id[3]; + + int r = flashio(dev, &Cmd, 1, Id, 3); + if (r < 0) + return r; + + if (Id[0] == 0xBF && Id[1] == 0x25 && Id[2] == 0x41) + r = SSTI_SST25VF016B; + else if (Id[0] == 0xBF && Id[1] == 0x25 && Id[2] == 0x4A) + r = SSTI_SST25VF032B; + else if ( Id[0] == 0xBF && Id[1] == 0x25 && Id[2] == 0x4B ) + r = SSTI_SST25VF064C; + else if ( Id[0] == 0x01 && Id[1] == 0x40 && Id[2] == 0x15 ) + r = SPANSION_S25FL116K; + else if ( Id[0] == 0x01 && Id[1] == 0x40 && Id[2] == 0x16 ) + r = SPANSION_S25FL132K; + else if ( Id[0] == 0x01 && Id[1] == 0x40 && Id[2] == 0x17 ) + r = SPANSION_S25FL164K; + else if ( Id[0] == 0x1F && Id[1] == 0x28) + r = ATMEL_AT45DB642D; + else + r = UNKNOWN_FLASH; + + switch(r) { + case UNKNOWN_FLASH : + printf("Unknown Flash Flash ID = %02x %02x %02x\n",Id[0],Id[1],Id[2]); + break; + case ATMEL_AT45DB642D : + printf("Flash: Atmel AT45DB642D 64 MBit\n"); + break; + case SSTI_SST25VF016B : + printf("Flash: SSTI SST25VF016B 16 MBit\n"); + break; + case SSTI_SST25VF032B : + printf("Flash: SSTI SST25VF032B 32 MBit\n"); + break; + case SSTI_SST25VF064C : + printf("Flash: SSTI SST25VF064C 64 MBit\n"); + break; + case SPANSION_S25FL116K : + printf("Flash: SPANSION S25FL116K 16 MBit\n"); + break; + case SPANSION_S25FL132K : + printf("Flash: SPANSION S25FL132K 32 MBit\n"); + break; + case SPANSION_S25FL164K : + printf("Flash: SPANSION S25FL164K 64 MBit\n"); + break; + } + return r; +} + + +static int flashdetect(int fd, uint32_t *sector_size, uint32_t *flash_size) +{ + uint8_t cmd = 0x9F; + uint8_t id[3]; + int flash_type; + + int r = flashio(fd, &cmd, 1, id, 3); + if (r < 0) + return r; + + if (id[0] == 0xBF && id[1] == 0x25 && id[2] == 0x41) { + flash_type = SSTI_SST25VF016B; + printf("Flash: SSTI SST25VF016B 16 MBit\n"); + *sector_size = 4096; + *flash_size = 0x200000; + } else if (id[0] == 0xBF && id[1] == 0x25 && id[2] == 0x4A) { + flash_type = SSTI_SST25VF032B; + printf("Flash: SSTI SST25VF032B 32 MBit\n"); + *sector_size = 4096; + *flash_size = 0x400000; + } else if (id[0] == 0xBF && id[1] == 0x25 && id[2] == 0x4B) { + flash_type = SSTI_SST25VF064C; + printf("Flash: SSTI SST25VF064C 64 MBit\n"); + *sector_size = 4096; + *flash_size = 0x800000; + } else if (id[0] == 0x01 && id[1] == 0x40 && id[2] == 0x15) { + flash_type = SPANSION_S25FL116K; + printf("Flash: SPANSION S25FL116K 16 MBit\n"); + *sector_size = 4096; + *flash_size = 0x200000; + } else if (id[0] == 0x01 && id[1] == 0x40 && id[2] == 0x16) { + flash_type = SPANSION_S25FL132K; + printf("Flash: SPANSION S25FL132K 32 MBit\n"); + *sector_size = 4096; + *flash_size = 0x400000; + } else if (id[0] == 0x01 && id[1] == 0x40 && id[2] == 0x17) { + flash_type = SPANSION_S25FL164K; + printf("Flash: SPANSION S25FL164K 64 MBit\n"); + *sector_size = 4096; + *flash_size = 0x800000; + } else if (id[0] == 0x1F && id[1] == 0x28) { + flash_type = ATMEL_AT45DB642D; + printf("Flash: Atmel AT45DB642D 64 MBit\n"); + *sector_size = 1024; + *flash_size = 0x800000; + } else { + printf("Unknown Flash Flash ID = %02x %02x %02x\n", id[0], id[1], id[2]); + return -1; + } + return flash_type; +} + + +#if 1 +int flashread(int ddb, uint8_t *buf, uint32_t addr, uint32_t len) +{ + int ret; + uint8_t cmd[4]; + uint32_t l; + + while (len) { + cmd[0] = 3; + cmd[1] = (addr >> 16) & 0xff; + cmd[2] = (addr >> 8) & 0xff; + cmd[3] = addr & 0xff; + + if (len > 1024) + l = 1024; + else + l = len; + ret = flashio(ddb, cmd, 4, buf, l); + if (ret < 0) + return ret; + addr += l; + buf += l; + len -= l; + } + return 0; +} +#else +static int flashread(int ddb, uint8_t *buf, uint32_t addr, uint32_t len) +{ + uint8_t cmd[4]= {0x03, (addr >> 16) & 0xff, + (addr >> 8) & 0xff, addr & 0xff}; + + return flashio(ddb, cmd, 4, buf, len); +} +#endif + +int flashdump(int ddb, uint32_t addr, uint32_t len) +{ + int i, j; + uint8_t buf[32]; + int bl = sizeof(buf); + + for (j=0; j 31 && b[i] < 127) ? b[i] : '.'); + printf("\n"); + } +} + +void Dump(const uint8_t *b, uint32_t start, int l) +{ + int i, j; + + for (j = 0; j < l; j += 16, b += 16) { + printf("%08x: ", start + j); + for (i = 0; i < 16; i++) + if (i + j < l) + printf("%02x ", b[i]); + else + printf(" "); + printf(" |"); + for (i = 0; i < 16; i++) + if (i + j < l) + putchar((b[i] > 31 && b[i] < 127) ? b[i] : '.'); + printf("|\n"); + } +} + + + + +int FlashWriteAtmel(int dev,uint32_t FlashOffset, uint8_t *Buffer,int BufferSize) +{ + int err = 0; + int BlockErase = BufferSize >= 8192; + int i; + + if (BlockErase) { + for(i = 0; i < BufferSize; i += 8192 ) { + uint8_t Cmd[4]; + if( (i & 0xFFFF) == 0 ) + printf(" Erase %08x\n",FlashOffset + i); + Cmd[0] = 0x50; // Block Erase + Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); + Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); + Cmd[3] = 0x00; + err = flashio(dev,Cmd,4,NULL,0); + if( err < 0 ) break; + + while( 1 ) + { + Cmd[0] = 0xD7; // Read Status register + err = flashio(dev,Cmd,1,&Cmd[0],1); + if( err < 0 ) break; + if( (Cmd[0] & 0x80) == 0x80 ) break; + } + } + } + + for(i = 0; i < BufferSize; i += 1024 ) + { + uint8_t Cmd[4 + 1024]; + if( (i & 0xFFFF) == 0 ) + { + printf(" Program %08x\n",FlashOffset + i); + } + Cmd[0] = 0x84; // Buffer 1 + Cmd[1] = 0x00; + Cmd[2] = 0x00; + Cmd[3] = 0x00; + memcpy(&Cmd[4],&Buffer[i],1024); + + err = flashio(dev,Cmd,4 + 1024,NULL,0); + if( err < 0 ) break; + + Cmd[0] = BlockErase ? 0x88 : 0x83; // Buffer to Main Memory (with Erase) + Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); + Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); + Cmd[3] = 0x00; + + err = flashio(dev,Cmd,4,NULL,0); + if( err < 0 ) break; + + while( 1 ) + { + Cmd[0] = 0xD7; // Read Status register + err = flashio(dev,Cmd,1,&Cmd[0],1); + if( err < 0 ) break; + if( (Cmd[0] & 0x80) == 0x80 ) break; + } + if( err < 0 ) break; + } + return err; +} + + +int FlashWriteSSTI(int dev, uint32_t FlashOffset, uint8_t *Buffer, int BufferSize) +{ + int err = 0; + uint8_t cmd[6]; + int i, j; + + // Must be multiple of sector size + if ((BufferSize % 4096) != 0 ) + return -1; + + do { + cmd[0] = 0x50; // EWSR + err = flashio(dev,cmd,1,NULL,0); + if (err < 0 ) + break; + + cmd[0] = 0x01; // WRSR + cmd[1] = 0x00; // BPx = 0, Unlock all blocks + err = flashio(dev,cmd,2,NULL,0); + if (err < 0 ) + break; + + for (i = 0; i < BufferSize; i += 4096 ) { + if ((i & 0xFFFF) == 0 ) + printf(" Erase %08x\n",FlashOffset + i); + cmd[0] = 0x06; // WREN + err = flashio(dev,cmd,1,NULL,0); + if (err < 0 ) + break; + + cmd[0] = 0x20; // Sector erase ( 4Kb) + cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); + cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); + cmd[3] = 0x00; + err = flashio(dev,cmd,4,NULL,0); + if (err < 0 ) + break; + + while(1) { + cmd[0] = 0x05; // RDRS + err = flashio(dev,cmd,1,&cmd[0],1); + if (err < 0 ) break; + if ((cmd[0] & 0x01) == 0 ) break; + } + if (err < 0 ) break; + } + if (err < 0 ) + break; + for (j = BufferSize - 4096; j >= 0; j -= 4096 ) { + if ((j & 0xFFFF) == 0 ) + printf(" Program %08x\n",FlashOffset + j); + + for (i = 0; i < 4096; i += 2 ) { + if (i == 0 ) { + cmd[0] = 0x06; // WREN + err = flashio(dev,cmd,1,NULL,0); + if (err < 0 ) + break; + + cmd[0] = 0xAD; // AAI + cmd[1] = ( (( FlashOffset + j ) >> 16) & 0xFF ); + cmd[2] = ( (( FlashOffset + j ) >> 8) & 0xFF ); + cmd[3] = 0x00; + cmd[4] = Buffer[j+i]; + cmd[5] = Buffer[j+i+1]; + err = flashio(dev,cmd,6,NULL,0); + } else { + cmd[0] = 0xAD; // AAI + cmd[1] = Buffer[j+i]; + cmd[2] = Buffer[j+i+1]; + err = flashio(dev,cmd,3,NULL,0); + } + if (err < 0 ) + break; + + while(1) { + cmd[0] = 0x05; // RDRS + err = flashio(dev,cmd,1,&cmd[0],1); + if (err < 0 ) break; + if ((cmd[0] & 0x01) == 0 ) break; + } + if (err < 0 ) break; + } + if (err < 0 ) break; + + cmd[0] = 0x04; // WDIS + err = flashio(dev,cmd,1,NULL,0); + if (err < 0 ) break; + + } + if (err < 0 ) break; + + cmd[0] = 0x50; // EWSR + err = flashio(dev,cmd,1,NULL,0); + if (err < 0 ) break; + + cmd[0] = 0x01; // WRSR + cmd[1] = 0x1C; // BPx = 0, Lock all blocks + err = flashio(dev,cmd,2,NULL,0); + } while(0); + return err; +} + +int FlashWriteSSTI_B(int dev, uint32_t FlashOffset, uint8_t *Buffer, int BufferSize) +{ + int err = 0; + uint8_t Cmd[6]; + int i, j; + + // Must be multiple of sector size + if( (BufferSize % 4096) != 0 ) + return -1; + + do { + Cmd[0] = 0x50; // EWSR + err = flashio(dev,Cmd,1,NULL,0); + if( err < 0 ) + break; + + Cmd[0] = 0x01; // WRSR + Cmd[1] = 0x00; // BPx = 0, Unlock all blocks + err = flashio(dev,Cmd,2,NULL,0); + if( err < 0 ) + break; + + for(i = 0; i < BufferSize; i += 4096 ) { + if( (i & 0xFFFF) == 0 ) + printf(" Erase %08x\n",FlashOffset + i); + Cmd[0] = 0x06; // WREN + err = flashio(dev,Cmd,1,NULL,0); + if( err < 0 ) + break; + + Cmd[0] = 0x20; // Sector erase ( 4Kb) + Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); + Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); + Cmd[3] = 0x00; + err = flashio(dev,Cmd,4,NULL,0); + if( err < 0 ) + break; + + while(1) { + Cmd[0] = 0x05; // RDRS + err = flashio(dev,Cmd,1,&Cmd[0],1); + if( err < 0 ) break; + if( (Cmd[0] & 0x01) == 0 ) break; + } + if( err < 0 ) break; + } + if( err < 0 ) + break; + for(j = BufferSize - 4096; j >= 0; j -= 4096 ) { + if( (j & 0xFFFF) == 0 ) + printf(" Program %08x\n",FlashOffset + j); + + for(i = 0; i < 4096; i += 2 ) { + if( i == 0 ) { + Cmd[0] = 0x06; // WREN + err = flashio(dev,Cmd,1,NULL,0); + if( err < 0 ) + break; + + Cmd[0] = 0xAD; // AAI + Cmd[1] = ( (( FlashOffset + j ) >> 16) & 0xFF ); + Cmd[2] = ( (( FlashOffset + j ) >> 8) & 0xFF ); + Cmd[3] = 0x00; + Cmd[4] = Buffer[j+i]; + Cmd[5] = Buffer[j+i+1]; + err = flashio(dev,Cmd,6,NULL,0); + } else { + Cmd[0] = 0xAD; // AAI + Cmd[1] = Buffer[j+i]; + Cmd[2] = Buffer[j+i+1]; + err = flashio(dev,Cmd,3,NULL,0); + } + if( err < 0 ) + break; + + while(1) { + Cmd[0] = 0x05; // RDRS + err = flashio(dev,Cmd,1,&Cmd[0],1); + if( err < 0 ) break; + if( (Cmd[0] & 0x01) == 0 ) break; + } + if( err < 0 ) break; + } + if( err < 0 ) break; + + Cmd[0] = 0x04; // WDIS + err = flashio(dev,Cmd,1,NULL,0); + if( err < 0 ) break; + + } + if( err < 0 ) break; + + Cmd[0] = 0x50; // EWSR + err = flashio(dev,Cmd,1,NULL,0); + if( err < 0 ) break; + + Cmd[0] = 0x01; // WRSR + Cmd[1] = 0x1C; // BPx = 0, Lock all blocks + err = flashio(dev,Cmd,2,NULL,0); + } while(0); + return err; +} + +int FlashWritePageMode(int dev, uint32_t FlashOffset, + uint8_t *Buffer,int BufferSize,uint8_t LockBits) +{ + int err = 0; + uint8_t Cmd[260]; + int i, j; + + if( (BufferSize % 4096) != 0 ) return -1; // Must be multiple of sector size + + do + { + Cmd[0] = 0x50; // EWSR + err = flashio(dev,Cmd,1,NULL,0); + if( err < 0 ) break; + + Cmd[0] = 0x01; // WRSR + Cmd[1] = 0x00; // BPx = 0, Unlock all blocks + err = flashio(dev,Cmd,2,NULL,0); + if( err < 0 ) break; + + for(i = 0; i < BufferSize; i += 4096 ) + { + if( (i & 0xFFFF) == 0 ) + { + printf(" Erase %08x\n",FlashOffset + i); + } + + Cmd[0] = 0x06; // WREN + err = flashio(dev,Cmd,1,NULL,0); + if( err < 0 ) break; + + Cmd[0] = 0x20; // Sector erase ( 4Kb) + Cmd[1] = ( (( FlashOffset + i ) >> 16) & 0xFF ); + Cmd[2] = ( (( FlashOffset + i ) >> 8) & 0xFF ); + Cmd[3] = 0x00; + err = flashio(dev,Cmd,4,NULL,0); + if( err < 0 ) break; + + while(1) + { + Cmd[0] = 0x05; // RDRS + err = flashio(dev,Cmd,1,&Cmd[0],1); + if( err < 0 ) break; + if( (Cmd[0] & 0x01) == 0 ) break; + } + if( err < 0 ) break; + + } + if( err < 0 ) break; + + + for(j = BufferSize - 256; j >= 0; j -= 256 ) + { + if( (j & 0xFFFF) == 0 ) + { + printf(" Programm %08x\n",FlashOffset + j); + } + + Cmd[0] = 0x06; // WREN + err = flashio(dev,Cmd,1,NULL,0); + if( err < 0 ) break; + + Cmd[0] = 0x02; // PP + Cmd[1] = ( (( FlashOffset + j ) >> 16) & 0xFF ); + Cmd[2] = ( (( FlashOffset + j ) >> 8) & 0xFF ); + Cmd[3] = 0x00; + memcpy(&Cmd[4],&Buffer[j],256); + err = flashio(dev,Cmd,260,NULL,0); + if( err < 0 ) break; + + while(1) + { + Cmd[0] = 0x05; // RDRS + err = flashio(dev,Cmd,1,&Cmd[0],1); + if( err < 0 ) break; + if( (Cmd[0] & 0x01) == 0 ) break; + } + if( err < 0 ) break; + + } + if( err < 0 ) break; + + Cmd[0] = 0x50; // EWSR + err = flashio(dev,Cmd,1,NULL,0); + if( err < 0 ) break; + + Cmd[0] = 0x01; // WRSR + Cmd[1] = LockBits; // BPx = 0, Lock all blocks + err = flashio(dev,Cmd,2,NULL,0); + + } + while(0); + return err; +} diff --git a/apps/octonet/flash.h b/apps/octonet/flash.h index 214d7b2..3b8c4c2 100644 --- a/apps/octonet/flash.h +++ b/apps/octonet/flash.h @@ -61,3 +61,5 @@ struct ddb_i2c_msg { #define IOCTL_DDB_WRITE_MDIO _IOR(DDB_MAGIC, 0x09, struct ddb_mdio) #define IOCTL_DDB_READ_I2C _IOWR(DDB_MAGIC, 0x0a, struct ddb_i2c_msg) #define IOCTL_DDB_WRITE_I2C _IOR(DDB_MAGIC, 0x0b, struct ddb_i2c_msg) + +#include "flash.c"