📄 smc_log.c
字号:
for(_FS_SMC_WriteBlock[id]=0; _FS_SMC_WriteBlock[id]<_FS_SMC_AssignStart[id][FS__SMC_cardparam[id].Zone?1:0]; _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);
}
_FS_SMC_WriteBlock[id]=NO_ASSIGN;
_FS_SMC_ErrCode[id]=ERR_WriteFault;
return(ERROR);
}
/*********************************************************************
*
* _FS_SMC_Release_ReadBlock
*/
static int _FS_SMC_Release_ReadBlock(FS_u32 id)
{
unsigned int mode;
mode=_FS_SMC_SectCopyMode[id];
_FS_SMC_SectCopyMode[id]=COMPLETED;
if(mode==COMPLETED) return(SUCCESS);
_FS_SMC_Log2Phy[id][FS__SMC_cardparam[id].Zone?1:0][FS__SMC_cardparam[id].LogBlock]=_FS_SMC_WriteBlock[id];
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_ReadBlock[id];
if(FS__SMC_cardparam[id].PhyBlock==NO_ASSIGN)
{ FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id]; return(SUCCESS); }
if(mode==REQ_ERASE) {
if(_FS_SMC_Erase_PhyOneBlock(id)) {
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
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);
} else if(_FS_SMC_MarkFail_PhyOneBlock(id)) return(ERROR);
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Release_WriteBlock
*/
static int _FS_SMC_Release_WriteBlock(FS_u32 id)
{
_FS_SMC_SectCopyMode[id]=COMPLETED;
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
if(_FS_SMC_MarkFail_PhyOneBlock(id)) return(ERROR);
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_ReadBlock[id];
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Copy_BlockAll
*/
static int _FS_SMC_Copy_BlockAll(FS_u32 id,unsigned int mode)
{
unsigned char sect;
sect=FS__SMC_cardparam[id].Sector;
if(_FS_SMC_Assign_WriteBlock(id)) return(ERROR);
if(mode==REQ_FAIL) _FS_SMC_SectCopyMode[id]=REQ_FAIL;
for(FS__SMC_cardparam[id].Sector=0; FS__SMC_cardparam[id].Sector<FS__SMC_cardattrib[id].MaxSectors; FS__SMC_cardparam[id].Sector++)
if(_FS_SMC_Copy_PhyOneSect(id)) {
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
if(_FS_SMC_Release_WriteBlock(id)) return(ERROR);
_FS_SMC_ErrCode[id]=ERR_WriteFault;
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_ReadBlock[id];
FS__SMC_cardparam[id].Sector=sect;
return(ERROR);
}
if(_FS_SMC_Release_ReadBlock(id)) return(ERROR);
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
FS__SMC_cardparam[id].Sector=sect;
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Copy_BlockHead
*/
static int _FS_SMC_Copy_BlockHead(FS_u32 id)
{
unsigned char sect;
sect=FS__SMC_cardparam[id].Sector;
if(_FS_SMC_Assign_WriteBlock(id)) return(ERROR);
for(FS__SMC_cardparam[id].Sector=0; FS__SMC_cardparam[id].Sector<sect; FS__SMC_cardparam[id].Sector++)
if(_FS_SMC_Copy_PhyOneSect(id)) {
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
if(_FS_SMC_Release_WriteBlock(id)) return(ERROR);
_FS_SMC_ErrCode[id]=ERR_WriteFault;
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_ReadBlock[id];
FS__SMC_cardparam[id].Sector=sect;
return(ERROR);
}
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
FS__SMC_cardparam[id].Sector=sect;
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Copy_BlockTail
*/
static int _FS_SMC_Copy_BlockTail(FS_u32 id)
{
unsigned char sect;
for(sect=FS__SMC_cardparam[id].Sector; FS__SMC_cardparam[id].Sector<FS__SMC_cardattrib[id].MaxSectors; FS__SMC_cardparam[id].Sector++)
if(_FS_SMC_Copy_PhyOneSect(id)) {
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
FS__SMC_cardparam[id].Sector=sect;
return(ERROR);
}
if(_FS_SMC_Release_ReadBlock(id)) return(ERROR);
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
FS__SMC_cardparam[id].Sector=sect;
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Reassign_BlockHead
*/
static int _FS_SMC_Reassign_BlockHead(FS_u32 id)
{
unsigned int mode;
unsigned short block;
unsigned char sect;
mode=_FS_SMC_SectCopyMode[id];
block=_FS_SMC_ReadBlock[id];
sect=FS__SMC_cardparam[id].Sector;
if(_FS_SMC_Assign_WriteBlock(id)) return(ERROR);
_FS_SMC_SectCopyMode[id]=REQ_FAIL;
for(FS__SMC_cardparam[id].Sector=0; FS__SMC_cardparam[id].Sector<sect; FS__SMC_cardparam[id].Sector++)
if(_FS_SMC_Copy_PhyOneSect(id)) {
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
if(_FS_SMC_Release_WriteBlock(id)) return(ERROR);
_FS_SMC_ErrCode[id]=ERR_WriteFault;
_FS_SMC_SectCopyMode[id]=mode;
_FS_SMC_WriteBlock[id]=_FS_SMC_ReadBlock[id];
_FS_SMC_ReadBlock[id]=block;
FS__SMC_cardparam[id].Sector=sect;
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
return(ERROR);
}
if(_FS_SMC_Release_ReadBlock(id)) return(ERROR);
_FS_SMC_SectCopyMode[id]=mode;
_FS_SMC_ReadBlock[id]=block;
FS__SMC_cardparam[id].Sector=sect;
FS__SMC_cardparam[id].PhyBlock=_FS_SMC_WriteBlock[id];
return(SUCCESS);
}
/*********************************************************************
*
* _FS_SMC_Media_ReadOneSect
*/
static int _FS_SMC_Media_ReadOneSect(FS_u32 id,unsigned char *buf)
{
unsigned int err, retry;
if(! _FS_SMC_Read_PhyOneSect(id,buf)) return(SUCCESS);
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
if(_FS_SMC_ErrCode[id]==ERR_DataStatus) return(ERROR);
#ifdef RDERR_REASSIGN /***************************************************/
if(FS__SMC_cardattrib[id].Attribute &MWP) {
if(_FS_SMC_ErrCode[id]==ERR_CorReadErr) return(SUCCESS);
return(ERROR);
}
err=_FS_SMC_ErrCode[id];
for(retry=0; retry<2; retry++) {
if(_FS_SMC_Copy_BlockAll(id,(err==ERR_EccReadErr)?REQ_FAIL:REQ_ERASE)) {
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
continue;
}
_FS_SMC_ErrCode[id]=err;
if(_FS_SMC_ErrCode[id]==ERR_CorReadErr) return(SUCCESS);
return(ERROR);
}
#else /*******************************************************************/
if(_FS_SMC_ErrCode[id]==ERR_CorReadErr) return(SUCCESS);
#endif /*******************************************************************/
return(ERROR);
}
/*********************************************************************
*
* _FS_SMC_Media_WriteOneSect
*/
static int _FS_SMC_Media_WriteOneSect(FS_u32 id,unsigned char *buf)
{
unsigned int retry;
if(! _FS_SMC_Write_PhyOneSect(id,buf)) return(SUCCESS);
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
for(retry=1; retry<2; retry++) {
if(_FS_SMC_Reassign_BlockHead(id)) {
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
continue;
}
if(! _FS_SMC_Write_PhyOneSect(id,buf)) return(SUCCESS);
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
}
if(_FS_SMC_Release_WriteBlock(id)) return(ERROR);
_FS_SMC_ErrCode[id]=ERR_WriteFault;
return(ERROR);
}
/*********************************************************************
*
* _FS_SMC_Media_CopyBlockHead
*/
static int _FS_SMC_Media_CopyBlockHead(FS_u32 id)
{
unsigned int retry;
for(retry=0; retry<2; retry++) {
if(! _FS_SMC_Copy_BlockHead(id)) return(SUCCESS);
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
}
return(ERROR);
}
/*********************************************************************
*
* _FS_SMC_Media_CopyBlockTail
*/
static int _FS_SMC_Media_CopyBlockTail(FS_u32 id)
{
unsigned int retry;
if(! _FS_SMC_Copy_BlockTail(id)) return(SUCCESS);
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
for(retry=1; retry<2; retry++) {
if(_FS_SMC_Reassign_BlockHead(id)) {
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
continue;
}
if(! _FS_SMC_Copy_BlockTail(id)) return(SUCCESS);
if(_FS_SMC_ErrCode[id]==ERR_HwError) return(ERROR);
}
if(_FS_SMC_Release_WriteBlock(id)) return(ERROR);
_FS_SMC_ErrCode[id]=ERR_WriteFault;
return(ERROR);
}
/*********************************************************************
*
* Global functions
*
**********************************************************************
*/
/*********************************************************************
*
* FS__SMC_ReadSector
*/
int FS__SMC_ReadSector(FS_u32 id,unsigned long start,unsigned short count,unsigned char *buf)
{
int i;
if(_FS_SMC_Chk_MediaPower(id)) return(_FS_SMC_ErrCode[id]);
if(_FS_SMC_Check_MediaFmt(id)) return(_FS_SMC_ErrCode[id]);
if(_FS_SMC_Conv_MediaAddr(id,start)) return(_FS_SMC_ErrCode[id]);
while(1) {
if(_FS_SMC_Media_ReadOneSect(id,_FS_SMC_SectBuf))
{ _FS_SMC_ErrCode[id]=ERR_EccReadErr; return(_FS_SMC_ErrCode[id]); }
for(i=0;i<SECTSIZE;i++)
*buf++=_FS_SMC_SectBuf[i];
if(--count<=0) break;
if(_FS_SMC_Inc_MediaAddr(id)) return(_FS_SMC_ErrCode[id]);
}
return(NO_ERROR);
}
/*********************************************************************
*
* FS__SMC_WriteSector
*/
int FS__SMC_WriteSector(FS_u32 id,unsigned long start,unsigned short count,unsigned char *buf)
{
int i;
if(_FS_SMC_Chk_MediaPower(id)) return(_FS_SMC_ErrCode[id]);
if(_FS_SMC_Check_MediaFmt(id)) return(_FS_SMC_ErrCode[id]);
if(_FS_SMC_Chk_MediaWP(id)) return(_FS_SMC_ErrCode[id]);
if(_FS_SMC_Conv_MediaAddr(id,start)) return(_FS_SMC_ErrCode[id]);
if(_FS_SMC_Chk_FirstSect(id))
if(_FS_SMC_Media_CopyBlockHead(id))
{ _FS_SMC_ErrCode[id]=ERR_WriteFault; return(_FS_SMC_ErrCode[id]); }
while(1) {
if(! _FS_SMC_Chk_FirstSect(id))
if(_FS_SMC_Assign_WriteBlock(id)) return(_FS_SMC_ErrCode[id]);
for(i=0;i<SECTSIZE;i++)
_FS_SMC_SectBuf[i]=*buf++;
if(_FS_SMC_Media_WriteOneSect(id,_FS_SMC_SectBuf))
{ _FS_SMC_ErrCode[id]=ERR_WriteFault; return(_FS_SMC_ErrCode[id]); }
if(! _FS_SMC_Chk_LastSect(id)) {
if(_FS_SMC_Release_ReadBlock(id))
if(_FS_SMC_ErrCode[id]==ERR_HwError) {
_FS_SMC_ErrCode[id]=ERR_WriteFault;
return(_FS_SMC_ErrCode[id]);
}
}
if(--count<=0) break;
if(_FS_SMC_Inc_MediaAddr(id)) return(_FS_SMC_ErrCode[id]);
}
if(! _FS_SMC_Chk_LastSect(id)) return(NO_ERROR);
if(_FS_SMC_Inc_MediaAddr(id)) return(_FS_SMC_ErrCode[id]);
if(_FS_SMC_Media_CopyBlockTail(id))
{ _FS_SMC_ErrCode[id]=ERR_WriteFault; return(_FS_SMC_ErrCode[id]); }
return(NO_ERROR);
}
/*********************************************************************
*
* FS__SMC_Init
*/
int FS__SMC_Init(FS_u32 id)
{
_FS_SMC_Init_Media(id);
return(NO_ERROR);
}
#endif /* FS_USE_SMC_DRIVER */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -