diff options
Diffstat (limited to 'main/common/spif.c')
-rw-r--r-- | main/common/spif.c | 764 |
1 files changed, 391 insertions, 373 deletions
diff --git a/main/common/spif.c b/main/common/spif.c index 3b8d91e..2027d82 100644 --- a/main/common/spif.c +++ b/main/common/spif.c @@ -1,7 +1,7 @@ /************************************************************************** * * Copyright (c) 2013 Alcatel-Lucent - * + * * Alcatel Lucent licenses this file to You under the Apache License, * Version 2.0 (the "License"); you may not use this file except in * compliance with the License. A copy of the License is contained the @@ -21,7 +21,7 @@ * spif.c: * * This is the generic portion of the spi-flash interface command. - * It assumes there is an underlying SPI-flash device interface + * It assumes there is an underlying SPI-flash device interface * that provides the expected API (see spif.h). * * The "tfs-specific" portions of this code support the model of having @@ -30,7 +30,7 @@ * tfsload: * Transfer a SPIF_TFS_SIZE area in SPI-flash from SPIF_TFS_BASE to - * FLASHRAM_BASE in RAM. + * FLASHRAM_BASE in RAM. * tfserase: * Erase the area in SPI-flash that is allocated to SPIF_TFS. * tfsstore: @@ -69,388 +69,406 @@ static unsigned long end_of_serialtfs; #endif char *SpifHelp[] = { - "Interface with SPI-Flash", - "-[v] {cmd} [arg1] [arg2] [...]", + "Interface with SPI-Flash", + "-[v] {cmd} [arg1] [arg2] [...]", #if INCLUDE_VERBOSEHELP - "Options:", - " -v incrementing verbosity level", - "", - "Cmds:", - " wen write enable", - " wfr wait-for-ready", - " stat show flash status register", - " gprot global protect", - " cerase chip erase", - " gunprot global unprotect", + "Options:", + " -v incrementing verbosity level", + "", + "Cmds:", + " wen write enable", + " wfr wait-for-ready", + " stat show flash status register", + " gprot global protect", + " cerase chip erase", + " gunprot global unprotect", #if INCLUDE_TFS - " tfsls list files directly out of SPI flash", - " tfsload copy SPIF to TFSRAM", - " tfsstat show state of SPI flash", - " tfsstore copy TFSRAM to SPIF", - " tfserase erase SPIF space allocated to TFS", - " tfsrm {name} remove file directly out of SPI flash", - " tfsadd {name} [src sz] add file directly to SPI flash", + " tfsls list files directly out of SPI flash", + " tfsload copy SPIF to TFSRAM", + " tfsstat show state of SPI flash", + " tfsstore copy TFSRAM to SPIF", + " tfserase erase SPIF space allocated to TFS", + " tfsrm {name} remove file directly out of SPI flash", + " tfsadd {name} [src sz] add file directly to SPI flash", #endif - " berase {addr bsize} block erase (bsize=4K,32K,64K)", - " read {addr dest len} read block", - " write {addr src len} write block", + " berase {addr bsize} block erase (bsize=4K,32K,64K)", + " read {addr dest len} read block", + " write {addr src len} write block", #endif - 0, + 0, }; int SpifCmd(int argc,char *argv[]) { - unsigned long addr; - char *cmd, *dest, *src; - int opt, verbose, len, bsize, rc; - - spif_tfs_size = spifGetTFSSize(); - spif_tfs_base = spifGetTFSBase(); - base_of_serialtfs = spif_tfs_base; - end_of_serialtfs = spif_tfs_base + spif_tfs_size; - - verbose = 0; - while((opt=getopt(argc,argv,"v")) != -1) { - switch(opt) { - case 'v': - verbose++; - break; - default: - return(CMD_PARAM_ERROR); - } - } - - if (argc < optind+1) - return(CMD_PARAM_ERROR); - - cmd = argv[optind]; - - if (verbose) - printf("CMD: %s\n",cmd); - - // Establish the SPI configuration to match that of the SPI flash... - spifQinit(); - - if (strcmp(cmd,"stat") == 0) { - spifId(1); - spifReadStatus(verbose+1); - } - else if (strcmp(cmd,"gprot") == 0) { - spifGlobalProtect(); - } - else if (strcmp(cmd,"berase") == 0) { - - if (argc != optind+3) - return(CMD_PARAM_ERROR); - - addr = strtoul(argv[optind+1],0,0); - - if (strcmp(argv[optind+2],"4K") == 0) - bsize = 0x1000; - else if (strcmp(argv[optind+2],"32K") == 0) - bsize = 0x8000; - else if (strcmp(argv[optind+2],"64K") == 0) - bsize = 0x10000; - else - return(CMD_PARAM_ERROR); - - spifBlockErase(bsize,addr); - } - else if (strcmp(cmd,"cerase") == 0) { - spifChipErase(); - } - else if (strcmp(cmd,"wfr") == 0) { - spifWaitForReady(); - } - else if (strcmp(cmd,"gunprot") == 0) { - spifGlobalUnprotect(); - } - else if (strcmp(cmd,"write") == 0) { - if (argc != optind+4) - return(CMD_PARAM_ERROR); - addr = strtoul(argv[optind+1],0,0); - src = (char *)strtoul(argv[optind+2],0,0); - len = (int)strtol(argv[optind+3],0,0); - if ((rc = spifWriteBlock(addr,src,len)) < 0) - printf("spifWriteBlock returned %d\n",rc); - - } - else if (strcmp(cmd,"read") == 0) { - if (argc != optind+4) - return(CMD_PARAM_ERROR); - addr = strtoul(argv[optind+1],0,0); - dest = (char *)strtoul(argv[optind+2],0,0); - len = (int)strtol(argv[optind+3],0,0); - if ((rc = spifReadBlock(addr,dest,len)) < 0) - printf("spifReadBlock returned %d\n",rc); - } - else if (strcmp(cmd,"wen") == 0) { - spifWriteEnable(); - } + unsigned long addr; + char *cmd, *dest, *src; + int opt, verbose, len, bsize, rc; + + spif_tfs_size = spifGetTFSSize(); + spif_tfs_base = spifGetTFSBase(); + base_of_serialtfs = spif_tfs_base; + end_of_serialtfs = spif_tfs_base + spif_tfs_size; + + verbose = 0; + while((opt=getopt(argc,argv,"v")) != -1) { + switch(opt) { + case 'v': + verbose++; + break; + default: + return(CMD_PARAM_ERROR); + } + } + + if(argc < optind+1) { + return(CMD_PARAM_ERROR); + } + + cmd = argv[optind]; + + if(verbose) { + printf("CMD: %s\n",cmd); + } + + // Establish the SPI configuration to match that of the SPI flash... + spifQinit(); + + if(strcmp(cmd,"stat") == 0) { + spifId(1); + spifReadStatus(verbose+1); + } else if(strcmp(cmd,"gprot") == 0) { + spifGlobalProtect(); + } else if(strcmp(cmd,"berase") == 0) { + + if(argc != optind+3) { + return(CMD_PARAM_ERROR); + } + + addr = strtoul(argv[optind+1],0,0); + + if(strcmp(argv[optind+2],"4K") == 0) { + bsize = 0x1000; + } else if(strcmp(argv[optind+2],"32K") == 0) { + bsize = 0x8000; + } else if(strcmp(argv[optind+2],"64K") == 0) { + bsize = 0x10000; + } else { + return(CMD_PARAM_ERROR); + } + + spifBlockErase(bsize,addr); + } else if(strcmp(cmd,"cerase") == 0) { + spifChipErase(); + } else if(strcmp(cmd,"wfr") == 0) { + spifWaitForReady(); + } else if(strcmp(cmd,"gunprot") == 0) { + spifGlobalUnprotect(); + } else if(strcmp(cmd,"write") == 0) { + if(argc != optind+4) { + return(CMD_PARAM_ERROR); + } + addr = strtoul(argv[optind+1],0,0); + src = (char *)strtoul(argv[optind+2],0,0); + len = (int)strtol(argv[optind+3],0,0); + if((rc = spifWriteBlock(addr,src,len)) < 0) { + printf("spifWriteBlock returned %d\n",rc); + } + + } else if(strcmp(cmd,"read") == 0) { + if(argc != optind+4) { + return(CMD_PARAM_ERROR); + } + addr = strtoul(argv[optind+1],0,0); + dest = (char *)strtoul(argv[optind+2],0,0); + len = (int)strtol(argv[optind+3],0,0); + if((rc = spifReadBlock(addr,dest,len)) < 0) { + printf("spifReadBlock returned %d\n",rc); + } + } else if(strcmp(cmd,"wen") == 0) { + spifWriteEnable(); + } #if INCLUDE_TFS - else if (strcmp(cmd,"tfsload") == 0) { - rc = spifReadBlock(spif_tfs_base,(char *)FLASHRAM_BASE,spifGetTFSSize()); - if (rc < 0) - printf("spifReadBlock returned %d\n",rc); - } - else if (strcmp(cmd,"tfsstore") == 0) { - spifWriteEnable(); - spifGlobalUnprotect(); - rc = spifWriteBlock(spif_tfs_base,(char *)FLASHRAM_BASE,spifGetTFSSize()); - if (rc < 0) - printf("spifWriteBlock returned %d\n",rc); - spifGlobalProtect(); - } - else if (strcmp(cmd,"tfserase") == 0) { - spifWriteEnable(); - spifGlobalUnprotect(); - addr = spif_tfs_base; - while (addr < (spif_tfs_base+spif_tfs_size)) { - spifWriteEnable(); - rc = spifBlockErase(0x10000,addr); - if (rc < 0) { - printf("spifBlockErase(0x%lx) returned %d\n",addr,rc); - break; - } - if (verbose) - //ticktock(); - printf("%lx ",addr); - addr += 0x10000; - } - spifGlobalProtect(); - } - else if (strcmp(cmd, "tfsls") == 0) { - int ftot; - unsigned long addr; - TFILE tfshdr, *fp; - - ftot = 0; - fp = &tfshdr; - addr = base_of_serialtfs; - while(addr < end_of_serialtfs) { - char fbuf[32], *flags; - - if ((rc = spifReadBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { - printf("spifReadBlock failed %d\n",rc); - break; - } - if (fp->hdrsize == 0xffff) - break; - if (TFS_FILEEXISTS(fp)) { - if (ftot == 0) - printf(" Name Size Offset Flags Info\n"); - ftot++; - flags = tfsflagsbtoa(TFS_FLAGS(fp),fbuf); - if ((!flags) || (!fbuf[0])) - flags = " "; - printf(" %-23s %7ld 0x%08lx %-5s %s\n",TFS_NAME(fp), - TFS_SIZE(fp),(unsigned long)(addr+TFSHDRSIZ), - flags,TFS_INFO(fp)); - } - addr += TFS_SIZE(fp); - addr += TFSHDRSIZ; - while(addr & 0xf) addr++; - } - } - else if (strcmp(cmd, "tfsrm") == 0) { - unsigned long addr; - TFILE tfshdr, *fp; - char *arg2 = argv[optind+1]; - - fp = &tfshdr; - addr = base_of_serialtfs; - while(addr < end_of_serialtfs) { - if ((rc = spifReadBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { - printf("spifReadBlock failed %d\n",rc); - break; - } - if (fp->hdrsize == 0xffff) { - printf("%s not found\n",arg2); - break; - } - if (strcmp(TFS_NAME(fp),arg2) == 0) { - if (TFS_FILEEXISTS(fp)) { - fp->flags &= ~TFS_ACTIVE; - spifWriteEnable(); - spifGlobalUnprotect(); - if ((rc = spifWriteBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) - printf(" write_hdr failed %d\n",rc); - spifGlobalProtect(); - break; - } - } - addr += TFS_SIZE(fp); - addr += TFSHDRSIZ; - while(addr & 0xf) addr++; - } - } - else if (strcmp(cmd, "tfsadd") == 0) { - int size; - long bflags; - TFILE tfshdr, *fp; - unsigned long addr; - char *src, *name, *info; - char *arg2 = argv[optind+1]; - char *arg3 = argv[optind+2]; - char *arg4 = argv[optind+3]; - char *icomma, *fcomma; - - info = ""; - bflags = 0; - name = arg2; - addr = base_of_serialtfs; - - /* The incoming arguments can be either just the filename (in which - * case we assume the source is the file in TFS with the same name), - * or the filename, source address and size... - */ - if (argc == optind+2) { // Just filename? - if ((fp = tfsstat(name)) == (TFILE *)0) { - printf("File '%s' not in TFS\n",name); - return(CMD_FAILURE); - } - name = fp->name; - info = fp->info; - bflags = fp->flags; - size = fp->filsize; - src = (char *)(fp + 1); - fp = &tfshdr; - memset((char *)fp,0,TFSHDRSIZ); - } - else if (argc == optind+4) { // Filename with addr and len - // Extract flags and info fields (if any) from the name... - fcomma = strchr(name,','); - if (fcomma) { - icomma = strchr(fcomma+1,','); - if (icomma) { - *icomma = 0; - info = icomma+1; - } - *fcomma = 0; - bflags = tfsctrl(TFS_FATOB,(long)(fcomma+1),0); - } - - fp = &tfshdr; - memset((char *)fp,0,TFSHDRSIZ); - size = (int)strtol(arg4,0,0); - src = (char *)strtoul(arg3,0,0); - } - else - return(CMD_PARAM_ERROR); - - while(addr < end_of_serialtfs) { - if ((rc = spifReadBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) - break; - if (fp->hdrsize == 0xffff) { - unsigned long nextfileaddr; - - /* We're at the address in SPIF where we can add the new - * file, but first we need to make sure there's enough - * room... - */ - if ((TFSHDRSIZ + size + 16) >= (end_of_serialtfs - addr)) { - printf(" not enough space\n"); - return(CMD_FAILURE); - } - - /* Copy name and info data to header. - */ - strcpy(fp->name, name); - strcpy(fp->info, info); - fp->hdrsize = TFSHDRSIZ; - fp->hdrvrsn = TFSHDRVERSION; - fp->filsize = size; - fp->flags = bflags; - fp->flags |= (TFS_ACTIVE | TFS_NSTALE); - fp->filcrc = crc32((unsigned char *)src,size); - fp->modtime = tfsGetLtime(); + else if(strcmp(cmd,"tfsload") == 0) { + rc = spifReadBlock(spif_tfs_base,(char *)FLASHRAM_BASE,spifGetTFSSize()); + if(rc < 0) { + printf("spifReadBlock returned %d\n",rc); + } + } else if(strcmp(cmd,"tfsstore") == 0) { + spifWriteEnable(); + spifGlobalUnprotect(); + rc = spifWriteBlock(spif_tfs_base,(char *)FLASHRAM_BASE,spifGetTFSSize()); + if(rc < 0) { + printf("spifWriteBlock returned %d\n",rc); + } + spifGlobalProtect(); + } else if(strcmp(cmd,"tfserase") == 0) { + spifWriteEnable(); + spifGlobalUnprotect(); + addr = spif_tfs_base; + while(addr < (spif_tfs_base+spif_tfs_size)) { + spifWriteEnable(); + rc = spifBlockErase(0x10000,addr); + if(rc < 0) { + printf("spifBlockErase(0x%lx) returned %d\n",addr,rc); + break; + } + if(verbose) + //ticktock(); + { + printf("%lx ",addr); + } + addr += 0x10000; + } + spifGlobalProtect(); + } else if(strcmp(cmd, "tfsls") == 0) { + int ftot; + unsigned long addr; + TFILE tfshdr, *fp; + + ftot = 0; + fp = &tfshdr; + addr = base_of_serialtfs; + while(addr < end_of_serialtfs) { + char fbuf[32], *flags; + + if((rc = spifReadBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { + printf("spifReadBlock failed %d\n",rc); + break; + } + if(fp->hdrsize == 0xffff) { + break; + } + if(TFS_FILEEXISTS(fp)) { + if(ftot == 0) { + printf(" Name Size Offset Flags Info\n"); + } + ftot++; + flags = tfsflagsbtoa(TFS_FLAGS(fp),fbuf); + if((!flags) || (!fbuf[0])) { + flags = " "; + } + printf(" %-23s %7ld 0x%08lx %-5s %s\n",TFS_NAME(fp), + TFS_SIZE(fp),(unsigned long)(addr+TFSHDRSIZ), + flags,TFS_INFO(fp)); + } + addr += TFS_SIZE(fp); + addr += TFSHDRSIZ; + while(addr & 0xf) { + addr++; + } + } + } else if(strcmp(cmd, "tfsrm") == 0) { + unsigned long addr; + TFILE tfshdr, *fp; + char *arg2 = argv[optind+1]; + + fp = &tfshdr; + addr = base_of_serialtfs; + while(addr < end_of_serialtfs) { + if((rc = spifReadBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { + printf("spifReadBlock failed %d\n",rc); + break; + } + if(fp->hdrsize == 0xffff) { + printf("%s not found\n",arg2); + break; + } + if(strcmp(TFS_NAME(fp),arg2) == 0) { + if(TFS_FILEEXISTS(fp)) { + fp->flags &= ~TFS_ACTIVE; + spifWriteEnable(); + spifGlobalUnprotect(); + if((rc = spifWriteBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { + printf(" write_hdr failed %d\n",rc); + } + spifGlobalProtect(); + break; + } + } + addr += TFS_SIZE(fp); + addr += TFSHDRSIZ; + while(addr & 0xf) { + addr++; + } + } + } else if(strcmp(cmd, "tfsadd") == 0) { + int size; + long bflags; + TFILE tfshdr, *fp; + unsigned long addr; + char *src, *name, *info; + char *arg2 = argv[optind+1]; + char *arg3 = argv[optind+2]; + char *arg4 = argv[optind+3]; + char *icomma, *fcomma; + + info = ""; + bflags = 0; + name = arg2; + addr = base_of_serialtfs; + + /* The incoming arguments can be either just the filename (in which + * case we assume the source is the file in TFS with the same name), + * or the filename, source address and size... + */ + if(argc == optind+2) { // Just filename? + if((fp = tfsstat(name)) == (TFILE *)0) { + printf("File '%s' not in TFS\n",name); + return(CMD_FAILURE); + } + name = fp->name; + info = fp->info; + bflags = fp->flags; + size = fp->filsize; + src = (char *)(fp + 1); + fp = &tfshdr; + memset((char *)fp,0,TFSHDRSIZ); + } else if(argc == optind+4) { // Filename with addr and len + // Extract flags and info fields (if any) from the name... + fcomma = strchr(name,','); + if(fcomma) { + icomma = strchr(fcomma+1,','); + if(icomma) { + *icomma = 0; + info = icomma+1; + } + *fcomma = 0; + bflags = tfsctrl(TFS_FATOB,(long)(fcomma+1),0); + } + + fp = &tfshdr; + memset((char *)fp,0,TFSHDRSIZ); + size = (int)strtol(arg4,0,0); + src = (char *)strtoul(arg3,0,0); + } else { + return(CMD_PARAM_ERROR); + } + + while(addr < end_of_serialtfs) { + if((rc = spifReadBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { + break; + } + if(fp->hdrsize == 0xffff) { + unsigned long nextfileaddr; + + /* We're at the address in SPIF where we can add the new + * file, but first we need to make sure there's enough + * room... + */ + if((TFSHDRSIZ + size + 16) >= (end_of_serialtfs - addr)) { + printf(" not enough space\n"); + return(CMD_FAILURE); + } + + /* Copy name and info data to header. + */ + strcpy(fp->name, name); + strcpy(fp->info, info); + fp->hdrsize = TFSHDRSIZ; + fp->hdrvrsn = TFSHDRVERSION; + fp->filsize = size; + fp->flags = bflags; + fp->flags |= (TFS_ACTIVE | TFS_NSTALE); + fp->filcrc = crc32((unsigned char *)src,size); + fp->modtime = tfsGetLtime(); #if TFS_RESERVED - { - int rsvd; - for(rsvd=0;rsvd<TFS_RESERVED;rsvd++) - fp->rsvd[rsvd] = 0xffffffff; - } + { + int rsvd; + for(rsvd=0; rsvd<TFS_RESERVED; rsvd++) { + fp->rsvd[rsvd] = 0xffffffff; + } + } #endif - fp->next = 0; - fp->hdrcrc = 0; - fp->hdrcrc = crc32((unsigned char *)fp,TFSHDRSIZ); - nextfileaddr = SPIF_TFSRAM_BASE - spif_tfs_base + addr + TFSHDRSIZ + size; - if (nextfileaddr & 0xf) - nextfileaddr = (nextfileaddr | 0xf) + 1; - - fp->next = (TFILE *)nextfileaddr; - - printf(" writing %s...\n",arg2); - spifWriteEnable(); - spifGlobalUnprotect(); - spifWaitForReady(); - - spifWriteEnable(); - if ((rc = spifWriteBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) - printf(" write_hdr failed %d\n",rc); - spifWaitForReady(); - - spifWriteEnable(); - spifGlobalUnprotect(); - if ((rc = spifWriteBlock(addr+TFSHDRSIZ,src,size)) < 0) - printf(" write_file failed %d\n",rc); - spifWaitForReady(); - spifGlobalProtect(); - break; - } - if (strcmp(TFS_NAME(fp),arg2) == 0) { - if (TFS_FILEEXISTS(fp)) { - printf(" removing %s...\n",arg2); - fp->flags &= ~TFS_ACTIVE; - spifWriteEnable(); - spifGlobalUnprotect(); - spifWaitForReady(); - spifWriteEnable(); - if ((rc = spifWriteBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) - printf(" write_hdr failed %d\n",rc); - spifWaitForReady(); - spifGlobalProtect(); - } - } - addr += TFS_SIZE(fp); - addr += TFSHDRSIZ; - while(addr & 0xf) addr++; - } - } - else if (strcmp(cmd, "tfsstat") == 0) { - unsigned long oaddr, addr, meminuse, memdead; - TFILE tfshdr, *fp; - - fp = &tfshdr; - meminuse = memdead = 0; - addr = base_of_serialtfs; - while(addr < end_of_serialtfs) { - if ((rc = spifReadBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { - printf("spifReadBlock failed %d\n",rc); - break; - } - if (fp->hdrsize == 0xffff) - break; - - oaddr = addr; - addr += TFS_SIZE(fp); - addr += TFSHDRSIZ; - while(addr & 0xf) addr++; - - if (TFS_FILEEXISTS(fp)) - meminuse += addr - oaddr; - else - memdead += addr - oaddr; - } - printf("Total: 0x%x, used: 0x%x, dead: 0x%x, avail: 0x%x\n", - (end_of_serialtfs - base_of_serialtfs), - meminuse, memdead, - (end_of_serialtfs - base_of_serialtfs) - (meminuse + memdead)); - } + fp->next = 0; + fp->hdrcrc = 0; + fp->hdrcrc = crc32((unsigned char *)fp,TFSHDRSIZ); + nextfileaddr = SPIF_TFSRAM_BASE - spif_tfs_base + addr + TFSHDRSIZ + size; + if(nextfileaddr & 0xf) { + nextfileaddr = (nextfileaddr | 0xf) + 1; + } + + fp->next = (TFILE *)nextfileaddr; + + printf(" writing %s...\n",arg2); + spifWriteEnable(); + spifGlobalUnprotect(); + spifWaitForReady(); + + spifWriteEnable(); + if((rc = spifWriteBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { + printf(" write_hdr failed %d\n",rc); + } + spifWaitForReady(); + + spifWriteEnable(); + spifGlobalUnprotect(); + if((rc = spifWriteBlock(addr+TFSHDRSIZ,src,size)) < 0) { + printf(" write_file failed %d\n",rc); + } + spifWaitForReady(); + spifGlobalProtect(); + break; + } + if(strcmp(TFS_NAME(fp),arg2) == 0) { + if(TFS_FILEEXISTS(fp)) { + printf(" removing %s...\n",arg2); + fp->flags &= ~TFS_ACTIVE; + spifWriteEnable(); + spifGlobalUnprotect(); + spifWaitForReady(); + spifWriteEnable(); + if((rc = spifWriteBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { + printf(" write_hdr failed %d\n",rc); + } + spifWaitForReady(); + spifGlobalProtect(); + } + } + addr += TFS_SIZE(fp); + addr += TFSHDRSIZ; + while(addr & 0xf) { + addr++; + } + } + } else if(strcmp(cmd, "tfsstat") == 0) { + unsigned long oaddr, addr, meminuse, memdead; + TFILE tfshdr, *fp; + + fp = &tfshdr; + meminuse = memdead = 0; + addr = base_of_serialtfs; + while(addr < end_of_serialtfs) { + if((rc = spifReadBlock(addr,(char *)fp,TFSHDRSIZ)) < 0) { + printf("spifReadBlock failed %d\n",rc); + break; + } + if(fp->hdrsize == 0xffff) { + break; + } + + oaddr = addr; + addr += TFS_SIZE(fp); + addr += TFSHDRSIZ; + while(addr & 0xf) { + addr++; + } + + if(TFS_FILEEXISTS(fp)) { + meminuse += addr - oaddr; + } else { + memdead += addr - oaddr; + } + } + printf("Total: 0x%x, used: 0x%x, dead: 0x%x, avail: 0x%x\n", + (end_of_serialtfs - base_of_serialtfs), + meminuse, memdead, + (end_of_serialtfs - base_of_serialtfs) - (meminuse + memdead)); + } #endif - else - return(CMD_PARAM_ERROR); + else { + return(CMD_PARAM_ERROR); + } - return(CMD_SUCCESS); + return(CMD_SUCCESS); } |