Beispiel #1
0
BOOL fs_AllocBlock (IOB *fcb) {
  U32 i,bl,adr,bflag;

  bl = fcb->_fblock;
  for (i = 0; i < fcb->NumSect; i++) {
    adr = fs_adr_sig (bl, fcb);
    adr = fs_rd_sig (adr, &bflag);
    if (bflag == fcb->InitVal) {
      /* Free Flash Block allocated */
      fcb->_fblock = bl;
      fcb->_fbot = 0;
      fcb->_ftop = (adr & ~1) - ((DEVCONF *)fcb->DevCfg)[bl].bStart;
      bflag ^= BlockUSED;
      fs_WriteBlock ((adr & ~1) + 8, &bflag, 4, fcb);
      return (__TRUE);
    }
    if ((bflag ^ BlockUSED) == fcb->InitVal) {
      /* Check if a file already opened for writing in this Block */
      if (fs_check_fwopen (bl, fcb) == __FALSE) {
        /* Try already used Flash Block and check for free space */
        if (fs_get_freeMem (bl, fcb) > 0) {
          fcb->_fblock = bl; 
          fs_mark_freeMem (fcb);
          return (__TRUE);
        }
        bflag = fcb->InitVal ^ BlockFULL;
        fs_WriteBlock ((adr & ~1) + 8, &bflag, 4, fcb);
      }
    }
    if (++bl == fcb->NumSect) {
      bl = 0;
    }
  }
  return (__FALSE);
}
Beispiel #2
0
BOOL fs_mark_fileMem (IOB *fcb) {
  FALLOC fa;
  U32 i,adr,bl,prev;

  bl = fcb->_fblock;
  for (i = 0; i < fcb->NumSect; i++) {
    /* Search for file blocks identified with identification 'fileID' */
    adr = fs_adr_sig (bl, fcb);
    adr = fs_rd_sig (adr, &fa.end);
    if (fa.end != fcb->InitVal) {
      for (prev = 0; ; prev = fa.end) {
        adr = fs_rd_alloc (adr, &fa);
        if (fa.fileID == fcb->fileID && fa.index == fcb->_fidx) {
          /* Set Current File Block parameters */ 
          fcb->_fblock = bl;
          fcb->_fbot = (prev + 3) & ~3;
          fcb->_ftop = fa.end;
          fcb->_fidx++; 
          return (__TRUE); 
        }
        if (fa.end == fcb->InitVal) break;
      }
    }
    if (++bl == fcb->NumSect) {
      bl = 0;
    }
  }
  return (__FALSE);
}
Beispiel #3
0
U32 __getfsize (IOB *fcb, BOOL set_fidx) {
   /* Low level get file size function. */
   FALLOC fa;
   U32 bl,fidx,adr,prev;
   U32 i,fsize;

   START_LOCK (U32);

   if (fcb->drive == DRV_MCARD) {
      /* This info is available for Flash Card. */
      RETURN (fcb->fsize);
   }
   if ((fcb->flags & _IOAPPEND) && (set_fidx == __FALSE)) {
      /* Size info already set in '__fopen()'. */
      RETURN (fcb->fsize);
   }
   fidx = 0;
   fsize = 0;
   bl = fcb->_fblock;
nextbl:
   for (i = 0; i < fcb->NumSect; i++) {
      /* Search for file blocks identified with identification 'fileID' */
      adr = fs_adr_sig (bl, fcb);
      adr = fs_rd_sig (adr, &fa.end);
      if (fa.end != fcb->InitVal) {
         for (prev = 0; ; prev = fa.end) {
            adr = fs_rd_alloc (adr, &fa);
            if (fa.fileID == fcb->fileID  &&  fa.index == fidx) {
               /* All file blocks are 4-byte aligned. */
               fsize += (fa.end - ((prev + 3) & ~3));
               fidx++;
               goto nextbl;
            }
            if (fa.end == fcb->InitVal) break;
         }
      }
      if (++bl == fcb->NumSect) {
         bl = 0;
      }
   } 
   /* This File Block does not exist so this must be End Of File */
   if (set_fidx == __TRUE) {
      fcb->_fidx = fidx;
   }
   RETURN (fsize);

   END_LOCK;
} /* end of _getfsize */
Beispiel #4
0
U32 fs_Find_File (const char *fname, IOB *fcb) {
  FALLOC fa;
  U8 buf[32];
  U32 bl,adr,prev,name;
  U32 fid = 0x8000;

  for (bl = 0; bl < fcb->NumSect; bl++) {
    /* Search all allocated File Blocks for a given 'fname */
    adr = fs_adr_sig (bl, fcb);
    adr = fs_rd_sig (adr, &fa.end);
    if (fa.end != fcb->InitVal) {
      for (prev = 0; ; prev = fa.end) {
        adr = fs_rd_alloc (adr, &fa);
        if (fa.fileID > 0x8000 && fa.fileID < 0xFFFF) {
          /* Filename is 4-byte aligned. */
          name = ((DEVCONF *)fcb->DevCfg)[bl].bStart + prev;
          name = (name + 3) & ~3;
          if (adr & 0x01) {
            /* Copy name for SPI Flash Drive. */
            fs_spi_ReadData (name, sizeof (buf), (U8 *)&buf);
          }
          else {
            fs_ReadData (name, sizeof (buf), (U8 *)&buf);
          }
          buf[31] = 0;
          if (fn_cmp (fname, (char *)&buf) == __TRUE) {
            /* File with 'fname' has been found */
            fcb->fileID  = fa.fileID & 0x7FFF;
            fcb->_fblock = bl;
            return (0);
          }
          /* Search for the max fileID in use */
          if (fa.fileID > fid) {
            fid = fa.fileID;
          }
        }
        if (fa.end == fcb->InitVal) break;
      }
    }
  }
  /* 'fid' is a nonzero value here */
  return (fid);
}