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

📄 dochtl.c

📁 H3 M-system NAND flash driver in Linux OS, M-DOC driver
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -