⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blockdev.c

📁 DOC文件系统驱动源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*                      SOFTWARE LICENSE AGREEMENT                       */
/*                                                                       */
/*  THE USE OF THIS SOFTWARE IS GOVERNED BY A SEPARATE LICENSE           */
/*  AGREEMENT BETWEEN THE OEM AND M-SYSTEMS. REFER TO THAT AGREEMENT     */
/*  FOR THE SPECIFIC TERMS AND CONDITIONS OF USE,                        */
/*  OR CONTACT M-SYSTEMS FOR LICENSE ASSISTANCE:                         */
/*  E-MAIL = info@m-sys.com                                              */
/*************************************************************************/

#include "bddefs.h"
#include "blockdev.h"

#ifdef FL_BACKGROUND
#include "backgrnd.h"
#endif


/********************* Extern Function Prototype Start *******************/
#ifdef WRITE_EXB_IMAGE
extern FLStatus getExbInfo(Volume vol, void FAR1 * buf, dword bufLen, word exbFlags);
extern FLStatus placeExbByBuffer(Volume vol, byte FAR1 * buf, dword bufLen,
                 word windowBase,word exbFlags);
#endif /* WRITE_EXB_IMAGE */

#if (defined(FORMAT_VOLUME) && defined(COMPRESSION))
extern FLStatus flFormatZIP(unsigned volNo, TL *baseTL , FLFlash * flash);
#endif
#if defined(FILES) && FILES > 0
extern File     fileTable[FILES];       /* the file table */
extern FLStatus flushBuffer(Volume vol);
extern FLStatus openFile(Volume vol, IOreq FAR2 *ioreq);
extern FLStatus closeFile(File *file);
extern FLStatus joinFile (File *file, IOreq FAR2 *ioreq);
extern FLStatus splitFile (File *file, IOreq FAR2 *ioreq);
extern FLStatus readFile(File *file,IOreq FAR2 *ioreq);
extern FLStatus writeFile(File *file, IOreq FAR2 *ioreq);
extern FLStatus seekFile(File *file, IOreq FAR2 *ioreq);
extern FLStatus findFile(Volume vol, File *file, IOreq FAR2 *ioreq);
extern FLStatus findFirstFile(Volume vol, IOreq FAR2 *ioreq);
extern FLStatus findNextFile(File *file, IOreq FAR2 *ioreq);
extern FLStatus getDiskInfo(Volume vol, IOreq FAR2 *ioreq);
extern FLStatus deleteFile(Volume vol, IOreq FAR2 *ioreq, 
                           FLBoolean isDirectory);
extern FLStatus renameFile(Volume vol, IOreq FAR2 *ioreq);
extern FLStatus makeDir(Volume vol, IOreq FAR2 *ioreq);
#endif /* FILES > 0 */

/********************* Extern Function Prototype End *******************/

/********************* Internal Function Prototype Start ***************/

void flInitGlobalVars(void);

/********************* Internal Function Prototype End *****************/

/********************* Global variables Start **************************/

Volume    vols[VOLUMES];
FLMutex   flMutex[SOCKETS];
byte      handleConversionTable[SOCKETS][MAX_TL_PARTITIONS];
FLBoolean initDone = FALSE;           /* Initialization not done yet   */
FLBoolean initGlobalVarsDone = FALSE; /* Initialization of environment */
                                      /* and access type variables not */
                                      /* done yet.                     */
unsigned  noOfDrives;

dword flMsecCounter = 0;

/* bus configuration
 *
 * DiskOnChip minimal bus width
 */
#ifndef FL_NO_USE_FUNC
dword   flBusConfig[SOCKETS];
#endif /* FL_NO_USE_FUNC */

/* Verify write state
 *
 * BDTL   partitions : 0-(MAX_TL_PARTITIONS-1)
 * Binary partitions : MAX_TL_PARTITIONS - (2*MAX_TL_PARTITIONS-2)
 * Last              : 2*MAX_TL_PARTITIONS-1
 */
#if (defined(VERIFY_WRITE) || defined(VERIFY_ERASED_SECTOR))
byte   flVerifyWrite[SOCKETS][MAX_TL_PARTITIONS<<1];
#endif /* VERIFY_WRITE || VERIFY_ERASED_SECTOR */

#ifdef ENVIRONMENT_VARS
cpyBuffer tffscpy; /* Pointer to memory copy routine    */
cmpBuffer tffscmp; /* Pointer to memory compare routine */
setBuffer tffsset; /* Pointer to memory set routine     */

/********************************************/
/* default values for environment variables */
/********************************************/

#if (defined(VERIFY_WRITE) || defined(VERIFY_ERASED_SECTOR))
/* Max sectors verified per write operation (must be even number) */
dword  flSectorsVerifiedPerFolding = 64;
#endif /* VERIFY_WRITE || VERIFY_ERASED_SECTOR */
#ifdef MULTI_DOC
/* No multi-doc (MTL)                        */
byte   flUseMultiDoc;
/* MTL defragmentaion mode (0 - standard)    */
byte   flMTLdefragMode;
#endif /* MULTI_DOC */
/* Set the TL operation policy               */
byte   flPolicy[SOCKETS][MAX_TL_PARTITIONS];
/* Maximum chain length                      */
byte   flMaxUnitChain;
/* Mark the delete sector on the flash       */
byte   flMarkDeleteOnFlash;
/* Read Only mode                            */
byte   flSuspendMode;

/********************* Global variables End *****************************/

/*----------------------------------------------------------------------*/
/*                   f l S e t E n v V o l u m e                        */
/*                                                                      */
/* Change one of TrueFFS environment variables for a specific partition */
/*                                                                      */
/* Note : This routine is used by all other flSetEnv routines.          */
/*        In order to effect variables that are common to several       */
/*        sockets or volumes use INVALID_VOLUME_NUMBER                  */
/*                                                                      */
/* Parameters:                                                          */
/*      variableType    : variable type to cahnge                       */
/*      socket          : Associated socket                             */
/*      volume          : Associated volume (partition)                 */
/*      value           : varaible value                                */
/*                                                                      */
/* Note: Variables common to al sockets must be addressed using socket  */
/*       0 and volume 0.                                                */
/*                                                                      */
/* Returns:                                                             */
/*      FLStatus        : 0 on success, otherwise failed                */
/*      prevValue       : The previous value of the variable            */
/*----------------------------------------------------------------------*/

FLStatus NAMING_CONVENTION flSetEnvVolume(FLEnvVars variableType ,
                  byte socket,byte volume ,
                  dword value, dword FAR2 *prevValue)
{
   /* Arg sanity check */
   if(prevValue == NULL)
   {
      DEBUG_PRINT(("ERROR - prevValue argument is NULL.\r\n"));
      return flBadParameter;
   }
   switch (variableType) /* Check value argument is a valid mode */
   {
      case FL_SET_MAX_CHAIN:
         if ((value > 31) || (value < 1))
         {
            DEBUG_PRINT(("Debug: Error - Chains length must between 0 and 32.\r\n"));
            return flBadParameter;
         }
         break;
#if (defined(VERIFY_WRITE) || defined(VERIFY_ERASED_SECTOR))
      case FL_SECTORS_VERIFIED_PER_FOLDING:
         if (value & 1) /* odd number */
         {
            DEBUG_PRINT(("Debug: Error - sector verification numbr must be even.\r\n"));
            return flBadParameter;
         }
         break;
      case FL_VERIFY_WRITE_BDTL:
         if ((value != FL_UPS) && (value != FL_OFF) && (value != FL_ON))
         {
            DEBUG_PRINT(("Debug: Error - verify write of BDTL can not accept this value.\r\n"));
            return flBadParameter;
         }
         break;
#endif /* VERIFY_WRITE || VERIFY_ERASED_SECTOR */
      case FL_SUSPEND_MODE:
         if((value != FL_OFF)           && 
            (value != FL_SUSPEND_WRITE) && 
            (value != FL_SUSPEND_IO)      )
         {
            DEBUG_PRINT(("Debug: Error - verify write of BDTL can not accept this value.\r\n"));
            return flBadParameter;
         }
         break;
#ifndef FL_NO_USE_FUNC
      case FL_MTD_BUS_ACCESS_TYPE:
         break;
#endif /* FL_NO_USE_FUNC */
      default:
         if ((value != FL_ON)&&(value!=FL_OFF))
         {
            DEBUG_PRINT(("Debug: Error - Value must be either FL_ON (1) or FL_OFF(0).\r\n"));
            return flBadParameter;
         }
   }

   switch (variableType) /* Check volume and socket sanity */
   {
      /* Volume specfic variables */

      case FL_SET_POLICY:
#if (defined(VERIFY_WRITE) || defined(VERIFY_ERASED_SECTOR))
      case FL_VERIFY_WRITE_BDTL:
#endif /* VERIFY_WRITE || VERIFY_ERASED_SECTOR */
#ifdef VERIFY_WRITE
      case FL_VERIFY_WRITE_BINARY:
#endif /* VERIFY_WRITE */
         if ((       volume >= MAX_TL_PARTITIONS          ) ||
             ((variableType == FL_VERIFY_WRITE_BINARY) &&
              (volume       == MAX_TL_PARTITIONS - 1 )    )   )
         {
            DEBUG_PRINT(("Debug: Error - No such volume, therefore can not change environment variable.\r\n"));
            return flBadParameter;
         }
         if (socket>=SOCKETS)
         {
            DEBUG_PRINT(("Debug: Error - No such socket, therefore can not change environment variable.\r\n"));
            return flBadParameter;
         }
         break;

      /* Socket specfic variables */

#ifdef VERIFY_WRITE
      case FL_VERIFY_WRITE_OTHER:
#endif /* VERIFY_WRITE */
      case FL_MTD_BUS_ACCESS_TYPE:
         if (socket>=SOCKETS)
         {
            DEBUG_PRINT(("Debug: Error - No such socket, therefore can not change environment variable.\r\n"));
            return flBadParameter;
         }
         if (volume!=INVALID_VOLUME_NUMBER)
         {
            DEBUG_PRINT(("Debug: Error - This global variable is common to all volumes.\r\n"));
            return flBadParameter;
         }
         break;

      /* Global variables for all sockets and volumes */
#if (defined(VERIFY_WRITE) || defined(VERIFY_ERASED_SECTOR))
      case FL_SECTORS_VERIFIED_PER_FOLDING:
#endif /* VERIFY_WRITE || VERIFY_ERASED_SECTOR */
      case FL_IS_RAM_CHECK_ENABLED:
      case FL_TL_CACHE_ENABLED:
      case FL_DOC_8BIT_ACCESS:
      case FL_MULTI_DOC_ENABLED:
      case FL_SET_MAX_CHAIN:
      case FL_MARK_DELETE_ON_FLASH:
      case FL_SUSPEND_MODE:
      case FL_MTL_POLICY:
         if ((socket!=INVALID_VOLUME_NUMBER) || (volume!=INVALID_VOLUME_NUMBER))
         {
            DEBUG_PRINT(("Debug: Error - This global variable is common to all sockets and volumes.\r\n"));
            return flBadParameter;
         }
         break;

      default:

         DEBUG_PRINT(("Debug: Unknown variable type.\r\n"));
         return flFeatureNotSupported;
   }

   /* Make sure environement variables are */
   /* initialized to their default values  */
   flInitGlobalVars();


   /***************************************************/
   /* Arguments have been checked now change variable */
   /* and report the previous value.                  */
   /***************************************************/

   switch (variableType)
   {
      case FL_IS_RAM_CHECK_ENABLED:
         *prevValue                  = (dword)flUseisRAM;
         flUseisRAM                  = (byte)value;
         break;
      case FL_TL_CACHE_ENABLED:
         *prevValue                  = (dword)flUseNFTLCache;
         flUseNFTLCache              = (byte)value;
         break;
      case FL_DOC_8BIT_ACCESS:
         *prevValue                  = (dword)flUse8Bit;
         flUse8Bit                   = (byte)value;
         break;
      case FL_SET_MAX_CHAIN:
         *prevValue                  = (dword)flMaxUnitChain;
         flMaxUnitChain              = (byte)value;
         break;
      case FL_MARK_DELETE_ON_FLASH:
         *prevValue                  = (dword)flMarkDeleteOnFlash;
         flMarkDeleteOnFlash         = (byte)value;
         break;
#ifdef MULTI_DOC
      case FL_MULTI_DOC_ENABLED:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -