📄 sdmmc.c
字号:
#if (USE_SD)
#if (USE_SPI || USE_SPI_EMULATION)
selectChip( RCA );
/* Make sure the device is ready for next command */
if ( !checkCardBusy(0xFF) )
resErr = MMC_CARD_IS_BUSY;
deSelectChip( RCA );
#endif
#endif
#endif /* (USE_MMC || USE_MMC_EMULATION) */
pc->error_code = (UINT16)resErr;
return resErr;
}
#endif /* (USE_SD || USE_MMC || USE_MMC_EMULATION) */
#endif /* (USE_MULTI) */
/************************************************************************************
* Name: mmcEraseSectors
*
* Description:
* Erases a sector range on the card. The rane must be within
* a single erase group.
*
* Input:
* PDEVICE_CONTROLLER pc
* UINT16 RCA Card address.
* ULONG Start Adsress of first sector in the erase range.
* ULONG End Address of the last sector in the erase range.
* ULONG untag Adress of one sector in the range to skip (not erase)
*
* Output:
* None
*
* Returns:
* Completion code
*
************************************************************************************/
MMC_CC mmcEraseSectors ( PDEVICE_CONTROLLER pc,
UINT16 RCA,
ULONG start,
ULONG end,
ULONG untag )
{
MMC_CC resErr;
#if (USE_SPI || USE_SPI_EMULATION)
selectChip( RCA );
#else /* This is for MMC */
/* Set the card to transfer state */
resErr = mmcSetXferState( pc, RCA );
#endif
/* START */
resErr = mmcCommandAndResponse ( pc,
(start << 9),
TAG_SECTOR_START,
0,
R1 );
if ( resErr == MMC_NO_ERROR )
{
/* END */
resErr = mmcCommandAndResponse ( pc,
(end << 9),
TAG_SECTOR_END,
0,
R1 );
}
if ( resErr == MMC_NO_ERROR )
{
/* UNTAG */
if (untag)
{
resErr = mmcCommandAndResponse ( pc,
(untag << 9),
UNTAG_SECTOR,
0,
R1 );
}
}
if ( resErr == MMC_NO_ERROR )
{
/* ERASE */
resErr = mmcCommandAndResponse ( pc,
0L,
ERASE_SECTORS,
0,
R1 );
}
#if (USE_SPI || USE_SPI_EMULATION)
/* DeSelect the card */
deSelectChip( RCA );
#endif
pc->error_code = (UINT16)resErr;
return (resErr);
}
/***********************************************************************************
* Name: mmcEraseGroup
*
* Description:
* Erases an erase group range on the card.
*
* Input:
* PDEVICE_CONTROLLER pc
* RCA Card address.
* Start Adsress of first earse group in the erase range.
* End Address of the last erase group in the erase range.
* untag Adress of one earse group in the range to skip (not erase)
*
* Output:
* None.
*
* Returns:
* Completion code.
*
************************************************************************************/
MMC_CC mmcEraseGroup( PDEVICE_CONTROLLER pc,
UINT16 RCA,
ULONG start,
ULONG end,
ULONG untag )
{
MMC_CC resErr;
#if (USE_SPI || USE_SPI_EMULATION)
selectChip( RCA );
#else /* This is for MMC */
/* Set the card to transfer state */
resErr = mmcSetXferState( pc, RCA );
#endif
/* START */
resErr = mmcCommandAndResponse ( pc,
(start << 13),
TAG_ERASE_GROUP_START,
0,
R1 );
if ( resErr == MMC_NO_ERROR )
{
/* END */
resErr = mmcCommandAndResponse ( pc,
(end << 13),
TAG_ERASE_GROUP_END,
0,
R1 );
}
if ( resErr == MMC_NO_ERROR )
{
/* UNTAG */
if(untag)
{
resErr = mmcCommandAndResponse ( pc,
(untag << 13),
UNTAG_ERASE_GROUP,
0,
R1 );
}
}
if ( resErr == MMC_NO_ERROR )
{
/* ERASE */
resErr = mmcCommandAndResponse ( pc,
0L,
ERASE_SECTORS,
0,
R1 );
}
#if (USE_SPI || USE_SPI_EMULATION)
/* DeSelect the card */
deSelectChip( RCA );
#endif
pc->error_code = (UINT16)resErr;
return (resErr);
}
/***********************************************************************************
* Name: mmcErase
*
* Description:
* Erases a sector range on the card.
*
* Input:
* PDEVICE_CONTROLLER pc
* UINT16 RCA Device address
* ULONG Start Adsress of first sector in the erase range.
* ULONG End Address of the last sector in the erase range.
*
* Output:
* None.
*
* Returns:
* Completion code.
*
************************************************************************************/
MMC_CC mmcErase( PDEVICE_CONTROLLER pc,
UINT16 RCA,
ULONG start,
ULONG end )
{
ULONG numSectStartGR, numSectEndGR;
ULONG S_EraseGroup, E_EraseGroup;
MMC_CC resErr;
/* START PARAMETERS */
numSectStartGR = DEFAULT_ERASE_GROUP - (start % DEFAULT_ERASE_GROUP);
/* END PARAMETERS */
numSectEndGR = end % DEFAULT_ERASE_GROUP;
S_EraseGroup = start / DEFAULT_ERASE_GROUP;
E_EraseGroup = end / DEFAULT_ERASE_GROUP;
if ( (E_EraseGroup - S_EraseGroup) > 1 )
{
if (numSectStartGR)
{
S_EraseGroup += 1;
resErr = mmcEraseSectors( pc,
RCA,
start,
(start + numSectStartGR),
0 );
if ( resErr )
{
pc->error_code = (UINT16)resErr;
return resErr;
}
}
if (numSectEndGR)
{
E_EraseGroup -= 1;
resErr = mmcEraseSectors( pc,
RCA,
(end - numSectEndGR + 1),
end,
0 );
if ( resErr )
{
pc->error_code = (UINT16)resErr;
return resErr;
}
}
resErr = mmcEraseGroup( pc,
RCA,
S_EraseGroup,
E_EraseGroup,
0 );
if ( resErr )
{
pc->error_code = (UINT16)resErr;
return resErr;
}
}
else if ((E_EraseGroup - S_EraseGroup) < 1)
{
resErr = mmcEraseSectors( pc,
RCA,
start,
end,
0 );
if ( resErr )
{
pc->error_code = (UINT16)resErr;
return resErr;
}
}
else if ((E_EraseGroup - S_EraseGroup) == 1)
{
if ( numSectStartGR )
{
resErr = mmcEraseSectors( pc,
RCA,
start,
(start + numSectStartGR),
0 );
if ( resErr )
{
pc->error_code = (UINT16)resErr;
return resErr;
}
}
if (numSectEndGR)
{
resErr = mmcEraseSectors( pc,
RCA,
(end - numSectEndGR + 1),
end,
0 );
if ( resErr )
{
pc->error_code = (UINT16)resErr;
return resErr;
}
}
}
pc->error_code = MMC_NO_ERROR;
return (MMC_NO_ERROR);
}
/***********************************************************************************
* Name: mmcGetStatus
*
* Description:
* Retrieves the card current status.
*
* Input:
* PDEVICE_CONTROLLER pc Pointer to the controller structure
* UINT16 RCA Card address.
*
* Output:
* status A 32 bit status word. Error/status bits.
*
* Returns:
* Completion code
*
************************************************************************************/
MMC_CC mmcGetStatus ( PDEVICE_CONTROLLER pc, UINT16 RCA)
{
MMC_CC resErr;
#if (USE_MMC || USE_MMC_EMULATION)
resErr = mmcCommandAndResponse ( pc,
(((ULONG)RCA) << 16),
SEND_STATUS,
0,
R1 );
#else
selectChip ( RCA );
resErr = mmcCommandAndResponse ( pc,
0L,
SEND_STATUS,
0,
R2 );
deSelectChip( RCA );
#endif
pc->error_code = (UINT16)resErr;
return (resErr);
}
#if (USE_SPI || USE_SPI_EMULATION)
#if (USE_SET_FEATURES)
/***********************************************************************************
* Name: mmcTurnCRCOnOff - (SPI mode only)
*
* Description:
* Turns the CRC option ON or OFF.
*
* Input:
* PDEVICE_CONTROLLER pc Pointer to the controller structure
* UINT16 opt Enable/Disable CRC feature
* - 1, turns the option ON.
* - 0, turns the option OFF.
* UINT16 RCA Card address.
*
* Output:
* None.
*
* Returns:
* Completion code
*
************************************************************************************/
MMC_CC mmcTurnCRCOnOff( PDEVICE_CONTROLLER pc, UINT16 RCA, UINT16 opt )
{
MMC_CC resErr;
selectChip ( RCA );
resErr = mmcCommandAndResponse ( pc,
(ULONG)opt,
CRC_ON_OFF,
0,
R1 );
deSelectChip ( RCA );
pc->error_code = (UINT16)resErr;
return (resErr);
}
#endif /* (USE_SET_FEATURES) */
#endif /* (USE_SPI || USE_SPI_EMULATION) */
/*********************************************************************************
* Name: mmedia_io
*
* Description:
* Read/write handler. Single and multiple READ/WRITE are supported.
*
* Input:
* INT16 driveno
* ULONG sector
* UCHAR *buffer
* UCOUNT scount
* INT16 op
*
* Output:
*
* Return:
*
**********************************************************************************/
MMC_CC mmedia_io( INT16 driveno, ULONG sector, UCHAR *buffer, UCOUNT scount, INT16 op ) /*__fn__*/
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -