/* flbase.h - True Flash File System */ /* * Copyright (c) 1984-2005, 2009-2010, 2013 Wind River Systems, Inc. * * The right to copy, distribute or otherwise make use of this software * may be licensed only pursuant to the terms of an applicable Wind River * license agreement. */ /* FAT-FTL Lite Software Development Kit * Copyright (C) M-Systems Ltd. 1995-1997 */ /* modification history -------------------- 01i,24sep13,jxu fixed crc16 symbol conflict with btstack component 01h,07may13,jxu eTFFS: added declaration of crc16() and dbgMsg 01h,10dec12,xwu Coverity issue of tffs. 01g,21sep10,jxu Cleanup of warning: added UNAL4_ARG_TYPE for type casting. 01f,29jul10,pad Moved extern C statement after include statements. 01e,11dec09,zly fix defect190947: added erroe codes for TFFS 01d,23sep09,zly make checkStatus()`s logmsg controlled. default no logmsg. 01c,02feb05,aeg added include of logLib.h (SPR #106381). 01b,16nov04,mil removed deprecated __FUNCTION__ for GNU. 01a,29jul04,alr modified file header, restarted history */ #ifndef FLBASE_H #define FLBASE_H #include "flsystem.h" #include "flcustom.h" #include "logLib.h" #ifdef __cplusplus extern "C" { #endif /* control logmsg in checkStatus()*/ #undef DEBUG_CHECKSTATUS /* standard type definitions */ typedef int FLBoolean; /* Boolean constants */ #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #ifndef TFFS_ON #define TFFS_ON 1 #endif #ifndef TFFS_OFF #define TFFS_OFF 0 #endif #define SECTOR_SIZE (1 << SECTOR_SIZE_BITS) /* define SectorNo range according to media maximum size */ #if (MAX_VOLUME_MBYTES * 0x100000l) / SECTOR_SIZE > 0x10000l typedef unsigned long SectorNo; #define UNASSIGNED_SECTOR 0xffffffffl #else typedef unsigned short SectorNo; #define UNASSIGNED_SECTOR 0xffff #endif #if FAR_LEVEL > 0 #define FAR0 far #else #define FAR0 #endif #if FAR_LEVEL > 1 #define FAR1 far #else #define FAR1 #endif #if FAR_LEVEL > 2 #define FAR2 far #else #define FAR2 #endif #define vol (*pVol) #ifndef TFFS_BIG_ENDIAN typedef unsigned short LEushort; typedef unsigned long LEulong; #define LE2(arg) arg #define toLE2(to,arg) (to) = (arg) #define LE4(arg) arg #define toLE4(to,arg) (to) = (arg) #define COPY2(to,arg) (to) = (arg) #define COPY4(to,arg) (to) = (arg) typedef unsigned char Unaligned[2]; typedef Unaligned Unaligned4[2]; typedef Unaligned const FAR0 * UNAL4_ARG_TYPE; /* for type casting when using UNAL4*/ #define UNAL2(arg) fromUNAL(arg) #define toUNAL2(to,arg) toUNAL(to,arg) #define UNAL4(arg) fromUNALLONG(arg) #define toUNAL4(to,arg) toUNALLONG(to,arg) extern void toUNAL(unsigned char FAR0 *unal, unsigned n); extern unsigned short fromUNAL(unsigned char const FAR0 *unal); extern void toUNALLONG(Unaligned FAR0 *unal, unsigned long n); extern unsigned long fromUNALLONG(Unaligned const FAR0 *unal); #else typedef unsigned char LEushort[2]; typedef unsigned char LEulong[4]; typedef unsigned char const FAR0 * UNAL4_ARG_TYPE; /* for type casting when using UNAL4*/ #define LE2(arg) fromLEushort(arg) #define toLE2(to,arg) toLEushort(to,arg) #define LE4(arg) fromLEulong(arg) #define toLE4(to,arg) toLEulong(to,arg) #define COPY2(to,arg) copyShort(to,arg) #define COPY4(to,arg) copyLong(to,arg) #define Unaligned LEushort #define Unaligned4 LEulong extern void toLEushort(unsigned char FAR0 *le, unsigned n); extern unsigned short fromLEushort(unsigned char const FAR0 *le); extern void toLEulong(unsigned char FAR0 *le, unsigned long n); extern unsigned long fromLEulong(unsigned char const FAR0 *le); extern void copyShort(unsigned char FAR0 *to, unsigned char const FAR0 *from); extern void copyLong(unsigned char FAR0 *to, unsigned char const FAR0 *from); #define UNAL2 LE2 #define toUNAL2 toLE2 #define UNAL4 LE4 #define toUNAL4 toLE4 #endif /* TFFS_BIG_ENDIAN */ /* error codes*/ #define S_tffsLib_BAD_FUNCTION (M_tffsLib | 1) #define S_tffsLib_FILE_NOT_FOUND (M_tffsLib | 2) #define S_tffsLib_PATH_NOT_FOUND (M_tffsLib | 3) #define S_tffsLib_TOO_MANY_OPEN_FILES (M_tffsLib |4) #define S_tffsLib_NO_WRITE_ACCESS (M_tffsLib | 5) #define S_tffsLib_BAD_FILE_HANDLE (M_tffsLib | 6) #define S_tffsLib_DRIVE_NOT_AVAILABLE (M_tffsLib | 9) #define S_tffsLib_NON_FAT_FORMAT (M_tffsLib | 10) #define S_tffsLib_FORMAT_NOT_SUPPORTED (M_tffsLib | 11) #define S_tffsLib_NO_MORE_FILES (M_tffsLib | 18) #define S_tffsLib_WRITE_PROTECT (M_tffsLib | 19) #define S_tffsLib_BAD_DRIVE_HANDLE (M_tffsLib | 20) #define S_tffsLib_DRIVE_NOT_READY (M_tffsLib | 21) #define S_tffsLib_UNKNOWN_CMD (M_tffsLib | 22) #define S_tffsLib_BAD_FORMAT (M_tffsLib | 23) #define S_tffsLib_BAD_LENGTH (M_tffsLib | 24) #define S_tffsLib_DATA_ERROR (M_tffsLib | 25) #define S_tffsLib_UNKNOWN_MEDIA (M_tffsLib | 26) #define S_tffsLib_SECTOR_NOT_FOUND (M_tffsLib | 27) #define S_tffsLib_OUT_OF_PAPER (M_tffsLib | 28) #define S_tffsLib_WRITE_FAULT (M_tffsLib | 29) #define S_tffsLib_READ_FAULT (M_tffsLib | 30) #define S_tffsLib_GENERAL_FAILURE (M_tffsLib | 31) #define S_tffsLib_DISK_CHANGE (M_tffsLib | 34) #define S_tffsLib_VPP_FAILURE (M_tffsLib | 50) #define S_tffsLib_BAD_PARAMETER (M_tffsLib | 51) #define S_tffsLib_NO_SPACE_IN_VOLUME (M_tffsLib | 52) #define S_tffsLib_INVALID_FAT_CHAIN (M_tffsLib | 53) #define S_tffsLib_ROOT_DIR_FULL (M_tffsLib | 54) #define S_tffsLib_NOT_MOUNTED (M_tffsLib | 55) #define S_tffsLib_PATH_IS_ROOTDIR (M_tffsLib | 56) #define S_tffsLib_NOT_A_DIR (M_tffsLib | 57) #define S_tffsLib_DIR_NOT_EMPTY (M_tffsLib | 58) #define S_tffsLib_FILE_IS_A_DIR (M_tffsLib | 59) #define S_tffsLib_ADAPTER_NOT_FOUND (M_tffsLib | 60) #define S_tffsLib_FORMATTING_ERROR (M_tffsLib | 62) #define S_tffsLib_NOT_ENOUGH_MEMORY (M_tffsLib | 63) #define S_tffsLib_VOLUME_TOO_SMALL (M_tffsLib | 64) #define S_tffsLib_BUFFERING_ERROR (M_tffsLib | 65) #define S_tffsLib_FILE_ALREADY_EXISTS (M_tffsLib | 80) #define S_tffsLib_INCOMPLETE (M_tffsLib | 100) #define S_tffsLib_TIMED_OUT (M_tffsLib | 101) #define S_tffsLib_TOO_MANY_COMPONENTS (M_tffsLib | 102) #ifdef __cplusplus } #endif #ifndef IFLITE_ERROR_CODES #ifdef __cplusplus extern "C" { #endif typedef enum {flOK = 0, /* Status code for operation. A zero value indicates success, other codes are the extended DOS codes. */ flBadFunction = 1, flFileNotFound = 2, flPathNotFound = 3, flTooManyOpenFiles = 4, flNoWriteAccess = 5, flBadFileHandle = 6, flDriveNotAvailable = 9, flNonFATformat = 10, flFormatNotSupported = 11, flNoMoreFiles = 18, flWriteProtect = 19, flBadDriveHandle = 20, flDriveNotReady = 21, flUnknownCmd = 22, flBadFormat = 23, flBadLength = 24, flDataError = 25, flUnknownMedia = 26, flSectorNotFound = 27, flOutOfPaper = 28, flWriteFault = 29, flReadFault = 30, flGeneralFailure = 31, flDiskChange = 34, flVppFailure = 50, flBadParameter = 51, flNoSpaceInVolume = 52, flInvalidFATchain = 53, flRootDirectoryFull = 54, flNotMounted = 55, flPathIsRootDirectory = 56, flNotADirectory = 57, flDirectoryNotEmpty = 58, flFileIsADirectory = 59, flAdapterNotFound = 60, flFormattingError = 62, flNotEnoughMemory = 63, flVolumeTooSmall = 64, flBufferingError = 65, flFileAlreadyExists = 80, flIncomplete = 100, flTimedOut = 101, flTooManyComponents = 102 } FLStatus; #else /* IFLITE_ERROR_CODES */ #include "type.h" #ifdef __cplusplus extern "C" { #endif typedef enum {flOK = ERR_NONE, /* Status code for operation. A zero value indicates success, other codes are the extended DOS codes. */ flBadFunction = ERR_SW_HW, flFileNotFound = ERR_NOTEXISTS, flPathNotFound = ERR_NOTEXISTS, flTooManyOpenFiles = ERR_MAX_FILES, flNoWriteAccess = ERR_WRITE, flBadFileHandle = ERR_NOTOPEN, flDriveNotAvailable = ERR_SW_HW, flNonFATformat = ERR_PARTITION, flFormatNotSupported = ERR_PARTITION, flNoMoreFiles = ERR_NOTEXISTS, flWriteProtect = ERR_WRITE, flBadDriveHandle = ERR_SW_HW, flDriveNotReady = ERR_PARTITION, flUnknownCmd = ERR_PARAM, flBadFormat = ERR_PARTITION, flBadLength = ERR_SW_HW, flDataError = ERR_READ, flUnknownMedia = ERR_PARTITION, flSectorNotFound = ERR_READ, flOutOfPaper = ERR_SW_HW, flWriteFault = ERR_WRITE, flReadFault = ERR_READ, flGeneralFailure = ERR_SW_HW, flDiskChange = ERR_PARTITION, flVppFailure = ERR_WRITE, flBadParameter = ERR_PARAM, flNoSpaceInVolume = ERR_SPACE, flInvalidFATchain = ERR_PARTITION, flRootDirectoryFull = ERR_DIRECTORY, flNotMounted = ERR_PARTITION, flPathIsRootDirectory = ERR_DIRECTORY, flNotADirectory = ERR_DIRECTORY, flDirectoryNotEmpty = ERR_NOT_EMPTY, flFileIsADirectory = ERR_DIRECTORY, flAdapterNotFound = ERR_DETECT, flFormattingError = ERR_FORMAT, flNotEnoughMemory = ERR_SW_HW, flVolumeTooSmall = ERR_FORMAT, flBufferingError = ERR_SW_HW, flFileAlreadyExists = ERR_EXISTS, flIncomplete = ERR_DETECT, flTimedOut = ERR_SW_HW, flTooManyComponents = ERR_PARAM } FLStatus; #endif /* IFLITE_ERROR_CODES */ /* call a procedure returning status and fail if it fails. This works only in routines that return Status */ #ifdef DEBUG_CHECKSTATUS #define checkStatus(exp) { FLStatus status = (exp); \ if (status != flOK){ \ logMsg("checkStatus() ERROR line %i\n",__LINE__,2,3,4,5,6); \ return status; } } #else #define checkStatus(exp) { FLStatus status = (exp); \ if (status != flOK){ \ return status; } } #endif /* better debug routines. EAN */ #define DBG_MUST 0x1 /* always print */ #define DBG_FATAL 0x2 /* fatal error */ #define DBG_ERROR 0x4 /* normal error */ #define DBG_WARNING 0x8 /* warning */ #define DBG_FLOW 0x10 /* monitor where i am */ #define DEBUG_MASK (DBG_MUST | DBG_FATAL | DBG_ERROR | DBG_WARNING) /* set debug level */ /* #define DEBUG_FTL */ /* turn on/off debug messages */ #ifdef DEBUG_FTL /* sjk changed printf to logMsg */ #define dbgMsg(num,msg,var1,var2,var3,var4,var5,var6) do { \ if(num & DEBUG_MASK) \ logMsg("%s:%d: "msg, \ (_Vx_usr_arg_t)__FUNCTION__, \ (_Vx_usr_arg_t)__LINE__, \ (_Vx_usr_arg_t)var1, \ (_Vx_usr_arg_t)var2, \ (_Vx_usr_arg_t)var3, \ (_Vx_usr_arg_t)var4); \ }while(0) #else #define dbgMsg(num,msg,var1,var2,var3,var4,var5,var6) /* nothing */ #endif /* #ifdef DEBUG_FTL */ #define CRC16_SEED 0xFFFF #define CRC16_GOOD 0xF0B8 unsigned short flCrc16 (unsigned short seed, const unsigned char * pBuf, unsigned int len); #ifdef __cplusplus } #endif #include "flsysfun.h" #endif /* FLBASE_H */