⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tffs_api.c

📁 电子盘DEMO板程序
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -