📄 smc_log.c
字号:
break;
}
}
while(FS__SMC_cardparam[id].Sector<FS__SMC_cardattrib[id].MaxSectors) {
if(FS__SMC_cardparam[id].Sector)
if(FS__SMC_PHY_ReadRedtData(id,_FS_SMC_Redundant))
{ FS__SMC_PHY_Reset(id); return(ERROR); }
if(! _FS_SMC_Chk_DataStatus(_FS_SMC_Redundant)) {
if(FS__SMC_PHY_ReadSect(id,_FS_SMC_WorkBuf,_FS_SMC_Redundant))
{ FS__SMC_PHY_Reset(id); return(ERROR); }
if(FS__SMC_ECC_Chk_CISdata(_FS_SMC_WorkBuf,_FS_SMC_Redundant))
{ FS__SMC_PHY_Reset(id); return(ERROR); }
*pcis=FS__SMC_cardparam[id].PhyBlock;
FS__SMC_PHY_Reset(id);
return(SUCCESS);
}
FS__SMC_cardparam[id].Sector++;
}
FS__SMC_PHY_Reset(id);
return(ERROR);
}
/*********************************************************************
*
* _FS_SMC_Make_LogTable
*/
static int _FS_SMC_Make_LogTable(FS_u32 id,unsigned short start)
{
unsigned short block;
FS__SMC_cardparam[id].Sector=0;
/*****/
for(FS__SMC_cardparam[id].LogBlock=0; FS__SMC_cardparam[id].LogBlock<FS__SMC_cardattrib[id].MaxLogBlocks; FS__SMC_cardparam[id].LogBlock++)
_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock]=NO_ASSIGN;
for(FS__SMC_cardparam[id].PhyBlock=0; FS__SMC_cardparam[id].PhyBlock<(MAX_BLOCKNUM/8); FS__SMC_cardparam[id].PhyBlock++)
_FS_SMC_Assign[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].PhyBlock]=0x00;
/*******************************************************************/
for(FS__SMC_cardparam[id].PhyBlock=0; FS__SMC_cardparam[id].PhyBlock<FS__SMC_cardattrib[id].MaxBlocks; FS__SMC_cardparam[id].PhyBlock++) {
if((! FS__SMC_cardparam[id].Zone) && (FS__SMC_cardparam[id].PhyBlock<start)) {
Set_X_Bit(_FS_SMC_Assign[id][FS__SMC_cardparam[id].Zone?1:0],FS__SMC_cardparam[id].PhyBlock);
continue;
}
if(FS__SMC_PHY_ReadRedtData(id,_FS_SMC_Redundant))
{ FS__SMC_PHY_Reset(id); return(ERROR); }
if(! _FS_SMC_Chk_DataBlank(_FS_SMC_Redundant))
continue;
Set_X_Bit(_FS_SMC_Assign[id][FS__SMC_cardparam[id].Zone?1:0],FS__SMC_cardparam[id].PhyBlock);
if(_FS_SMC_Chk_FailBlock(_FS_SMC_Redundant))
continue;
if(_FS_SMC_Load_LogBlockAddr(id,_FS_SMC_Redundant))
continue;
if(FS__SMC_cardparam[id].LogBlock>=FS__SMC_cardattrib[id].MaxLogBlocks)
continue;
if(_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock]==NO_ASSIGN) {
_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock]=FS__SMC_cardparam[id].PhyBlock;
continue;
}
FS__SMC_cardparam[id].Sector=FS__SMC_cardattrib[id].MaxSectors-1;
if(FS__SMC_PHY_ReadRedtData(id,_FS_SMC_Redundant))
{ FS__SMC_PHY_Reset(id); return(ERROR); }
FS__SMC_cardparam[id].Sector=0;
block=FS__SMC_cardparam[id].LogBlock;
if(! _FS_SMC_Load_LogBlockAddr(id,_FS_SMC_Redundant))
if(FS__SMC_cardparam[id].LogBlock==block) {
#ifdef L2P_ERR_ERASE /***************************************************/
block=_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock];
_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock]=FS__SMC_cardparam[id].PhyBlock;
FS__SMC_cardparam[id].PhyBlock=block;
if(!(FS__SMC_cardattrib[id].Attribute &MWP)) {
FS__SMC_PHY_Reset(id);
if(FS__SMC_PHY_EraseBlock(id)) return(ERROR);
if(FS__SMC_PHY_CheckStatus(id))
{ if(_FS_SMC_MarkFail_PhyOneBlock(id)) return(ERROR); }
else Clr_X_Bit(_FS_SMC_Assign[id][FS__SMC_cardparam[id].Zone?1:0],FS__SMC_cardparam[id].PhyBlock);
}
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock];
#else /*******************************************************************/
_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock]=FS__SMC_cardparam[id].PhyBlock;
#endif /*******************************************************************/
continue;
}
#ifdef L2P_ERR_ERASE /***************************************************/
if(!(FS__SMC_cardattrib[id].Attribute &MWP)) {
FS__SMC_PHY_Reset(id);
if(FS__SMC_PHY_EraseBlock(id)) return(ERROR);
if(FS__SMC_PHY_CheckStatus(id))
{ if(_FS_SMC_MarkFail_PhyOneBlock(id)) return(ERROR); }
else Clr_X_Bit(_FS_SMC_Assign[id][FS__SMC_cardparam[id].Zone?1:0],FS__SMC_cardparam[id].PhyBlock);
}
#endif /*******************************************************************/
}
_FS_SMC_AssignStart[id][FS__SMC_cardparam[id].Zone?1:0]=0;
/*****/
FS__SMC_PHY_Reset(id);
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Check_MediaFmt
*/
static int _FS_SMC_Check_MediaFmt(FS_u32 id)
{
unsigned short cis;
if(! _FS_SMC_MediaChange[id]) return(SUCCESS);
_FS_SMC_MediaChange[id]=(unsigned int) ERROR;
_FS_SMC_SectCopyMode[id]=COMPLETED;
if(_FS_SMC_Set_PhyFmtValue(id))
{ _FS_SMC_ErrCode[id]=ERR_UnknownMedia; return(ERROR); }
if(_FS_SMC_Search_CIS(id,&cis))
{ _FS_SMC_ErrCode[id]=ERR_IllegalFmt; return(ERROR); }
_FS_SMC_AssignZone[id]=0;
FS__SMC_cardparam[id].Zone=0;
if(_FS_SMC_Make_LogTable(id,cis+1))
{ _FS_SMC_ErrCode[id]=ERR_IllegalFmt; return(ERROR); }
_FS_SMC_MediaChange[id]=SUCCESS;
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Conv_MediaAddr
*/
static int _FS_SMC_Conv_MediaAddr(FS_u32 id,unsigned long addr)
{
unsigned long temp;
unsigned short block;
unsigned char sect;
temp =addr/FS__SMC_cardattrib[id].MaxSectors;
FS__SMC_cardparam[id].Sector =addr%FS__SMC_cardattrib[id].MaxSectors;
FS__SMC_cardparam[id].LogBlock=temp%FS__SMC_cardattrib[id].MaxLogBlocks;
FS__SMC_cardparam[id].Zone =temp/FS__SMC_cardattrib[id].MaxLogBlocks;
if(FS__SMC_cardparam[id].Zone<FS__SMC_cardattrib[id].MaxZones) {
if(FS__SMC_cardparam[id].Zone!=0 && FS__SMC_cardparam[id].Zone!=_FS_SMC_AssignZone[id]) {
_FS_SMC_AssignZone[id]=0;
block=FS__SMC_cardparam[id].LogBlock;
sect=FS__SMC_cardparam[id].Sector;
if(_FS_SMC_Make_LogTable(id,0))
{ _FS_SMC_ErrCode[id]=ERR_IllegalFmt; return(ERROR); }
_FS_SMC_AssignZone[id]=FS__SMC_cardparam[id].Zone;
FS__SMC_cardparam[id].LogBlock=block;
FS__SMC_cardparam[id].Sector=sect;
}
_FS_SMC_Clr_RedundantData(_FS_SMC_Redundant);
_FS_SMC_Set_LogBlockAddr(id,_FS_SMC_Redundant);
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock];
return(SUCCESS);
}
_FS_SMC_ErrCode[id]=ERR_OutOfLBA;
return(ERROR);
}
/*********************************************************************
*
* _FS_SMC_Inc_MediaAddr
*/
static int _FS_SMC_Inc_MediaAddr(FS_u32 id)
{
unsigned short block;
unsigned char sect;
if(++FS__SMC_cardparam[id].Sector<FS__SMC_cardattrib[id].MaxSectors)
return(SUCCESS);
FS__SMC_cardparam[id].Sector=0;
if(++FS__SMC_cardparam[id].LogBlock<FS__SMC_cardattrib[id].MaxLogBlocks) {
_FS_SMC_Clr_RedundantData(_FS_SMC_Redundant);
_FS_SMC_Set_LogBlockAddr(id,_FS_SMC_Redundant);
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock];
return(SUCCESS);
}
FS__SMC_cardparam[id].LogBlock=0;
if(++FS__SMC_cardparam[id].Zone<FS__SMC_cardattrib[id].MaxZones) {
if(FS__SMC_cardparam[id].Zone!=_FS_SMC_AssignZone[id]) {
_FS_SMC_AssignZone[id]=0;
block=FS__SMC_cardparam[id].LogBlock;
sect=FS__SMC_cardparam[id].Sector;
if(_FS_SMC_Make_LogTable(id,0))
{ _FS_SMC_ErrCode[id]=ERR_IllegalFmt; return(ERROR); }
_FS_SMC_AssignZone[id]=FS__SMC_cardparam[id].Zone;
FS__SMC_cardparam[id].LogBlock=block;
FS__SMC_cardparam[id].Sector=sect;
}
_FS_SMC_Clr_RedundantData(_FS_SMC_Redundant);
_FS_SMC_Set_LogBlockAddr(id,_FS_SMC_Redundant);
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock];
return(SUCCESS);
}
FS__SMC_cardparam[id].Zone=0;
_FS_SMC_ErrCode[id]=ERR_OutOfLBA;
return(ERROR);
}
/*********************************************************************
*
* _FS_SMC_Chk_FirstSect
*/
static int _FS_SMC_Chk_FirstSect(FS_u32 id)
{
if(! FS__SMC_cardparam[id].Sector)
return(SUCCESS);
return(ERROR);
}
/*********************************************************************
*
* _FS_SMC_Chk_LastSect
*/
static int _FS_SMC_Chk_LastSect(FS_u32 id)
{
if(FS__SMC_cardparam[id].Sector<(FS__SMC_cardattrib[id].MaxSectors-1))
return(ERROR);
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Copy_PhyOneSect
*/
static int _FS_SMC_Copy_PhyOneSect(FS_u32 id)
{
int i;
unsigned int err, retry;
if(_FS_SMC_ReadBlock[id]!=NO_ASSIGN) {
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_ReadBlock[id];
for(retry=0; retry<2; retry++) {
err=SUCCESS;
if(FS__SMC_PHY_ReadSect(id,_FS_SMC_WorkBuf,_FS_SMC_WorkRedund))
{ _FS_SMC_ErrCode[id]=ERR_HwError; return(ERROR); }
if(_FS_SMC_Chk_DataStatus(_FS_SMC_WorkRedund))
{ err=(unsigned int) ERROR; break; }
err=FS__SMC_ECC_Chk_ECCdata(_FS_SMC_WorkBuf,_FS_SMC_WorkRedund);
if(err==CORRECT) break;
if(! err) break;
_FS_SMC_SectCopyMode[id]=REQ_FAIL;
}
} else {
err=SUCCESS;
for(i=0; i<SECTSIZE; i++)
_FS_SMC_WorkBuf[i]=DUMMY_DATA;
_FS_SMC_Clr_RedundantData(_FS_SMC_WorkRedund);
}
_FS_SMC_Set_LogBlockAddr(id,_FS_SMC_WorkRedund);
if(err==CORRECT)
FS__SMC_ECC_Set_ECCdata(_FS_SMC_WorkBuf,_FS_SMC_WorkRedund);
if(err==(unsigned int)ERROR) {
FS__SMC_ECC_Set_ECCdata(_FS_SMC_WorkBuf,_FS_SMC_WorkRedund);
_FS_SMC_Set_DataStatus(_FS_SMC_WorkRedund);
}
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
if(FS__SMC_PHY_WriteSect(id,_FS_SMC_WorkBuf,_FS_SMC_WorkRedund))
{ _FS_SMC_ErrCode[id]=ERR_HwError; return(ERROR); }
if(FS__SMC_PHY_CheckStatus(id))
{ _FS_SMC_ErrCode[id]=ERR_WriteFault; return(ERROR); }
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_ReadBlock[id];
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Read_PhyOneSect
*/
static int _FS_SMC_Read_PhyOneSect(FS_u32 id,unsigned char *buf)
{
int i;
unsigned int err, retry;
if(FS__SMC_cardparam[id].PhyBlock==NO_ASSIGN) {
for(i=0; i<SECTSIZE; i++)
*buf++=DUMMY_DATA;
return(SUCCESS);
}
for(retry=0; retry<2; retry++) {
if(FS__SMC_PHY_ReadSect(id,buf,_FS_SMC_Redundant))
{ _FS_SMC_ErrCode[id]=ERR_HwError; return(ERROR); }
if(_FS_SMC_Chk_DataStatus(_FS_SMC_Redundant))
{ _FS_SMC_ErrCode[id]=ERR_DataStatus; return(ERROR); }
if(! (err=FS__SMC_ECC_Chk_ECCdata(buf,_FS_SMC_Redundant)))
return(SUCCESS);
}
if(err==CORRECT)
_FS_SMC_ErrCode[id]=ERR_CorReadErr;
else _FS_SMC_ErrCode[id]=ERR_EccReadErr;
return(ERROR);
}
/*********************************************************************
*
* _FS_SMC_Write_PhyOneSect
*/
static int _FS_SMC_Write_PhyOneSect(FS_u32 id,unsigned char *buf)
{
FS__SMC_ECC_Set_ECCdata(buf,_FS_SMC_Redundant);
if(FS__SMC_PHY_WriteSect(id,buf,_FS_SMC_Redundant))
{ _FS_SMC_ErrCode[id]=ERR_HwError; return(ERROR); }
if(FS__SMC_PHY_CheckStatus(id))
{ _FS_SMC_ErrCode[id]=ERR_WriteFault; return(ERROR); }
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Erase_PhyOneBlock
*/
static int _FS_SMC_Erase_PhyOneBlock(FS_u32 id)
{
if(FS__SMC_PHY_EraseBlock(id))
{ _FS_SMC_ErrCode[id]=ERR_HwError; return(ERROR); }
if(FS__SMC_PHY_CheckStatus(id))
{ _FS_SMC_ErrCode[id]=ERR_WriteFault; return(ERROR); }
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Assign_WriteBlock
*/
static int _FS_SMC_Assign_WriteBlock(FS_u32 id)
{
_FS_SMC_ReadBlock[id]=FS__SMC_cardparam[id].PhyBlock;
for(_FS_SMC_WriteBlock[id]=_FS_SMC_AssignStart[id][FS__SMC_cardparam[id].Zone?1:0]; _FS_SMC_WriteBlock[id]<FS__SMC_cardattrib[id].MaxBlocks; _FS_SMC_WriteBlock[id]++)
if(! Chk_X_Bit(_FS_SMC_Assign[id][FS__SMC_cardparam[id].Zone?1:0],_FS_SMC_WriteBlock[id])) {
Set_X_Bit(_FS_SMC_Assign[id][FS__SMC_cardparam[id].Zone?1:0],_FS_SMC_WriteBlock[id]);
_FS_SMC_AssignStart[id][FS__SMC_cardparam[id].Zone?1:0]=_FS_SMC_WriteBlock[id]+1;
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
_FS_SMC_SectCopyMode[id]=REQ_ERASE;
return(SUCCESS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -