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

📄 smc_log.c

📁 UCOS-II在VC++6.0环境下的调试及编译
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -