📄 smc_phy.c
字号:
}
/*********************************************************************
*
* FS__SMC_PHY_ReadSect
*/
int FS__SMC_PHY_ReadSect(FS_u32 id,unsigned char *buf,unsigned char *redundant)
{
_FS_SMC_Set_SsfdcCmd(id,READ);
_FS_SMC_Set_SsfdcAddr(id,EVEN);
#if FS_SMC_HW_SUPPORT_BSYLINE_CHECK
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_READ))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
#else
FS_SMC_HW_X_WaitTimer(id,BUSY_READ);
#endif
_FS_SMC_Read_SsfdcBuf(id,buf,redundant);
#if FS_SMC_HW_SUPPORT_BSYLINE_CHECK
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_READ))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
#else
FS_SMC_HW_X_WaitTimer(id,BUSY_READ);
#endif
if((FS__SMC_cardattrib[id].Attribute &MPS)==PS256) {
_FS_SMC_Set_SsfdcCmd(id,READ);
_FS_SMC_Set_SsfdcAddr(id,ODD);
#if FS_SMC_HW_SUPPORT_BSYLINE_CHECK
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_READ))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
#else
FS_SMC_HW_X_WaitTimer(id,BUSY_READ);
#endif
_FS_SMC_Read_SsfdcBuf(id,buf+0x100,redundant+0x08);
#if FS_SMC_HW_SUPPORT_BSYLINE_CHECK
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_READ))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
#else
FS_SMC_HW_X_WaitTimer(id,BUSY_READ);
#endif
}
_FS_SMC_Set_SsfdcStandby(id);
return(SUCCESS);
}
/*********************************************************************
*
* FS__SMC_PHY_WriteSect
*/
int FS__SMC_PHY_WriteSect(FS_u32 id,unsigned char *buf,unsigned char *redundant)
{
_FS_SMC_Set_SsfdcCmd(id,WRDATA);
_FS_SMC_Set_SsfdcAddr(id,EVEN);
_FS_SMC_Write_SsfdcBuf(id,buf,redundant);
_FS_SMC_Set_SsfdcCmd(id,WRITE);
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_PROG))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
if((FS__SMC_cardattrib[id].Attribute &MPS)==PS256) {
_FS_SMC_Set_SsfdcCmd(id,RDSTATUS);
if(_FS_SMC_Chk_SsfdcStatus(id))
{ _FS_SMC_Set_SsfdcStandby(id); return(SUCCESS); }
_FS_SMC_Set_SsfdcCmd(id,WRDATA);
_FS_SMC_Set_SsfdcAddr(id,ODD);
_FS_SMC_Write_SsfdcBuf(id,buf+0x100,redundant+0x08);
_FS_SMC_Set_SsfdcCmd(id,WRITE);
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_PROG))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
}
_FS_SMC_Set_SsfdcStandby(id);
return(SUCCESS);
}
/*********************************************************************
*
* FS__SMC_PHY_EraseBlock
*/
int FS__SMC_PHY_EraseBlock(FS_u32 id)
{
_FS_SMC_Set_SsfdcCmd(id,ERASE1);
_FS_SMC_Set_SsfdcBlock(id);
_FS_SMC_Set_SsfdcCmd(id,ERASE2);
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_ERASE))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
_FS_SMC_Set_SsfdcStandby(id);
return(SUCCESS);
}
/*********************************************************************
*
* FS__SMC_PHY_ReadRedtData
*/
int FS__SMC_PHY_ReadRedtData(FS_u32 id,unsigned char *redundant)
{
_FS_SMC_Set_SsfdcCmd(id,READ_REDT);
_FS_SMC_Set_SsfdcAddr(id,EVEN);
#if FS_SMC_HW_SUPPORT_BSYLINE_CHECK
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_READ))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
#else
FS_SMC_HW_X_WaitTimer(id,BUSY_READ);
#endif
_FS_SMC_ReadRedt_SsfdcBuf(id,redundant);
#if FS_SMC_HW_SUPPORT_BSYLINE_CHECK
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_READ))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
#else
FS_SMC_HW_X_WaitTimer(id,BUSY_READ);
#endif
if((FS__SMC_cardattrib[id].Attribute &MPS)==PS256) {
_FS_SMC_Set_SsfdcCmd(id,READ_REDT);
_FS_SMC_Set_SsfdcAddr(id,ODD);
#if FS_SMC_HW_SUPPORT_BSYLINE_CHECK
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_READ))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
#else
FS_SMC_HW_X_WaitTimer(id,BUSY_READ);
#endif
_FS_SMC_ReadRedt_SsfdcBuf(id,redundant+0x08);
#if FS_SMC_HW_SUPPORT_BSYLINE_CHECK
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_READ))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
#else
FS_SMC_HW_X_WaitTimer(id,BUSY_READ);
#endif
}
_FS_SMC_Set_SsfdcStandby(id);
return(SUCCESS);
}
/*********************************************************************
*
* FS__SMC_PHY_WriteRedtData
*/
int FS__SMC_PHY_WriteRedtData(FS_u32 id,unsigned char *redundant)
{
_FS_SMC_Set_SsfdcCmd(id,WRDATA);
_FS_SMC_Set_SsfdcAddr(id,EVEN);
_FS_SMC_WriteRedt_SsfdcBuf(id,redundant);
_FS_SMC_Set_SsfdcCmd(id,WRITE);
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_PROG))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
if((FS__SMC_cardattrib[id].Attribute &MPS)==PS256) {
_FS_SMC_Set_SsfdcCmd(id,RDSTATUS);
if(_FS_SMC_Chk_SsfdcStatus(id))
{ _FS_SMC_Set_SsfdcStandby(id); return(SUCCESS); }
_FS_SMC_Set_SsfdcCmd(id,WRDATA);
_FS_SMC_Set_SsfdcAddr(id,ODD);
_FS_SMC_WriteRedt_SsfdcBuf(id,redundant+0x08);
_FS_SMC_Set_SsfdcCmd(id,WRITE);
if(_FS_SMC_Chk_SsfdcBusy(id,BUSY_PROG))
{ _FS_SMC_Reset_SsfdcErr(id); return(ERROR); }
}
_FS_SMC_Set_SsfdcStandby(id);
return(SUCCESS);
}
/*********************************************************************
*
* FS__SMC_PHY_CheckStatus
*/
int FS__SMC_PHY_CheckStatus(FS_u32 id)
{
_FS_SMC_Set_SsfdcCmd(id,RDSTATUS);
if(_FS_SMC_Chk_SsfdcStatus(id))
{ _FS_SMC_Set_SsfdcStandby(id); return(ERROR); }
_FS_SMC_Set_SsfdcStandby(id);
return(SUCCESS);
}
/*********************************************************************
*
* FS__SMC_PHY_Set_Model
*/
int FS__SMC_PHY_Set_Model(FS_u32 id,unsigned char dcode)
{
switch(_FS_SMC_Check_DevCode(dcode)) {
case SSFDC1MB:
FS__SMC_cardattrib[id].Model = SSFDC1MB;
FS__SMC_cardattrib[id].Attribute = FLASH | AD3CYC | BS16 | PS256;
FS__SMC_cardattrib[id].MaxZones = 1;
FS__SMC_cardattrib[id].MaxBlocks = 256;
FS__SMC_cardattrib[id].MaxLogBlocks = 250;
FS__SMC_cardattrib[id].MaxSectors = 8;
break;
case SSFDC2MB:
FS__SMC_cardattrib[id].Model = SSFDC2MB;
FS__SMC_cardattrib[id].Attribute = FLASH | AD3CYC | BS16 | PS256;
FS__SMC_cardattrib[id].MaxZones = 1;
FS__SMC_cardattrib[id].MaxBlocks = 512;
FS__SMC_cardattrib[id].MaxLogBlocks = 500;
FS__SMC_cardattrib[id].MaxSectors = 8;
break;
case SSFDC4MB:
FS__SMC_cardattrib[id].Model = SSFDC4MB;
FS__SMC_cardattrib[id].Attribute = FLASH | AD3CYC | BS16 | PS512;
FS__SMC_cardattrib[id].MaxZones = 1;
FS__SMC_cardattrib[id].MaxBlocks = 512;
FS__SMC_cardattrib[id].MaxLogBlocks = 500;
FS__SMC_cardattrib[id].MaxSectors = 16;
break;
case SSFDC8MB:
FS__SMC_cardattrib[id].Model = SSFDC8MB;
FS__SMC_cardattrib[id].Attribute = FLASH | AD3CYC | BS16 | PS512;
FS__SMC_cardattrib[id].MaxZones = 1;
FS__SMC_cardattrib[id].MaxBlocks = 1024;
FS__SMC_cardattrib[id].MaxLogBlocks = 1000;
FS__SMC_cardattrib[id].MaxSectors = 16;
break;
case SSFDC16MB:
FS__SMC_cardattrib[id].Model = SSFDC16MB;
FS__SMC_cardattrib[id].Attribute = FLASH | AD3CYC | BS32 | PS512;
FS__SMC_cardattrib[id].MaxZones = 1;
FS__SMC_cardattrib[id].MaxBlocks = 1024;
FS__SMC_cardattrib[id].MaxLogBlocks = 1000;
FS__SMC_cardattrib[id].MaxSectors = 32;
break;
case SSFDC32MB:
FS__SMC_cardattrib[id].Model = SSFDC32MB;
FS__SMC_cardattrib[id].Attribute = FLASH | AD3CYC | BS32 | PS512;
FS__SMC_cardattrib[id].MaxZones = 2;
FS__SMC_cardattrib[id].MaxBlocks = 1024;
FS__SMC_cardattrib[id].MaxLogBlocks = 1000;
FS__SMC_cardattrib[id].MaxSectors = 32;
break;
case SSFDC64MB:
FS__SMC_cardattrib[id].Model = SSFDC64MB;
FS__SMC_cardattrib[id].Attribute = FLASH | AD4CYC | BS32 | PS512;
FS__SMC_cardattrib[id].MaxZones = 4;
FS__SMC_cardattrib[id].MaxBlocks = 1024;
FS__SMC_cardattrib[id].MaxLogBlocks = 1000;
FS__SMC_cardattrib[id].MaxSectors = 32;
break;
case SSFDC128MB:
FS__SMC_cardattrib[id].Model = SSFDC128MB;
FS__SMC_cardattrib[id].Attribute = FLASH | AD4CYC | BS32 | PS512;
FS__SMC_cardattrib[id].MaxZones = 8;
FS__SMC_cardattrib[id].MaxBlocks = 1024;
FS__SMC_cardattrib[id].MaxLogBlocks = 1000;
FS__SMC_cardattrib[id].MaxSectors = 32;
break;
default:
FS__SMC_cardattrib[id].Model = NOSSFDC;
return(ERROR);
}
return(SUCCESS);
}
/*********************************************************************
*
* FS__SMC_PHY_Cnt_Reset
*/
void FS__SMC_PHY_Cnt_Reset(FS_u32 id)
{
FS_SMC_HW_X_SetStandby(id);
FS_SMC_HW_X_VccOff(id);
}
/*********************************************************************
*
* FS__SMC_PHY_Cnt_PowerOn
*/
int FS__SMC_PHY_Cnt_PowerOn(FS_u32 id)
{
FS_SMC_HW_X_VccOn(id);
FS_SMC_HW_X_WaitTimer(id,TIME_PON);
if(FS_SMC_HW_X_ChkPower(id))
return(SUCCESS);
FS_SMC_HW_X_VccOff(id);
return(ERROR);
}
/*********************************************************************
*
* FS__SMC_PHY_Chk_CntPower
*/
int FS__SMC_PHY_Chk_CntPower(FS_u32 id)
{
if(FS_SMC_HW_X_ChkPower(id))
return(SUCCESS); /* Power On */
return(ERROR); /* Power Off */
}
/*********************************************************************
*
* FS__SMC_PHY_Chk_CardExist
*/
int FS__SMC_PHY_Chk_CardExist(FS_u32 id)
{
char i,j,k;
if(! FS_SMC_HW_X_ChkStatus(id)) /***** Not Status Change *****/
if(FS_SMC_HW_X_ChkCardIn(id)) return(SUCCESS); /* Card exist in Slot */
for(i=0,j=0,k=0; i<0x10; i++) {
if(FS_SMC_HW_X_ChkCardIn(id)) /***** Status Change *****/
{ j++; k=0; }
else { j=0; k++; }
if(j>3) return(SUCCESS); /* Card exist in Slot */
if(k>3) return(ERROR); /* NO Card exist in Slot */
FS_SMC_HW_X_WaitTimer(id,TIME_CDCHK);
}
return(ERROR);
}
/*********************************************************************
*
* FS__SMC_PHY_Chk_CardStsChg
*/
int FS__SMC_PHY_Chk_CardStsChg(FS_u32 id)
{
if(FS_SMC_HW_X_ChkStatus(id))
return(ERROR); /* Status Change */
return(SUCCESS); /* Not Status Change */
}
/*********************************************************************
*
* FS__SMC_PHY_Chk_WP
*/
int FS__SMC_PHY_Chk_WP(FS_u32 id)
{ /* ERROR: WP, SUCCESS: Not WP */
char i;
for(i=0; i<0x08; i++) {
if(FS_SMC_HW_X_ChkWP(id))
return(ERROR);
FS_SMC_HW_X_WaitTimer(id,TIME_WPCHK);
}
return(SUCCESS);
}
#endif /* FS_USE_SMC_DRIVER */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -