📄 smilmain.c
字号:
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 + -