📄 blockdev.c
字号:
/*
* Set default values to per platform variables
*/
#ifdef ENVIRONMENT_VARS
#ifdef VERIFY_WRITE
/* Max sectors verified per write operation (must be even number) */
flSectorsVerifiedPerFolding = 64;
#endif /* VERIFY_WRITE */
#ifdef MULTI_DOC
/* No multi-doc (MTL) */
flUseMultiDoc = FL_OFF;
/* MTL defragmentaion mode (0 - standard) */
flMTLdefragMode = FL_MTL_DEFRAGMENT_ALL_DEVICES;
#endif /* MULTI_DOC */
/* Maximum chain length */
flMaxUnitChain = 7;
/* Mark the delete sector on the flash */
flMarkDeleteOnFlash = FL_ON;
#endif /* ENVIRONMENT_VARS */
}
#ifdef ENVIRONMENT_VARS
/*----------------------------------------------------------------------*/
/* 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 all sockets must be addressed using socket */
/* 0 and volume 0. */
/* */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/* prevValue : The previous value of the variable */
/*----------------------------------------------------------------------*/
TFFS_DLL_API FLStatus NAMING_CONVENTION flSetEnvVolume(FLEnvVars variableType ,
FLByte socket,FLByte volume ,
FLDword value, FLDword FAR2 *prevValue)
{
/* Arg sanity check */
if(prevValue == NULL)
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: prevValue argument should not be NULL.\r\n");
return flBadParameter;
}
switch (variableType) /* Check value argument is a valid mode */
{
case FL_SET_MAX_CHAIN:
if ((value > 14) || (value < 1))
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: Chains length must between 1 and 14.\r\n");
return flBadParameter;
}
break;
#ifdef VERIFY_WRITE
case FL_SECTORS_VERIFIED_PER_FOLDING:
if (value & 1) /* odd number */
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: 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))
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: verify write of BDTL can not accept this value.\r\n");
return flBadParameter;
}
break;
#endif /* VERIFY_WRITE */
case FL_SUSPEND_MODE:
if( (value != FL_OFF ) &&
((value & (FL_SUSPEND_WRITE | FL_SUSPEND_IO | FL_IGNORE_ERASE | FL_IGNORE_WRITE)) == 0))
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: No such suspention value.\r\n");
return flBadParameter;
}
break;
#ifndef FL_NO_USE_FUNC
case FL_MTD_BUS_ACCESS_TYPE:
break;
#endif /* FL_NO_USE_FUNC */
#ifdef FL_FAR_MALLOC
case FL_MAX_CACHE_SIZE:
if(value > 0xfff)
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: Max cache size is limited to 0xfff.\r\n");
return flBadParameter;
}
break;
#endif /* FL_FAR_MALLOC */
default:
if ((value != FL_ON)&&(value!=FL_OFF))
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: 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_DO_NOT_WAIT_FOR_READY:
case FL_NO_STATIC_FILES_WEAR_LEVELING:
#ifdef FL_FAR_MALLOC
case FL_MAX_CACHE_SIZE:
#endif /* FL_FAR_MALLOC */
case FL_SET_POLICY:
#ifdef VERIFY_WRITE
case FL_VERIFY_WRITE_BDTL:
#endif /* VERIFY_WRITE */
#ifdef VERIFY_WRITE
case FL_VERIFY_WRITE_BINARY:
#endif /* VERIFY_WRITE */
if (( volume >= FL_MAX_TL_PARTITIONS ) ||
((variableType == FL_VERIFY_WRITE_BINARY) &&
(volume == FL_MAX_TL_PARTITIONS - 1 ) ) )
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: No such volume, therefore can not change environment variable.\r\n");
return flBadParameter;
}
if (socket>=SOCKETS)
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: No such socket, therefore can not change environment variable.\r\n");
return flBadParameter;
}
break;
/* Socket specfic variables */
case FL_SUSPEND_MODE:
#ifdef VERIFY_WRITE
case FL_VERIFY_WRITE_OTHER:
#endif /* VERIFY_WRITE */
case FL_MTD_BUS_ACCESS_TYPE:
if (socket>=SOCKETS)
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: No such socket, therefore can not change environment variable.\r\n");
return flBadParameter;
}
if (volume!=INVALID_VOLUME_NUMBER)
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: This global variable is common to all volumes.\r\n");
return flBadParameter;
}
break;
/* Global variables for all sockets and volumes */
#ifdef VERIFY_WRITE
case FL_SECTORS_VERIFIED_PER_FOLDING:
#endif /* VERIFY_WRITE */
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_MTL_POLICY:
if ((socket!=INVALID_VOLUME_NUMBER) || (volume!=INVALID_VOLUME_NUMBER))
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: This global variable is common to all sockets and volumes.\r\n");
return flBadParameter;
}
break;
default:
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvVolume: 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_TL_CACHE_ENABLED:
*prevValue = (FLDword)flUseNFTLCache;
flUseNFTLCache = (FLByte )value;
break;
case FL_DOC_8BIT_ACCESS:
*prevValue = (FLDword)flUse8Bit;
flUse8Bit = (FLByte )value;
break;
case FL_SET_MAX_CHAIN:
*prevValue = (FLDword)flMaxUnitChain;
flMaxUnitChain = (FLByte )value;
break;
case FL_MARK_DELETE_ON_FLASH:
*prevValue = (FLDword)flMarkDeleteOnFlash;
flMarkDeleteOnFlash = (FLByte )value;
break;
#ifdef MULTI_DOC
case FL_MULTI_DOC_ENABLED:
*prevValue = (FLDword)flUseMultiDoc;
flUseMultiDoc = (FLByte )value;
break;
case FL_MTL_POLICY:
*prevValue = (FLDword)flMTLdefragMode;
flMTLdefragMode = (FLByte )value;
break;
#endif /* MULTI_DOC */
case FL_SET_POLICY:
*prevValue = (FLDword)flPolicy[socket][volume];
/* flPolicy[socket][volume] = (FLByte )value; */
break;
#ifdef VERIFY_WRITE
case FL_SECTORS_VERIFIED_PER_FOLDING:
*prevValue = flSectorsVerifiedPerFolding;
flSectorsVerifiedPerFolding = value;
break;
case FL_VERIFY_WRITE_BDTL:
*prevValue = (FLDword)flVerifyWrite[socket][volume];
flVerifyWrite[socket][volume] = (FLByte )value;
break;
#endif /* VERIFY_WRITE */
#ifdef VERIFY_WRITE
case FL_VERIFY_WRITE_BINARY:
*prevValue = (FLDword)flVerifyWrite[socket][volume+FL_MAX_TL_PARTITIONS];
flVerifyWrite[socket][volume+FL_MAX_TL_PARTITIONS] = (FLByte )value;
break;
case FL_VERIFY_WRITE_OTHER:
*prevValue = (FLDword)flVerifyWrite[socket][(FL_MAX_TL_PARTITIONS<<1)-1];
flVerifyWrite[socket][(FL_MAX_TL_PARTITIONS<<1)-1] = (FLByte )value;
break;
#endif /* VERIFY_WRITE */
case FL_SUSPEND_MODE:
*prevValue = (FLDword)flSuspendMode[socket];
flSuspendMode[socket] = (FLByte )value;
break;
#ifdef FL_FAR_MALLOC
case FL_MAX_CACHE_SIZE:
*prevValue = (FLDword)flCacheSize[socket][volume];
flCacheSize[socket][volume] = (FLWord)value;
break;
#endif /* FL_FAR_MALLOC */
case FL_DO_NOT_WAIT_FOR_READY:
*prevValue = (FLDword)flDoNotWaitForReady[socket][volume];
flDoNotWaitForReady[socket][volume] = (FLByte)value;
break;
case FL_NO_STATIC_FILES_WEAR_LEVELING:
*prevValue = (FLDword)flSkipStaticFilesWearLeveling[socket][volume];
flSkipStaticFilesWearLeveling[socket][volume] = (FLByte)value;
break;
default: /* FL_MTD_BUS_ACCESS_TYPE */
#ifndef FL_NO_USE_FUNC
*prevValue = flBusConfig[socket];
flBusConfig[socket] = (FLDword)value;
#endif /* FL_NO_USE_FUNC */
break;
}
return flOK;
}
/*----------------------------------------------------------------------*/
/* f l S e t E n v S o c k e t */
/* */
/* Change one of TrueFFS environment variables for a specific sockets. */
/* */
/* Parameters: */
/* variableType : variable type to cahnge */
/* socket : socket number */
/* value : varaible value */
/* */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/* prevValue : The previous value of the variable */
/* if there are more then 1 partition in that */
/* socket , the first partition value is returned*/
/*----------------------------------------------------------------------*/
TFFS_DLL_API FLStatus NAMING_CONVENTION flSetEnvSocket(FLEnvVars variableType , FLByte socket , FLDword value, FLDword FAR2 *prevValue)
{
FLStatus status = flOK;
FLByte volume = 0;
switch (variableType) /* Check volume and socket sanity */
{
/* Volume specific variables */
case FL_DO_NOT_WAIT_FOR_READY:
case FL_NO_STATIC_FILES_WEAR_LEVELING:
#ifdef FL_FAR_MALLOC
case FL_MAX_CACHE_SIZE:
#endif /* FL_FAR_MALLOC */
case FL_SET_POLICY:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -