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); }
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); }
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 */
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); }