📄 dochtl.c
字号:
DOCH_Error rc;
IOreq ioreq;
DOCH_Socket* pdev;
DOCH_get_socket(pdev, tlRec->socketNo);
/*If socket is not registered, return error*/
if(pdev == NULL)
return flAdapterNotFound;
tffsset(&ioreq, 0, sizeof(ioreq));
pdev->bAtaDevNum = 0;
DOCH_SET_SOCKET_TO_IOREQ_HANDLE(&ioreq, tlRec->socketNo);
DOCH_SET_PARTITION_TO_IOREQ_HANDLE(&ioreq, tlRec->partitionNo);
ioreq.irSectorNo = sectorNo;
ioreq.irSectorCount = noOfSectors;
rc = flDOCHFreeSectors(&ioreq);
if(rc != DOCH_OK)
{
#ifdef CHECK_POWER_ON_EVERY_COMMAND
/*In case Power Fail was detected, return DOCH_DeviceTurnedOff*/
if(gDeviceTurnedOff)
{
gDeviceTurnedOff = FALSE;
#ifdef FL_MIGRATION_VERSION
return flSuspendModeDetected;
#else /*FL_MIGRATION_VERSION*/
return DOCH_DeviceTurnedOff;
#endif /*FL_MIGRATION_VERSION*/
}
#endif /*CHECK_POWER_ON_EVERY_COMMAND*/
return flBadFunction;
}
else
return flOK;
}
static FLStatus dochTlSetBusy(TLrec *tlRec, FLBoolean state)
{
return flOK;
}
static void dochDismount(TLrec *tlRec)
{
FL_FREE(tlRec->mappedSector);
}
static FLStatus dochDefragment(TLrec *tlRec, FLSDword FAR2 *sectorsNeeded, FLDword normalSpace)
{
/*optimize*/
return flOK;
}
static FLStatus dochCheckVolume(TLrec *tlRec)
{
return flOK;
}
static SectorNo dochSectorsInVolume(TLrec *tlRec)
{
SectorNo secNo = tlRec->virtualSectors;
return secNo;
}
static FLStatus dochGetTLInfo(TLrec *tlRec, TLInfo *tlInfo)
{
return flOK;
}
static void dochRecommendedClusterInfo(TLrec *tlRec, FLDword *sectorsPerCluster, FLDword *clusterAlignment)
{
*sectorsPerCluster = tlRec->maxRelatedSectors;
*clusterAlignment = ((FLDword)tlRec->sectorsInUnit<<FL_SECTOR_SIZE_BITS);
}
static FLStatus dochReadBBT(TLrec *tlRec, CardAddress FAR1 * buf, FLSDword FAR2 * mediaSize, unsigned FAR2 * noOfBB)
{
return flOK;
}
static FLStatus dochNotifyChange(TLrec *tlRec, void FAR1 * reserved, FLEnvVars variableType , FLDword value)
{
return flOK;
}
static FLStatus dochCompleteOperation(TLrec *tlRec)
{
return flOK;
}
static FLDword dochGetLastMappedSectorAddress(TLrec *tlRec)
{
FLDword address = 0;
return address;
}
static FLStatus dochEnsureFreeSectorsInUnit(TLrec *tlRec, FLWord wVirtualUnit, FLWord * wFreeSectorsRequired)
{
/*prepare for write*/
return flOK;
}
FLStatus getDochTL(TL* tl, FLByte partition)
{
#ifdef FL_MIGRATION_VERSION
actualPartitionNum(&partition, PARTITION_TYPE_BDTL, tl->socketNo);
#endif /*FL_MIGRATION_VERSION*/
tffscpy(tl, &tlTable[partition], sizeof(TL));
return flOK;
}
FLStatus dochMountTL(FLNative partition, FLNative socket)
{
static FLBoolean bStaticArraysInit = FALSE;
IOreq ioreq;
DOCH_PartitionInfo partInfo;
DOCH_Error rc;
TL* tl;
DOCH_Socket* pdev;
/*Initialize static arrays*/
if(!bStaticArraysInit)
{
tffsset(tlRecTable, 0, sizeof(tlRecTable));
tffsset(tlTable, 0, sizeof(tlTable));
bStaticArraysInit = TRUE;
}
DOCH_get_socket(pdev, socket);
/*If socket is not registered, return error*/
if(pdev == NULL)
return flAdapterNotFound;
/*Retrieve partition info*/
tffsset(&partInfo, 0, sizeof(partInfo));
tffsset(&ioreq, 0, sizeof(ioreq));
DOCH_SET_SOCKET_TO_IOREQ_HANDLE(&ioreq, socket);
DOCH_SET_PARTITION_TO_IOREQ_HANDLE(&ioreq, partition);
pdev->bAtaDevNum = 0;
ioreq.irData = &partInfo;
rc = DOCHPartitionInfo(&ioreq);
if(rc != DOCH_OK)
{
#ifdef CHECK_POWER_ON_EVERY_COMMAND
/*In case Power Fail was detected, return DOCH_DeviceTurnedOff*/
if(gDeviceTurnedOff)
{
gDeviceTurnedOff = FALSE;
#ifdef FL_MIGRATION_VERSION
return flSuspendModeDetected;
#else /*FL_MIGRATION_VERSION*/
return DOCH_DeviceTurnedOff;
#endif /*FL_MIGRATION_VERSION*/
}
#endif /*CHECK_POWER_ON_EVERY_COMMAND*/
if(rc == DOCH_ProtectionFault)
return flHWProtection;
return flGeneralFailure;
}
tl = &tlTable[partition];
/*Set tlRec*/
/*=========*/
tlRecTable[partition].partitionNo = partition;
tlRecTable[partition].socketNo = socket;
tlRecTable[partition].virtualSectors = partInfo.nPartitionSize;
tl->rec = &tlRecTable[partition];
/*Allocate 1 sector for mapping*/
/*=============================*/
tl->rec->mappedSector = FL_MALLOC(DOCH_SECTOR_SIZE);
/*Fill TL parameters*/
/*==================*/
tl->cylinders = 0;
tl->heads = 0;
tl->sectorsPerTrack = 0;
tl->recommendedSectorsInCluster = partInfo.wRecommendedSectorsPerCluster;
tl->normalArea_SectorsInUnit_Bits = partInfo.wNormalAreaSectorsInErasableUnit;
tl->riskZoneSectors = 8;
/*Fill TL routines*/
/*================*/
tl->mapSector = dochMapSector;
tl->writeSector = dochWriteSector;
tl->writeMultiSector = dochWriteMultiSector;
tl->readSectors = dochReadSectors;
tl->deleteSector = dochDeleteSector;
tl->tlSetBusy = dochTlSetBusy;
tl->dismount = dochDismount;
tl->defragment = dochDefragment;
tl->checkVolume = dochCheckVolume;
tl->sectorsInVolume = dochSectorsInVolume;
tl->getTLInfo = dochGetTLInfo;
tl->recommendedClusterInfo = dochRecommendedClusterInfo;
tl->readBBT = dochReadBBT;
tl->notifyChange = dochNotifyChange;
tl->completeOperation = dochCompleteOperation;
tl->getLastMappedSectorAddress = dochGetLastMappedSectorAddress;
tl->ensureFreeSectorsInUnit = dochEnsureFreeSectorsInUnit;
return flOK;
}
#ifndef FL_MIGRATION_VERSION
TFFS_DLL_API FLStatus bdCallSureFS(FLFunctionNo functionNo, IOreq FAR2 *ioreq)
{
switch(functionNo)
{
case FL_ABS_MOUNT:
return dochMountTL(FL_GET_FLASH_PARTITION_FROM_HANDLE(ioreq), FL_GET_SOCKET_FROM_HANDLE(ioreq));
case FL_DISMOUNT_VOLUME:
return flOK;
default:
return flFeatureNotSupported;
}
}
TFFS_DLL_API FLStatus NAMING_CONVENTION flInit(void)
{
DOCH_Error rc;
rc = DochSDKInit();
if(rc != DOCH_OK)
{
#ifdef CHECK_POWER_ON_EVERY_COMMAND
/*In case Power Fail was detected, return DOCH_DeviceTurnedOff*/
if(gDeviceTurnedOff)
{
gDeviceTurnedOff = FALSE;
#ifdef FL_MIGRATION_VERSION
return flSuspendModeDetected;
#else /*FL_MIGRATION_VERSION*/
return DOCH_DeviceTurnedOff;
#endif /*FL_MIGRATION_VERSION*/
}
#endif /*CHECK_POWER_ON_EVERY_COMMAND*/
return flBadFunction;
}
return flOK;
}
TFFS_DLL_API void NAMING_CONVENTION flExit(void)
{
doch_release_socket(0);
}
#else /* FL_MIGRATION_VERSION not defined */
/******************************************/
/* Function name : dochDismountTL */
/* Description : */
/* Return type : FLStatus */
/* Argument : FLNative partition */
/******************************************/
FLStatus dochDismountTL(FLNative partition)
{
TL* tl;
tl = &tlTable[partition];
if( tl->rec->mappedSector != NULL )
{
FL_FREE(tl->rec->mappedSector);
tl->rec->mappedSector = NULL;
}
return flOK;
}/* dochDismountTL() */
#endif /*FL_MIGRATION_VERSION*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -