📄 tffs_api.c
字号:
DOCH_PartitionInfo* pPartInfo = (DOCH_PartitionInfo*)dochVol.intermediateBuf;
info->wHeaderLocation = 0;
info->dwVirtualUnits = pPartInfo->nPartitionSize/dochVol.dwVirtualUnitSizeInSectors;
info->dwNormalAreaUnitSize = dochVol.dwVirtualUnitSize;
if(ioreq->irFlags == FL_DISK_PARTITION)
{
info->dwFastAreaVirtualFactor = pPartInfo->wFastAreaFactor;
info->dwFastAreaLogicalUnitSize = dochVol.dwVirtualUnitSize / (1<<pPartInfo->wFastAreaFactor);
info->dwFastUnits = pPartInfo->nFastAreaSize / (info->dwFastAreaLogicalUnitSize>>DOCH_SECTOR_SIZE_BITS);
}
else
{/* binary partition */
#ifdef BDK_ACCESS
info->dwFastAreaVirtualFactor = 0;
info->dwFastAreaLogicalUnitSize = 0;
info->dwFastUnits = 0;
#else /*BDK_ACCESS*/
return flPartitionNotFound;
#endif /*BDK_ACCESS*/
}
info->dwFirstUnit = 0;
info->dwLastUnit = info->dwVirtualUnits;
info->dwPartitionFlags = dwPartitionFlags;
info->dwFirstQuickMountUnit = 0;
info->dwSpareUnits = 0;
info->dwTransferUnits = 0;
info->bMinSectorsForFolding = 0;
info->bMinSectorsForNextWrite = 0;
info->bfastAreaMinSectorsForNextWrite = 0;
/******************************************/
/* Fields that are valid only after mount */
/******************************************/
info->dwUsedUnits = 0;
info->dwFreeUnits = 0;
info->bNeededFreeUnits = 0;
info->dwUMDBBTSector = 0;
}
else
return TFFS_API_RET(specificPartRC);
}/*end of if(partition != FL_EXT_INFO_NO_SPEC_PART)*/
return flOK;
}/*TFFSGetExtendedDiskInfo()*/
#endif /* FL_EXTENDED_DISK_INFO */
/*----------------------------------------------------------------------*/
/* T F F S V o l u m e I n f o */
/* */
/* Get general information about the media. */
/* */
/* Parameters: */
/* irHandle : Socket number (0,1,..) */
/* bits 7-4 - Partition # (zero based) */
/* bits 3-0 - Socket # (zero based) */
/* irData : Address of user buffer to read general */
/* information into. */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/*----------------------------------------------------------------------*/
static FLStatus TFFSVolumeInfo(IOreq* ioreq)
{
DOCH_Error rc;
IOreq myIoreq;
VolumeInfoRecord FAR1 * volumeInfo = (VolumeInfoRecord FAR1 *)ioreq->irData;
FLDword dwPartitionSize;
/*Retrieve specific partition info*/
/*--------------------------------*/
rc = flDOCHPartitionInfo(tffsAPISetIoreq(&myIoreq, ioreq->irHandle, 0,0,dochVol.intermediateBuf,0,0));
if(rc != DOCH_OK)
{
DBG_PRINT_ERR_PRM(FLZONE_API, (FLTXT("TFFSVolumeInfo(): flDOCHPartitionInfo failed with status: 0x%x "), rc));
return (rc==DOCH_ProtectionFault) ? flHWProtection : ((rc==DOCH_PartitionNotFound) ? flBadDriveHandle : TFFS_API_RET(rc));
}
dwPartitionSize = ((DOCH_PartitionInfo*)dochVol.intermediateBuf)->nPartitionSize;
/*Retrieve DOCH extended info structure and calculate unit number if required */
TFFS_API_GET_UNIT_SIZE(myIoreq, ioreq, rc, flStatus);
/* Fill VolumeInfoRecord structure */
/*----------------------------------*/
/*Media Geometry*/
flBuildGeometry( dwPartitionSize, &volumeInfo->cylinders,
&volumeInfo->heads, &volumeInfo->sectors,
FALSE, (FLWord)ioreq->irHandle);
volumeInfo->logicalSectors = dwPartitionSize;
volumeInfo->bootAreaSize = 0;
/* Return window base reg */
/*------------------------*/
tffsAPISetIoreq( &myIoreq,FL_GET_SOCKET_FROM_HANDLE(ioreq),0,0,0,0,0);
rc=flDOCHGetPhysicalAddress(&myIoreq);
if(rc != DOCH_OK)
{
DBG_PRINT_ERR_PRM(FLZONE_API, (FLTXT("TFFSGetPhysicalInfo(): DOCHGetPhysicalAddress failed with status: 0x%x "), rc));
return (DOCH_DiskNotFound==rc) ? flAdapterNotFound : TFFS_API_RET(rc);
}
volumeInfo->baseAddress = myIoreq.irCount;
#ifdef FL_LOW_LEVEL
volumeInfo->flashType = FL_H3;
volumeInfo->dwPhysicalUnitSize = dochVol.dwVirtualUnitSizeInSectors;
volumeInfo->dwPhysicalSize = dochVol.dwUnformattedCapacity;
volumeInfo->DOCType = FL_H3;
volumeInfo->lifeTime= 1; /*1 - indicates fresh media*/
#endif /*FL_LOW_LEVEL*/
tffsset(volumeInfo->driverVer,0,sizeof(volumeInfo->driverVer));
tffscpy(volumeInfo->driverVer,driverVersion,
TFFSMIN(sizeof(volumeInfo->driverVer),sizeof(driverVersion)));
tffsset(volumeInfo->OSAKVer,0,sizeof(volumeInfo->OSAKVer));
tffscpy(volumeInfo->OSAKVer, OSAKVersion,
TFFSMIN(sizeof(volumeInfo->OSAKVer),sizeof(OSAKVersion)));
return flOK;
}/*TFFSVolumeInfo()*/
/*----------------------------------------------------------------------*/
/* T F F S C o u n t V o l u m e s */
/* */
/* Counts the number of volumes on the Flash device. */
/* */
/* Not all the volumes necessarily need to be mounted. A drive formated */
/* with a read protection will be registered but can not be accessed. */
/* */
/* Parameters: */
/* irHandle : Socket number ( 0,1,2... ) */
/* : Partition number ( 0,1,2... ) */
/* */
/* Returns: */
/* irFlags : Number of partitions */
/* FLStatus : 0 on success, otherwise failed */
/*----------------------------------------------------------------------*/
static FLStatus TFFSCountVolumes(IOreq* ioreq)
{
DOCH_Error rc = DOCH_GeneralFailure;
IOreq myIoreq;
FLByte bNumOfPartition;
DOCH_DiskUserAttrWithBinary * pDiskUserAttrWithBinary = (DOCH_DiskUserAttrWithBinary *)(dochVol.intermediateBuf);
/*Retrieve DOCH global info structure*/
/*-------------------------------------*/
rc = flDOCHIdentifyDiskOnChipDevice(tffsAPISetIoreq(&myIoreq, FL_GET_SOCKET_FROM_HANDLE(ioreq),
0,0,dochVol.intermediateBuf, 0,0));
if(rc != DOCH_OK)
{
DBG_PRINT_ERR_PRM(FLZONE_API, (FLTXT("TFFSCountVolumes(): flDOCHIdentifyDiskOnChipDevice failed with status: 0x%x "), rc));
return (rc==DOCH_DiskNotFound)? flUnknownMedia : TFFS_API_RET(rc);
}
bNumOfPartition = (FLByte)((DOCH_DeviceInfo*)dochVol.intermediateBuf)->wTotalNumOfPartitions;
/*Retrieve disk attributes*/
rc = flDOCHGetDiskUserAttributes(tffsAPISetIoreq( &myIoreq, FL_GET_SOCKET_FROM_HANDLE(ioreq), 0,0,
dochVol.intermediateBuf,0,0));
if(rc != DOCH_OK)
{
DBG_PRINT_ERR_PRM(FLZONE_API, (FLTXT("TFFSCountVolumes(): flDOCHGetDiskUserAttributes failed with status: 0x%x"), rc));
return (rc==DOCH_ProtectionFault)?flHWProtection:TFFS_API_RET(rc);
}
bNumOfPartition = bNumOfPartition - pDiskUserAttrWithBinary->bIplPresent -
pDiskUserAttrWithBinary->bOtpPresent - pDiskUserAttrWithBinary->bNumOfBinaryPartitions;
/*Extract # of partitions from Extended Info*/
/*------------------------------------------*/
ioreq->irFlags = bNumOfPartition;
/* fix number of partitions - unformatted device should return 1*/
if( (pDiskUserAttrWithBinary->bNumOfBinaryPartitions==0) &&
(bNumOfPartition==0) )
{
ioreq->irFlags = 1;
}
return flOK;
}/* TFFSCountVolumes() */
/*----------------------------------------------------------------------*/
/* f l S e c t o r s I n V o l u m e */
/* */
/* Returns number of virtual sectors in volume. */
/* */
/* In case the inserted volume is not mounted, returns current status. */
/* */
/* Parameters: */
/* irHandle : Drive number (0, 1, ...) */
/* bits 7-4 - Partition # (zero based) */
/* bits 3-0 - Socket # (zero based) */
/* */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/* irLength : number of virtual sectors in volume */
/*----------------------------------------------------------------------*/
static FLStatus TFFSSectorsInVolume(IOreq* ioreq)
{
DOCH_Error rc = DOCH_OK;
IOreq myIoreq;
/*Retrieve specific partition info*/
/*--------------------------------*/
myIoreq.irHandle = ioreq->irHandle;
myIoreq.irData = dochVol.intermediateBuf;
rc = flDOCHPartitionInfo(tffsAPISetIoreq(&myIoreq, ioreq->irHandle, 0,0,dochVol.intermediateBuf,0,0));
if(rc != DOCH_OK)
{
DBG_PRINT_ERR_PRM(FLZONE_API, (FLTXT("TFFSSectorsInVolume(): flDOCHPartitionInfo failed with status: 0x%x "), rc));
return (rc==DOCH_ProtectionFault) ? flHWProtection : ((rc==DOCH_PartitionNotFound) ? flBadDriveHandle : TFFS_API_RET(rc));
}
ioreq->irLength = ((DOCH_PartitionInfo*)dochVol.intermediateBuf)->nPartitionSize;
return flOK;
}/* TFFSSectorsInVolume */
#ifndef FL_NO_QUICK_MOUNT_FEATURE
/*----------------------------------------------------------------------*/
/* */
/* Quick mount routines are Obsoleted for DOCH */
/* */
/*----------------------------------------------------------------------*/
static FLStatus TFFSClearQuickMountInfo(IOreq* ioreq)
{
return flOK;
}/*TFFSClearQuickMountInfo*/
static FLStatus TFFSWriteQuickMountInfo(IOreq* ioreq)
{
return flOK;
}/*TFFSWriteQuickMountInfo*/
static FLStatus TFFSGetQuickMountStatus(IOreq* ioreq)
{
ioreq->irFlags = FL_ON;
return flOK;
}/*TFFSGetQuickMountStatus*/
#endif /* FL_NO_QUICK_MOUNT_FEATURE */
/********************************************************/
/* */
/* Mount related routines are obsolete for DOCH */
/* Maintained in API only for backward compatibility */
/* */
/********************************************************/
static FLStatus TFFSAbsMountVolume(IOreq* ioreq)
{
FLByte partition;
FLStatus flStatus;
IOreq myIoreq;
DOCH_Error rc;
tffsset(&myIoreq, 0, sizeof(myIoreq));
myIoreq.irHandle = ioreq->irHandle;
myIoreq.irData = dochVol.intermediateBuf;
rc = flDOCHGetDiskUserAttributes(&myIoreq);
if(rc != DOCH_OK)
{
DBG_PRINT_ERR_PRM(FLZONE_API, (FLTXT("TFFSAbsMountVolume(): flDOCHGetDiskUserAttributes failed with status: 0x%x "), rc));
return (rc==DOCH_ProtectionFault)? flHWProtection:TFFS_API_RET(rc);
}
/*Get some data from disk attributes sector*/
if (tffscmp(((DOCH_DiskUserAttrWithBinary*)dochVol.intermediateBuf)->bMigrationSignature,
TFFS_API_MIGRATION_SIGNATURE,
sizeof(((DOCH_DiskUserAttrWithBinary*)dochVol.intermediateBuf)->bMigrationSignature)) != 0)
{
DBG_PRINT_ERR(FLZONE_API, "TFFSAbsMountVolume(): Device is not formated with TrueFFS 7.1. Either reformat the device or run upgrade utility.\n");
return flBadFormat;
}
partition = FL_GET_FLASH_PARTITION_FROM_HANDLE(ioreq);
flStatus = dochMountTL(partition, FL_GET_SOCKET_FROM_HANDLE(ioreq));
if (flStatus == flOK)
{
if(dochVol.mountCount[partition] < 0x64)
dochVol.mountCount[partition]++;
}
return flStatus;
}/*TFFSAbsMountVolume*/
static FLStatus TFFSAbsDismountVolume(IOreq* ioreq)
{
FLByte partition;
FLStatus rc;
partition = FL_GET_FLASH_PARTITION_FROM_HANDLE(ioreq);
if(dochVol.mountCount[partition] == 0)
{
return flNotMounted;
}
if(dochVol.mountCount[partition] > 0)
{
rc = dochDismountTL(partition);
if (rc == flOK)
{
dochVol.mountCount[partition]--;
}
}
else
rc = flNotMounted;
return rc;
}/*TFFSAbsDismountVolume*/
/*----------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -