📄 tffs_api.c
字号:
#define TFFS_API_RET(rc) flGeneralFailure
#endif /*CHECK_POWER_ON_EVERY_COMMAND*/
#define TFFS_API_GET_UNIT_SIZE(myIoreq, ioreq, dochStatus, flStatus){\
DOCH_DeviceInfo * pDevInfo = (DOCH_DeviceInfo*)dochVol.intermediateBuf;\
dochStatus = flDOCHIdentifyDiskOnChipDevice(tffsAPISetIoreq(&myIoreq, FL_GET_SOCKET_FROM_HANDLE(ioreq), 0,0,dochVol.intermediateBuf, 0,0));\
if(dochStatus != DOCH_OK){\
DBG_PRINT_ERR_PRM(FLZONE_API, (FLTXT("flDOCHIdentifyDiskOnChipDevice failed with status: 0x%x "),dochStatus));\
return (dochStatus==DOCH_DiskNotFound)? flUnknownMedia:TFFS_API_RET(dochStatus);}\
dochVol.dwUnformattedCapacity = pDevInfo->dwUnformattedCapacity;\
dochVol.dwVirtualUnitSizeInSectors = (pDevInfo->dwUnitSize!=0) ? pDevInfo->dwUnitSize : (dochVol.dwUnformattedCapacity>>9);\
dochVol.dwVirtualUnitSize = ((dochVol.dwVirtualUnitSizeInSectors)<<DOCH_SECTOR_SIZE_BITS);\
dochVol.dwNumOfUnits = (dochVol.dwUnformattedCapacity / dochVol.dwVirtualUnitSizeInSectors);}
#define TFFS_API_RET_PART_FLSTATUS(rc, flDefaultStatus)\
switch(rc){\
case DOCH_ProtectionFault: return flHWProtection;\
case DOCH_PartitionLimitExceeded: return flSectorNotFound;\
case DOCH_PartitionNotFound: return flPartitionNotFound;\
case DOCH_BadParameter: return flBadParameter;\
default: return flDefaultStatus;}
#define TFFS_API_SET_MIG_STD_PART_PRMS(pPartitionFormatInfoAPI, protectionType)\
pPartitionFormatInfoAPI->dwOtpEnabled = (protectionType & CHANGEABLE_PROTECTION) ? TRUE : FALSE;\
pPartitionFormatInfoAPI->dwPartitionType = DOCH_PRT_TYPE_NORMAL;\
pPartitionFormatInfoAPI->dwPerformanceControl = DOCH_NORMAL_PERFORMANCE;\
pPartitionFormatInfoAPI->dwPageSizeExp = DOCH_PAGE_SIZE_512B;\
pPartitionFormatInfoAPI->dwHashType = DOCH_HASH_TYPE_SHA1;\
pPartitionFormatInfoAPI->dwEncryptionType = DOCH_ENCRYPT_NONE;\
pPartitionFormatInfoAPI->dwMasterControl = DOCH_PART_ACCESS_MODE_FULL;\
pPartitionFormatInfoAPI->dwMaxNumOfAuthAttempts = DOCH_MAX_PWD_ATTEMPTS;
/*********************/
/* Static functions */
/*********************/
static FLStatus tffsApiAuthPartition(IOreq * myIoreq, IOreq * ioreq, FLByte bPartNo, FLByte * pKey, FLWord wKeyLen);
static FLStatus tffsApiAddOtpIPL(FLBoolean bIPL, IOreq * myIoreq, IOreq * ioreq);
static FLStatus tffsFormatSetProtectionAttribs(FLByte bProtType, DOCH_PartitionFormatInfoAPI* pPartitionFormatInfoAPI, FLByte * bKey, FLWord wKeyLen);
static IOreq * tffsAPISetIoreq(IOreq * pIoreq, FLHandle irHandle, FLDword irFlags, void* irPath, void * irData, FLSDword irLength, FLSDword irCount);
/*----------------------------------------------------------------------*/
/* Function name : actualPartitionNum*/
/* Description : */
/* Return type : FLStatus */
/* Argument : FLByte* partNum*/
/* Argument : FLByte partitionType*/
/*----------------------------------------------------------------------*/
FLStatus actualPartitionNum(FLByte* partNum, FLByte partitionType, FLSDword sdwSocketNo)
{
DOCH_Socket* pDev;
DOCH_get_socket(pDev, sdwSocketNo);
if( pDev==NULL )
return flBadParameter;
switch(partitionType)
{
case PARTITION_TYPE_IPL:
break;
case PARTITION_TYPE_BDTL:
*partNum += (dochVol.numOfBinaryPartitions + (dochVol.iplExists + dochVol.otpExists));
break;
case PARTITION_TYPE_BINARY:
#ifdef BDK_ACCESS
*partNum += (dochVol.iplExists + dochVol.otpExists);
break;
#else /*BDK_ACCESS*/
return flPartitionNotFound;
#endif /*BDK_ACCESS*/
case PARTITION_TYPE_OTP:
break;
default:
break;
}
if( (*partNum) == 0 )
return flOK;
if( ((*partNum) >= DOCH_MAX_PARTITIONS) || ((*partNum) >=pDev->wTotalNumOfPartitions) )
return flPartitionNotFound;
return flOK;
}/*actualPartitionNum()*/
#ifdef FL_EXTENDED_DISK_INFO
/*----------------------------------------------------------------------*/
/* T F F S E x t e n d e d G e t D i s k I n f o */
/* */
/* Returns general information about the Device and a specific partition */
/* */
/* Parameters: */
/* irHandle : Drive number (0, 1, ...) */
/* bits 7-4 - Must be set to 0 */
/* bits 3-0 - Socket # (zero based) */
/* irCount : Partition number */
/* irFlags : Either FL_BDK_PARTITION or FL_DISK_PARTITION */
/* irData : Address of FLExtendedDiskInfo structure */
/* irLength : Floor number to access - FL_ALL_FLOORS */
/* */
/* Returns: */
/* FLStatus : 0 on success, otherwise failed */
/*----------------------------------------------------------------------*/
static FLStatus TFFSGetExtendedDiskInfo(IOreq* ioreq)
{
DOCH_Error rc;
FLStatus flStatus;
DOCH_Error specificPartRC = DOCH_PartitionNotFound;
DOCH_Error iplRC = DOCH_PartitionNotFound;
IOreq myIoreq;
FLExtendedDiskInfo FAR1 * info = (FLExtendedDiskInfo FAR1 *)ioreq->irData;
FLDword dwIPLSize;
FLByte bNumOfBinaryPartitions, partition;
FLWord wTotalNumOfPartitions;
FLDword dwPartitionFlags = 0;
DOCH_DeviceInfo * pDochDevInfo = (DOCH_DeviceInfo*)dochVol.intermediateBuf;
DOCH_DiskUserAttrWithBinary * pDiskUserAttrWithBinary = (DOCH_DiskUserAttrWithBinary*)dochVol.intermediateBuf;
DOCH_PartitionUserAttrWithBinary* pPartUserAttrWithBinary = (DOCH_PartitionUserAttrWithBinary*)dochVol.intermediateBuf;
DOCH_Socket * pDev;
DOCH_get_socket(pDev, FL_GET_SOCKET_FROM_HANDLE(ioreq));
/*Retrieve DOCH extended 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("TFFSGetExtendedDiskInfo(): flDOCHIdentifyDiskOnChipDevice failed with status: %d "), rc));
return (rc==DOCH_DiskNotFound)? flUnknownMedia:TFFS_API_RET(rc);
}
TFFS_API_GET_UNIT_SIZE(myIoreq,ioreq, rc, flStatus);
wTotalNumOfPartitions = pDochDevInfo->wTotalNumOfPartitions;
/* Retrieve Disk User 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("TFFSGetExtendedDiskInfo(): flDOCHGetDiskUserAttributes failed with status: 0x%x "),rc));
return (rc==DOCH_ProtectionFault)?flHWProtection:flBadFormat; /* if not protected -> like media header not found */
}
/* Check if device is not formatted */
if( (! pDiskUserAttrWithBinary->bIplPresent) && (! pDiskUserAttrWithBinary->bOtpPresent) )
{
/*Fill only relevant fields*/
info->dwTLType = 0;
info->dwFormatFlags = 0;
info->dwTrueFFSVersion = 0;
info->dwFlashTechnology = 0;
info->dwType = FL_H3;
info->dwSubType = 0;
info->bMediaType = 0;
info->bNoOfFloors = (FLByte)pDev->wNumOfDevices;
info->bNoOfPlanes = DOCH_NUM_OF_PLANES;
info->bNoOfBanks = DOCH_NUM_OF_BANKS;
info->bDataBusWidth = 16; /*DOCH always uses 16bit*/
info->bSectorsPerPage = DOCH_SECTORS_PER_PAGE;
info->bSharedSectors = DOCH_SHARED_SECTORS;
info->bFastAreaSharedSectors = 0;
info->bMaxRelatedSectors = 0;
info->dwIPLSize = 0;
info->bChangeableProtectedAreas = 0;
info->btotalProtectedAreas = 0;
info->dwUnitsInFirstFloor = 0;
info->dwUnitSize = dochVol.dwVirtualUnitSize;
info->dwMaxBadPercentage = 0;
info->bNoOfBinaryPartitions = 0;
info->bNoOfDiskPartitions = 0;
info->bBlockMultiplierBits = 0;
info->dwPercentUsed = 0;
info->bHeaderUnits = 0;
info->wHeaderLocation = 0;
/* Programmer name and version strings */
/* Retrieve from disk attributes*/
tffscpy(info->bProgrammerNamePtr, pDiskUserAttrWithBinary->bProgrammerName, sizeof(FLDword));
tffscpy(info->bProgrammerVersionPtr, pDiskUserAttrWithBinary->bProgrammerVersion, sizeof(FLDword));
tffscpy(&info->dwTrueFFSVersion, pDiskUserAttrWithBinary->bTFFSVersion, sizeof(FLDword));
DBG_PRINT_ERR(FLZONE_API, "TFFSGetExtendedDiskInfo(): device NOT formatted \r\n");
return flBadFormat/*flFeatureNotSupported*/;
}
wTotalNumOfPartitions = wTotalNumOfPartitions - pDiskUserAttrWithBinary->bIplPresent -
pDiskUserAttrWithBinary->bOtpPresent;
bNumOfBinaryPartitions = pDiskUserAttrWithBinary->bNumOfBinaryPartitions;
/* Programmer name and version strings */
tffscpy(&info->bProgrammerNamePtr[0], pDiskUserAttrWithBinary->bProgrammerName,
sizeof(pDiskUserAttrWithBinary->bProgrammerName));
tffscpy(&info->bProgrammerVersionPtr[0], pDiskUserAttrWithBinary->bProgrammerVersion,
sizeof(pDiskUserAttrWithBinary->bProgrammerVersion));
tffscpy(&info->dwTrueFFSVersion, pDiskUserAttrWithBinary->bTFFSVersion,
sizeof(pDiskUserAttrWithBinary->bTFFSVersion));
/*Retrieve IPL partition size*/
/*---------------------------*/
iplRC = flDOCHPartitionInfo(tffsAPISetIoreq(&myIoreq,FL_GET_SOCKET_FROM_HANDLE(ioreq) + (DOCH_IPL_PARTITION_NUM << 4),
0,0,dochVol.intermediateBuf,0,0));
if(iplRC != DOCH_OK)
{
DBG_PRINT_ERR_PRM(FLZONE_API, (FLTXT("TFFSGetExtendedDiskInfo(): flDOCHPartitionInfo of IPL partition failed with status: 0x%x "), rc));
return (iplRC==DOCH_ProtectionFault)?flHWProtection:flBadFormat; /* if not protected, but fails -> like bad format */
}
dwIPLSize = ((DOCH_PartitionInfo*)dochVol.intermediateBuf)->nPartitionSize << DOCH_SECTOR_SIZE_BITS;
/* Fill FLExtendedDiskInfo structure */
/*--------------------------------------*/
/******************************************/
/* Fields that belong to the entire media */
/******************************************/
info->dwTLType = 0;
info->dwFormatFlags = 0;
info->dwTrueFFSVersion = 0;
info->dwFlashTechnology = 0;
info->dwType = FL_H3;
info->dwSubType = 0;
info->bMediaType = 0;
info->bNoOfFloors = (FLByte)pDev->wNumOfDevices;
info->bNoOfPlanes = DOCH_NUM_OF_PLANES;
info->bNoOfBanks = DOCH_NUM_OF_BANKS;
info->bDataBusWidth = 16; /*DOCH always uses 16bit*/
info->bSectorsPerPage = DOCH_SECTORS_PER_PAGE;
info->bSharedSectors = DOCH_SHARED_SECTORS;
info->bFastAreaSharedSectors = 0;
info->bMaxRelatedSectors = 0;
info->dwIPLSize = dwIPLSize;
info->bChangeableProtectedAreas = 2;
info->btotalProtectedAreas = 2;
info->dwUnitsInFirstFloor = 0;
info->dwUnitSize = dochVol.dwVirtualUnitSize;
info->dwMaxBadPercentage = 0;
info->bNoOfBinaryPartitions = bNumOfBinaryPartitions;
info->bNoOfDiskPartitions = wTotalNumOfPartitions - bNumOfBinaryPartitions;
info->bBlockMultiplierBits = 0;
info->dwPercentUsed = 0;
info->bHeaderUnits = 0;
info->wHeaderLocation = 0;
/*Retrieve specific partition info
Note that the specific partition is always a BDTL partition
Hence jumping over IPL/OTP/Binary Partition
-------------------------------------------*/
partition = (FLByte)ioreq->irCount;
if(partition != FL_EXT_INFO_NO_SPEC_PART)
{
if(ioreq->irFlags == FL_DISK_PARTITION)
flStatus = actualPartitionNum(&partition, PARTITION_TYPE_BDTL, FL_GET_SOCKET_FROM_HANDLE(ioreq));
else if(ioreq->irFlags == FL_BDK_PARTITION)
{
#ifdef BDK_ACCESS
flStatus = actualPartitionNum(&partition, PARTITION_TYPE_BINARY, FL_GET_SOCKET_FROM_HANDLE(ioreq));
#else /*BDK_ACCESS*/
return flPartitionNotFound;
#endif /*BDK_ACCESS*/
}
if( flStatus!=flOK )
{
DBG_PRINT_ERR(FLZONE_API, "TFFSGetExtendedDiskInfo(): specific partition NOT FOUND \r\n");
return flStatus;
}
specificPartRC = flDOCHGetParitionUserAttributes(tffsAPISetIoreq(&myIoreq, FL_GET_SOCKET_FROM_HANDLE(ioreq) + (partition << 4),
0,0,dochVol.intermediateBuf,0,0));
if(specificPartRC != DOCH_OK)
{
DBG_PRINT_ERR(FLZONE_API, "TFFSGetExtendedDiskInfo(): specific partition NOT FOUND \r\n");
return (specificPartRC==DOCH_ProtectionFault)? flHWProtection : flBadDriveHandle;
}
if ((ioreq->irFlags == FL_DISK_PARTITION) && (pPartUserAttrWithBinary->bType != PARTITION_TYPE_BDTL))
{
DBG_PRINT_ERR(FLZONE_API, "TFFSGetExtendedDiskInfo(): Partition is not BDTL partition. \r\n");
return flGeneralFailure;
}
#ifdef BDK_ACCESS
if ((ioreq->irFlags == FL_BDK_PARTITION) && (pPartUserAttrWithBinary->bType != PARTITION_TYPE_BINARY))
{
DBG_PRINT_ERR(FLZONE_API, "TFFSGetExtendedDiskInfo(): Partition is not BDK partition. \r\n");
return flGeneralFailure;
}
if( pPartUserAttrWithBinary->bType == PARTITION_TYPE_BINARY )
dwPartitionFlags = pPartUserAttrWithBinary->binPartHeader.dwPartitionFlags;
#endif /*BDK_ACCESS*/
specificPartRC = flDOCHPartitionInfo(tffsAPISetIoreq( &myIoreq, FL_GET_SOCKET_FROM_HANDLE(ioreq) + (partition << 4),
0, 0, dochVol.intermediateBuf, 0, 0));
/* Check if partition exists */
if(specificPartRC == DOCH_PartitionNotFound)
{
DBG_PRINT_ERR(FLZONE_API, "TFFSGetExtendedDiskInfo(): specific partition NOT FOUND \r\n");
return flBadDriveHandle;
}
/************************************************/
/* Fields that belong to the specific partition */
/************************************************/
if(specificPartRC == DOCH_OK)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -