📄 blockdev.c
字号:
/* 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 + -