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

📄 smilmain.c

📁 ertfs文件系统里面既有完整ucos程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	default:
		*c= 0; *h= 0; *s= 0;
		ErrCode=ERR_NoSmartMedia;
		return(ERROR);
	}
	return(SUCCESS);
}
/***************************************************************************
Power Controll & Media Exist Check Subroutine
***************************************************************************/
void Initialize$Media(void)
{
	ErrCode=NO_ERROR;
	MediaChange=ERROR;
	SectCopyMode=COMPLETED;
	Cnt$Reset();
}
void PowerOff$Media(void)
{
	Cnt$PowerOff();
}
int Check$MediaPower(void)
{
	if(Check$CardStsChg()) MediaChange=ERROR;
	if((! Check$CntPower())&&(! MediaChange)) return(SUCCESS);
	if(Check$CardExist())
		{ ErrCode=ERR_NoSmartMedia; MediaChange=ERROR; return(ERROR); }
	if(Cnt$PowerOn())
		{ ErrCode=ERR_NoSmartMedia; MediaChange=ERROR; return(ERROR); }
	Ssfdc$Reset();
	return(SUCCESS);
}
int Check$MediaExist(void)
{
	if(Check$CardStsChg()) MediaChange=ERROR;
	if(! Check$CardExist()) {
		if(! MediaChange) return(SUCCESS);
		ErrCode=ERR_ChangedMedia;
		return(ERROR);
	}
	ErrCode=ERR_NoSmartMedia;
	return(ERROR);
}
int Check$MediaWP(void)
{
	if(Ssfdc.Attribute &MWP)
	{ ErrCode=ERR_WrtProtect; return(ERROR); }
	return(SUCCESS);
}
/***************************************************************************
SmartMedia Physical Format Test Subroutine
***************************************************************************/
int Check$MediaFmt(void)
{
	if(! MediaChange) return(SUCCESS);
	MediaChange=ERROR;
	SectCopyMode=COMPLETED;
	if(Set$PhyFmtValue())
		{ ErrCode=ERR_UnknownMedia; return(ERROR); }
	if(Search$CIS())
		{ ErrCode=ERR_IllegalFmt; return(ERROR); }
	if(Make$LogTable())
		{ ErrCode=ERR_IllegalFmt; return(ERROR); }
	MediaChange=SUCCESS;
	return(SUCCESS);
}
int Check$MediaFmtForEraseAll(void)
{
	MediaChange=ERROR;
	SectCopyMode=COMPLETED;
	if(Set$PhyFmtValue())
	{ ErrCode=ERR_UnknownMedia; return(ERROR); }
	if(Search$CIS())
	{ ErrCode=ERR_IllegalFmt; return(ERROR); }
	return(SUCCESS);
}
/***************************************************************************
SmartMedia Physical Address Controll Subroutine
***************************************************************************/
int Conv$MediaAddr(unsigned long addr)
{
	unsigned long temp;
	temp =addr/Ssfdc.MaxSectors;
	Media.Sector =(unsigned char)(addr%Ssfdc.MaxSectors);
	Media.LogBlock=(unsigned short)(temp%Ssfdc.MaxLogBlocks);
	Media.Zone =(unsigned char)(temp/Ssfdc.MaxLogBlocks);
	if(Media.Zone<Ssfdc.MaxZones) {
		Clr$RedundantData(Redundant);
		Set$LogBlockAddr(Redundant);
		Media.PhyBlock=Log2Phy[Media.Zone][Media.LogBlock];
		return(SUCCESS);
	}
	ErrCode=ERR_OutOfLBA;
	return(ERROR);
}
int Inc$MediaAddr(void)
{
	if(++Media.Sector<Ssfdc.MaxSectors)
		return(SUCCESS);
	Media.Sector=0;
	if(++Media.LogBlock<Ssfdc.MaxLogBlocks) {
		Clr$RedundantData(Redundant);
		Set$LogBlockAddr(Redundant);//keep Redundant with current Block
		Media.PhyBlock=Log2Phy[Media.Zone][Media.LogBlock];
		return(SUCCESS);
	}
	Media.LogBlock=0;
	if(++Media.Zone<Ssfdc.MaxZones) {
		Clr$RedundantData(Redundant);
		Set$LogBlockAddr(Redundant);
		Media.PhyBlock=Log2Phy[Media.Zone][Media.LogBlock];
		return(SUCCESS);
	}
	Media.Zone=0;
	ErrCode=ERR_OutOfLBA;
	return(ERROR);
}
/***************************************************************************/
int Check$FirstSect(void)
{
	if(! Media.Sector)
		return(SUCCESS);
	return(ERROR);
}
int Check$LastSect(void)
{
	if(Media.Sector<(Ssfdc.MaxSectors-1))
		return(ERROR);
	return(SUCCESS);
}
/***************************************************************************
SmartMedia Read/Write Subroutine with Retry
***************************************************************************/
int Media$ReadOneSect(unsigned char *buf)
{
	unsigned int err, retry;
	if(! Read$PhyOneSect(buf)) return(SUCCESS);
	if(ErrCode==ERR_HwError) return(ERROR);
	if(ErrCode==ERR_DataStatus) return(ERROR);
#ifdef RDERR_REASSIGN /***************************************************/
	if(Ssfdc.Attribute &MWP) {
		if(ErrCode==ERR_CorReadErr) return(SUCCESS);
		return(ERROR);
	}
	err=ErrCode;
	for(retry=0; retry<2; retry++) {
		if(Copy$BlockAll((err==ERR_EccReadErr)?REQ_FAIL:REQ_ERASE)) {
			if(ErrCode==ERR_HwError) return(ERROR);
			continue;
		}
		ErrCode=err;
		if(ErrCode==ERR_CorReadErr) return(SUCCESS);
		return(ERROR);
	}
	MediaChange=ERROR;
#else /*******************************************************************/
	if(ErrCode==ERR_CorReadErr) return(SUCCESS);
#endif /*******************************************************************/
	return(ERROR);
}
int Media$WriteOneSect(unsigned char *buf)
{
	unsigned int retry;
	if(! Write$PhyOneSect(buf)) return(SUCCESS);
	if(ErrCode==ERR_HwError) return(ERROR);
	for(retry=1; retry<2; retry++) {
		if(Reassign$BlockHead()) {
			if(ErrCode==ERR_HwError) return(ERROR);
			continue;
		}
		if(! Write$PhyOneSect(buf)) return(SUCCESS);
		if(ErrCode==ERR_HwError) return(ERROR);
	}
	if(Release$WriteBlock()) return(ERROR);
	ErrCode=ERR_WriteFault;
	MediaChange=ERROR;
	return(ERROR);
}
/***************************************************************************
SmartMedia Data Copy Subroutine with Retry
***************************************************************************/
int Media$CopyBlockHead(void)
{
	unsigned int retry;
	for(retry=0; retry<2; retry++) {
		if(! Copy$BlockHead()) return(SUCCESS);
		if(ErrCode==ERR_HwError) return(ERROR);
	}
	MediaChange=ERROR;
	return(ERROR);
}
/***************************************************************************/
int Media$CopyBlockTail(void)
{
	unsigned int retry;
	if(! Copy$BlockTail()) return(SUCCESS);
	if(ErrCode==ERR_HwError) return(ERROR);
	for(retry=1; retry<2; retry++) {
		if(Reassign$BlockHead()) {
			if(ErrCode==ERR_HwError) return(ERROR);
			continue;
		}
		if(! Copy$BlockTail()) return(SUCCESS);
		if(ErrCode==ERR_HwError) return(ERROR);
	}
	if(Release$WriteBlock()) return(ERROR);
	ErrCode=ERR_WriteFault;
	MediaChange=ERROR;
	return(ERROR);
}
/***************************************************************************/
int Media$EraseOneBlock(void)
{
	if(Media.PhyBlock==NO_ASSIGN) return(SUCCESS);
	Log2Phy[Media.Zone][Media.LogBlock]=NO_ASSIGN;
	if(Erase$PhyOneBlock()) {
		if(ErrCode==ERR_HwError) return(ERROR);
		if(MarkFail$PhyOneBlock()) return(ERROR);
		ErrCode=ERR_WriteFault;
		return(ERROR);
	}
	Clr$Bit(Assign[Media.Zone],Media.PhyBlock);
	Media.PhyBlock=NO_ASSIGN;
	return(SUCCESS);
}
/***************************************************************************
SmartMedia Erase Subroutine
***************************************************************************/
int Media$EraseAllBlock(void)
{
	/* do not erase CIS block */
	unsigned short cis=0;
	
	MediaChange=ERROR;
	Media.Sector=0;
	for(Media.Zone=0; Media.Zone<Ssfdc.MaxZones; Media.Zone++)
		for(Media.PhyBlock=0; Media.PhyBlock<Ssfdc.MaxBlocks; Media.PhyBlock++) {
			if(Ssfdc$ReadRedtData(Redundant))
				{ Ssfdc$Reset(); return(ERROR); }
			Ssfdc$Reset();
			if(! Check$FailBlock(Redundant)) {
				if(cis) {
					if(Ssfdc$EraseBlock())
						{ ErrCode=ERR_HwError; return(ERROR); }
					if(Ssfdc$CheckStatus())
						{ if(MarkFail$PhyOneBlock()) return(ERROR); }
					continue;
				}
				if(Media.PhyBlock!=CisArea.PhyBlock)
					{ ErrCode=ERR_IllegalFmt; return(ERROR); }
				cis++;
			}
		}
	return(SUCCESS);
}
/***************************************************************************
SmartMedia Physical Sector Data Copy Subroutine
***************************************************************************/
static int Copy$BlockAll(unsigned int mode)
{
	unsigned char sect;
	sect=Media.Sector;
	if(Assign$WriteBlock()) return(ERROR);
	if(mode==REQ_FAIL) SectCopyMode=REQ_FAIL;
	for(Media.Sector=0; Media.Sector<Ssfdc.MaxSectors; Media.Sector++)
		if(Copy$PhyOneSect()) {
			if(ErrCode==ERR_HwError) return(ERROR);
			if(Release$WriteBlock()) return(ERROR);
			ErrCode=ERR_WriteFault;
			Media.PhyBlock=ReadBlock;
			Media.Sector=sect;
			return(ERROR);
		}
		if(Release$ReadBlock()) return(ERROR);
		Media.PhyBlock=WriteBlock;
		Media.Sector=sect;
		return(SUCCESS);
}
static int Copy$BlockHead(void)
{
	unsigned char sect;
	sect=Media.Sector;
	if(Assign$WriteBlock()) return(ERROR);
	for(Media.Sector=0; Media.Sector<sect; Media.Sector++)
		if(Copy$PhyOneSect()) {
			if(ErrCode==ERR_HwError) return(ERROR);
			if(Release$WriteBlock()) return(ERROR);
			ErrCode=ERR_WriteFault;
			Media.PhyBlock=ReadBlock;
			Media.Sector=sect;
			return(ERROR);
		}
	Media.PhyBlock=WriteBlock;
	Media.Sector=sect;
	return(SUCCESS);
}
static int Copy$BlockTail(void)
{
	unsigned char sect;
	for(sect=Media.Sector; Media.Sector<Ssfdc.MaxSectors; Media.Sector++)
		if(Copy$PhyOneSect()) {
			if(ErrCode==ERR_HwError) return(ERROR);
			Media.PhyBlock=WriteBlock;
			Media.Sector=sect;
			return(ERROR);
		}
	if(Release$ReadBlock()) return(ERROR);
	Media.PhyBlock=WriteBlock;
	Media.Sector=sect;
	return(SUCCESS);
}
static int Reassign$BlockHead(void)
{
	unsigned int mode;
	unsigned short block;
	unsigned char sect;
	mode=SectCopyMode;
	block=ReadBlock;
	sect=Media.Sector;
	if(Assign$WriteBlock()) return(ERROR);
	SectCopyMode=REQ_FAIL;
	for(Media.Sector=0; Media.Sector<sect; Media.Sector++)
		if(Copy$PhyOneSect()) {
			if(ErrCode==ERR_HwError) return(ERROR);
			if(Release$WriteBlock()) return(ERROR);
			ErrCode=ERR_WriteFault;
			SectCopyMode=mode;
			WriteBlock=ReadBlock;
			ReadBlock=block;
			Media.Sector=sect;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -