📄 blockdev.c
字号:
#ifdef VERIFY_WRITE
case FL_VERIFY_WRITE_BDTL:
#endif /* VERIFY_WRITE */
status = flSetEnvVolume(variableType,socket,FL_MAX_TL_PARTITIONS-1,value,prevValue);
#ifdef VERIFY_WRITE
case FL_VERIFY_WRITE_BINARY:
#endif /* VERIFY_WRITE */
for (;(volume<FL_MAX_TL_PARTITIONS-1)&&(status == flOK);volume++)
status = flSetEnvVolume(variableType,socket,volume,value,prevValue);
break;
/* Socket specific variables */
case FL_SUSPEND_MODE:
#ifdef VERIFY_WRITE
case FL_VERIFY_WRITE_OTHER:
#endif /* VERIFY_WRITE */
#ifndef FL_NO_USE_FUNC
case FL_MTD_BUS_ACCESS_TYPE:
#endif /* FL_NO_USE_FUNC */
#if (defined(VERIFY_WRITE) || !defined(FL_NO_USE_FUNC))
status = flSetEnvVolume(variableType,socket,INVALID_VOLUME_NUMBER,value,prevValue);
break;
#endif /* not FL_NO_USE_FUNC || VERIFY_WRITE */
/* Either global variables , or unknown */
default:
if(socket != INVALID_VOLUME_NUMBER) /* Was not called from flSetEnv */
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - flSetEnvSocket: Variable type is either unknown or not socket related.\r\n");
return flBadParameter;
}
status = flSetEnvVolume(variableType,INVALID_VOLUME_NUMBER,INVALID_VOLUME_NUMBER,value,prevValue);
break;
}
return status;
}
/*----------------------------------------------------------------------*/
/* f l S e t E n v All */
/* */
/* Change one of TrueFFS environment variables for all systems, sockets */
/* and partitions. */
/* */
/* Parameters: */
/* variableType : variable type to cahnge */
/* value : varaible value */
/* */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/* prevValue : The previous value of the variable */
/*----------------------------------------------------------------------*/
TFFS_DLL_API FLStatus NAMING_CONVENTION flSetEnvAll(FLEnvVars variableType , FLDword value, FLDword FAR2 *prevValue)
{
FLStatus status = flOK;
FLByte socket;
switch (variableType) /* Check volume and socket sanity */
{
case FL_SET_POLICY: /* Per volume */
case FL_VERIFY_WRITE_BDTL: /* Per volume */
case FL_VERIFY_WRITE_BINARY: /* Per volume */
case FL_DO_NOT_WAIT_FOR_READY: /* Per volume */
case FL_NO_STATIC_FILES_WEAR_LEVELING: /* Per volume */
#ifdef FL_FAR_MALLOC
case FL_MAX_CACHE_SIZE: /* Per volume */
#endif /* FL_FAR_MALLOC */
case FL_SUSPEND_MODE:
case FL_VERIFY_WRITE_OTHER: /* Per socket */
case FL_MTD_BUS_ACCESS_TYPE: /* Per socket */
for (socket=0;(socket<SOCKETS)&&(status == flOK);socket++)
status = flSetEnvSocket(variableType,socket,value,prevValue);
return status;
default:
return flSetEnvVolume(variableType,INVALID_VOLUME_NUMBER,INVALID_VOLUME_NUMBER,value,prevValue);
}
}
#endif /* ENVIRONMENT_VARS */
#ifndef FL_NO_USE_FUNC
/*----------------------------------------------------------------------*/
/* f l S e t D o c B u s R o u t i n e */
/* */
/* Set user defined memory acces routines for DiskOnChip. */
/* */
/* Parameters: */
/* socket : Socket number to install routine for. */
/* structPtr : Pointer to function structure. */
/* */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/*----------------------------------------------------------------------*/
TFFS_DLL_API FLStatus NAMING_CONVENTION flSetDocBusRoutine(FLByte socket, FLAccessStruct FAR1 * structPtr)
{
FLFlash* flash;
/* Arg sanity check */
#ifndef FL_SKIP_ARGS_CHECK
if (socket >= SOCKETS)
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - Change SOCKETS definition in flcustom.h to support that many sockets.\r\n");
return flFeatureNotSupported;
}
if(structPtr == NULL)
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - structPtr argument is NULL.\r\n");
return flBadParameter;
}
#endif /* FL_SKIP_ARGS_CHECK */
/* Make sure global variables are initialized to their default values */
flInitGlobalVars();
flash = flFlashOf(socket);
flash->memWindowSize = structPtr->memWindowSize;
flash->memRead = structPtr->memRead;
flash->memWrite = structPtr->memWrite;
flash->memSet = structPtr->memSet;
flash->memRead8bit = structPtr->memRead8bit;
flash->memRead16bit = structPtr->memRead16bit;
flash->memWrite8bit = structPtr->memWrite8bit;
flash->memWrite16bit = structPtr->memWrite16bit;
flash->memSetGetMode = structPtr->memSetGetMode;
flBusConfig[socket] = FL_ACCESS_USER_DEFINED;
return flOK;
}
/*----------------------------------------------------------------------*/
/* f l G e t D o c B u s R o u t i n e */
/* */
/* Get currently installed memory access routines for DiskOnChip. */
/* */
/* Parameters: */
/* socket : Socket number to install routine for. */
/* structPtr : Pointer to function structure. */
/* */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/*----------------------------------------------------------------------*/
TFFS_DLL_API FLStatus NAMING_CONVENTION flGetDocBusRoutine(FLByte socket, FLAccessStruct FAR1 * structPtr)
{
FLFlash* flash;
/* Arg sanity check */
#ifndef FL_SKIP_ARGS_CHECK
if (socket >= SOCKETS)
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - Change SOCKETS definition in flcustom.h to support that many sockets.\r\n");
return flFeatureNotSupported;
}
if(structPtr == NULL)
{
DBG_PRINT_ERR(FLZONE_BLKDEV,"ERROR - structPtr argument is NULL.\r\n");
return flBadParameter;
}
#endif /* FL_SKIP_ARGS_CHECK */
/* Make sure global variables are initialized to their default values */
flInitGlobalVars();
flash = flFlashOf(socket);
structPtr->memWindowSize = flash->memWindowSize;
structPtr->memRead = flash->memRead;
structPtr->memWrite = flash->memWrite;
structPtr->memSet = flash->memSet;
structPtr->memRead8bit = flash->memRead8bit;
structPtr->memRead16bit = flash->memRead16bit;
structPtr->memWrite8bit = flash->memWrite8bit;
structPtr->memWrite16bit = flash->memWrite16bit;
structPtr->memSetGetMode = flash->memSetGetMode;
structPtr->access = flBusConfig[socket];
return flOK;
}
#endif /* FL_NO_USE_FUNC */
/*----------------------------------------------------------------------*/
/* m o u n t L o w L e v e l */
/* */
/* Mount a volume for low level operations. If a low level routine is */
/* called and the volume is not mounted for low level operations, this */
/* routine is called atomatically. */
/* */
/* Parameters: */
/* vol : Pointer identifying drive */
/* */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/*----------------------------------------------------------------------*/
static FLStatus mountLowLevel(Volume vol)
{
checkStatus(flIdentifyFlash(vol.socket,vol.flash));
if(vol.flash->setPowerOnCallback != NULL)
vol.flash->setPowerOnCallback(vol.flash);
vol.flags |= VOLUME_LOW_LVL_MOUNTED;
return flOK;
}
/*----------------------------------------------------------------------*/
/* d i s m o u n t L o w L e v e l */
/* */
/* Dismount the volume for low level operations. */
/* */
/* Parameters: */
/* vol : Pointer identifying drive */
/* */
/*----------------------------------------------------------------------*/
static void dismountLowLevel(Volume vol)
{
/* mark the volume as unmounted for low level operations.
And does not change any of the other flags */
vol.flags &= ~VOLUME_LOW_LVL_MOUNTED;
}
/*----------------------------------------------------------------------*/
/* d i s m o u n t V o l u m e */
/* */
/* Dismounts the volume, closing all files. */
/* This call is not normally necessary, unless it is known the volume */
/* will soon be removed. */
/* */
/* Parameters: */
/* vol : Pointer identifying drive */
/* */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/*----------------------------------------------------------------------*/
static FLStatus dismountVolume(Volume vol)
{
if (vol.flags & VOLUME_ABS_MOUNTED)
{
#ifndef FIXED_MEDIA
FLStatus status = flOK;
status = flMediaCheck(vol.socket);
if (status != flOK)
vol.flags = 0;
#endif
#if (defined(FL_FILES) && (FL_FILES > 0))
#ifndef FIXED_MEDIA
dismountFS(&vol,status);
#else
dismountFS(&vol,(FLStatus)0);
#endif /* FIXED_MEDIA */
#endif /* FL_FILES > 0 */
vol.tl.dismount(vol.tl.rec);
}
vol.flags = VOLUME_ACCUPIED; /* mark volume unmounted */
return flOK;
}
#ifdef FORMAT_VOLUME
/*----------------------------------------------------------------------*/
/* f i n d F r e e V o l u m e */
/* */
/* Search the vols array for an empty cell to hold the new volume . */
/* */
/* Parameters: */
/* socket : Socket number for the new volume. */
/* partition : Partition number of the new volume. */
/* */
/* Returns: */
/* FLStatus : 0 on success, flGeneralFailure if no more */
/* volumes left. */
/*----------------------------------------------------------------------*/
static FLStatus findFreeVolume(FLByte socket, FLByte partition)
{
FLByte volNo,socketNo,partitionNo;
FLByte usedVolRecords[VOLUMES];
tffsset(usedVolRecords,0xFF,VOLUMES);
for(socketNo = 0 ; socketNo < SOCKETS ; socketNo++)
{
for(partitionNo = 0 ; partitionNo < FL_MAX_TL_PARTITIONS ; partitionNo++)
{
volNo = flHandleConversionTable[socketNo][partitionNo];
if (volNo != 0xff)
usedVolRecords[volNo]=0;
}
}
for (volNo = noOfSockets;volNo < VOLUMES;volNo++)
{
if (usedVolRecords[volNo] == 0xff)
break;
}
if (volNo == VOLUMES)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -