📄 mmcdrvonecard.c
字号:
#include "mmclocal.h"
#include "mem_pptt.h"
#include "HAL_pptt.h"
MMC_STATUS _MMCInitOneCard(MMC_CARD_INFO *cardinfo)
{
U16 i, j, count;
MMC_STATUS ret;
U8 Cidbuff[20];
//------------------------------------------------------
ret=_MMCChectHardwareRevision();
if(ret)
return ret;
ret=_MMCSoftReset();
if(ret)
return ret;
cardinfo->card_adr = 1 ;
cardinfo->type=MMC_TYPE_UNKNOW;
cardinfo->buswidth=1;
ret =_MMCGoIdleState();
if ( ret != 0 )
{
return ret;
}
//--------------------------------------------------------
ret=_MMCAppCmd(0);
//--------------------------------------------------------
if(ret==0)
cardinfo->type=MMC_TYPE_SD;
else
cardinfo->type=MMC_TYPE_MMC;
ret =_MMCGoIdleState();
for ( j = 0 ; j < MMC_ADP_REPEATNUM ; j++ )
{ /*CMD1 ask all cards in idle state to send their operation condition
register contents in the response on CMD line
*/
if(cardinfo->type==MMC_TYPE_SD)
{
ret=_MMCAppCmd(0);
if(ret)
break;
}
if(cardinfo->type==MMC_TYPE_SD)
ret = _SDSendOpCond(SD_CARD_VOLTAGE);
else
ret = _MMCSendOpCond(MMC_CARD_VOLTAGE);
if ( ret == 0 )
{/*--------- WHEN NO ERROR OCCURS (= FINISH INIT)*/
break;
}
if(ret!=MMC_CARD_BUSY)
break; //CMD send ERROR
}
if(ret)
return ret;
//-----------------------------------------------------------
ret=_MMCAllSendCID(Cidbuff);
if(ret)
return ret;
if(cardinfo->type==MMC_TYPE_SD)
ret = _SDGetRelativeAddr(&(cardinfo->card_adr )); //CMD3
else
ret = _MMCSetRelativeAddr(cardinfo->card_adr);
ret=_MMCSelectDeselectCard(cardinfo->card_adr);
if(ret)
return ret;
ret=_MMCSetBlockLen(MMC_BLOCK_SIZE);
if(ret)
return ret;
ret=_MMCSetBusWidth(cardinfo);
if(ret)
return ret;
TRACE("Init Success\n");
return ret;
}
MMC_STATUS _MMCSetBusWidth(MMC_CARD_INFO *cardinfo)
{
U8 *pbuff;
MMC_STATUS ret;
if(cardinfo->type==MMC_TYPE_MMC)
return 0;
pbuff=_MemMalloc(MMC_BLOCK_SIZE);
/* _MMCSetBlockLenReg(SD_SCR_SIZE);
ret=_MMCSetBlockLen(SD_SCR_SIZE);
if(ret)
return;
ret=_MMCAppCmd(cardinfo->card_adr);
if(ret)
return ret;
ret=_SDSendSCR(pbuff);
if(ret)
return ret;
*/
pbuff[1]=0x4;
if(pbuff[1]&0x4)
{
ret=_MMCAppCmd(cardinfo->card_adr);
if(ret==0)
ret=_SDSetBusWidth(0x2);
if(ret)
return ret;
cardinfo->buswidth=pbuff[1]&0xF;
}
_MMCSetBlockLenReg(MMC_BLOCK_SIZE);
ret=_MMCSetBlockLen(MMC_BLOCK_SIZE);
if(ret)
return ret;
/* ret=_MMCAppCmd(cardinfo->card_adr);
if(ret)
return ret;
ret=_SDSendStatus(pbuff);
if(ret)
return ret;
cardinfo->buswidth=(pbuff[511]&0xC0)>>4;
*/
_MemFree(pbuff);
return ret;
}
MMC_STATUS _MMCReadSectOneCard(U32 log_sect, U16 nsects,U8 *buff)
{
MMC_STATUS ret;
_MMCClockSet(0xFF); //set hight speed
_MMCWaitUntilCardReady(&_gCardInfo);
ret = _MMCReadBlock(&_gCardInfo,log_sect*MMC_BLOCK_SIZE, nsects, &buff[0] );
if(ret)
return ret;
if(nsects!=1)
ret=_MMCStopTransmission();
if(ret)
return ret;
_MMCWaitUntilCardReady(&_gCardInfo);
return ret;
}
MMC_STATUS _MMCWriteSectOneCard(U32 log_sect, U16 nsects,U8 *buff)
{
MMC_STATUS ret;
_MMCClockSet(0xFF); //set hight speed
_MMCWaitUntilCardReady(&_gCardInfo);
ret = _MMCWriteBlock(&_gCardInfo,log_sect*MMC_BLOCK_SIZE, nsects, &buff[0] );
if(ret)
return ret;
if(nsects!=1)
ret=_MMCStopTransmission();
if(ret)
return ret;
_MMCWaitUntilCardReady(&_gCardInfo);
return ret;
}
/******************************************************************************
Function Name : MMC_STATUS _MMCWaitUntilCardRead()
Input Parameters : void
Output Parameters: VOID
Value returned : U32 0: Sucessful operation, others: meet Error
Description : Wait till card read
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _MMCWaitUntilCardReady(P_MMC_CARD_INFO pCurrentCardInfo)
{
U32 status=0;
MMC_STATUS ret;
while(!(status&0x100)) ///wait card ready
{
ret=_MMCSendStatus(pCurrentCardInfo->card_adr,&status);
if(ret!=0)
return ret;
}
return 0;
}
/******************************************************************************
Function Name : _MMCTimeSet( U16 *time )
Input Parameters : U16 *time Data/Time buffer
Output Parameters: VOID
Value returned : VOID
Description : Set up time stamp. Dummy data of year/month/date,
hour/minute second.
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCTimeSet( U16 *time )
{
U8 yr, mon, mday, hour, min, sec;
/*----------------------------------------------------------------------*/
/* THIS IS SET AS A FIXED VALUE FOR DEBUGGING NOW. */
/* TIMESTAMP IS A HARDWARE DEPENDENT PART. THIS SHALL BE MODIFIED IN */
/* ACCORDANCE WITH SPECIFIC HARDWARE. */
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* SET 2079/12/31/ 23:59:58 */
/*----------------------------------------------------------------------*/
yr = 79; /* LOWER 2 DIGITS OF YEAR */
mon = 12; /* MONTH:1-12 */
mday = 31; /* DATE:1-31 */
hour = 23; /* HOUR:0-23 */
min = 59; /* MINUTE:0-59 */
sec = 58; /* SECOND:0-59 */
/* CHANGED TO DOS YEAR */
if ( yr >= 80 )
{
/* 1980-1999 */
yr -= 80;
} else {
/* 2000-2079 */
yr += 20;
}
sec = sec >> 1;/* 2 SECONDS UNIT */
*time++ = ( hour << 11 ) | ( min << 5 ) | ( sec );
*time = ( yr << 9 ) | ( mon << 5 ) | ( mday );
}
/******************************************************************************
Function Name : _MMCGetStatus( U8 card_no, MMC_CARD *cardinfo )
Input Parameters : U8 card_no Card Number
MMC_CARD *cardinfo Card Structure
Output Parameters: VOID
Value returned : U32 card change(0:NONE, NO_RESPONSE:YES)
Description : Acquire the card state
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
U32 _MMCGetStatus( U8 card_no, MMC_CARD_INFO *cardinfo )
{
U32 state;
MMC_STATUS ret=_MMCSendStatus(cardinfo->card_adr,&state);
ret&=MMC_STATUS_NOERROR|0xFFFF;
return( ret );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -