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

📄 tffs_api.c

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